49#ifndef OR_TOOLS_CONSTRAINT_SOLVER_CONSTRAINT_SOLVERI_H_
50#define OR_TOOLS_CONSTRAINT_SOLVER_CONSTRAINT_SOLVERI_H_
57#include <initializer_list>
63#include "absl/container/flat_hash_map.h"
64#include "absl/strings/str_cat.h"
99class LocalSearchMonitor;
139 enum { CHUNK_SIZE = 16 };
142 const Chunk*
const next_;
143 explicit Chunk(
const Chunk*
next) : next_(
next) {}
151 : chunk_(l->chunks_), value_(l->
Last()) {}
152 bool ok()
const {
return (value_ !=
nullptr); }
156 if (value_ == chunk_->data_ + CHUNK_SIZE) {
157 chunk_ = chunk_->next_;
158 value_ = chunk_ ? chunk_->data_ :
nullptr;
170 if (pos_.
Value() == 0) {
171 Chunk*
const chunk = s->UnsafeRevAlloc(
new Chunk(chunks_));
173 reinterpret_cast<void*
>(chunk));
178 chunks_->data_[pos_.
Value()] = val;
183 if (chunks_ ==
nullptr ||
LastValue() != val) {
190 return chunks_ ? &chunks_->data_[pos_.
Value()] :
nullptr;
198 return chunks_->data_[pos_.
Value()];
204 chunks_->data_[pos_.
Value()] = v;
227 a = (
a + 0x7ed55d16) + (
a << 12);
228 a = (
a ^ 0xc761c23c) ^ (
a >> 19);
229 a = (
a + 0x165667b1) + (
a << 5);
230 a = (
a + 0xd3a2646c) ^ (
a << 9);
231 a = (
a + 0xfd7046c5) + (
a << 3);
232 a = (
a ^ 0xb55a4f09) ^ (
a >> 16);
242inline uint64_t
Hash1(
void*
const ptr) {
243#if defined(__x86_64__) || defined(_M_X64) || defined(__powerpc64__) || \
245 return Hash1(
reinterpret_cast<uint64_t
>(ptr));
247 return Hash1(
reinterpret_cast<uint32_t
>(ptr));
252uint64_t
Hash1(
const std::vector<T*>& ptrs) {
253 if (ptrs.empty())
return 0;
254 if (ptrs.size() == 1)
return Hash1(ptrs[0]);
256 for (
int i = 1; i < ptrs.size(); ++i) {
262inline uint64_t
Hash1(
const std::vector<int64_t>& ptrs) {
263 if (ptrs.empty())
return 0;
264 if (ptrs.size() == 1)
return Hash1(ptrs[0]);
266 for (
int i = 1; i < ptrs.size(); ++i) {
274template <
class K,
class V>
279 array_(solver->UnsafeRevAllocArray(new Cell*[initial_size])),
282 memset(array_, 0,
sizeof(*array_) * size_.
Value());
292 Cell* tmp = array_[code];
294 if (tmp->key() == key) {
307 Cell* tmp = array_[code];
309 if (tmp->key() == key) {
314 return default_value;
319 const int position =
Hash1(key) % size_.
Value();
321 solver_->UnsafeRevAlloc(
new Cell(key,
value, array_[position]));
323 reinterpret_cast<void*
>(cell));
324 num_items_.
Incr(solver_);
333 Cell(
const K& key,
const V&
value, Cell*
const next)
334 : key_(key), value_(
value), next_(
next) {}
336 void SetRevNext(Solver*
const solver, Cell*
const next) {
337 solver->SaveAndSetValue(
reinterpret_cast<void**
>(&next_),
338 reinterpret_cast<void*
>(
next));
341 Cell*
next()
const {
return next_; }
343 const K& key()
const {
return key_; }
345 const V&
value()
const {
return value_; }
354 Cell**
const old_cell_array = array_;
355 const int old_size = size_.
Value();
358 reinterpret_cast<void**
>(&array_),
359 reinterpret_cast<void*
>(
360 solver_->UnsafeRevAllocArray(
new Cell*[size_.
Value()])));
361 memset(array_, 0, size_.
Value() *
sizeof(*array_));
362 for (
int i = 0; i < old_size; ++i) {
363 Cell* tmp = old_cell_array[i];
364 while (tmp !=
nullptr) {
365 Cell*
const to_reinsert = tmp;
367 const uint64_t new_position =
Hash1(to_reinsert->key()) % size_.
Value();
368 to_reinsert->SetRevNext(solver_, array_[new_position]);
370 reinterpret_cast<void**
>(&array_[new_position]),
371 reinterpret_cast<void*
>(to_reinsert));
376 Solver*
const solver_;
378 NumericalRev<int> size_;
379 NumericalRev<int> num_items_;
449 void Save(
Solver*
const solver,
int offset);
451 const int64_t length_;
488 const int64_t columns_;
502 : constraint_(
ct), method_(method), name_(
name) {}
506 void Run(
Solver*
const s)
override { (constraint_->*method_)(); }
509 return "CallMethod_" + name_ +
"(" + constraint_->DebugString() +
")";
513 T*
const constraint_;
514 void (T::*
const method_)();
515 const std::string name_;
520 const std::string&
name) {
526 return absl::StrCat(param);
532 return param->DebugString();
536template <
class T,
class P>
541 : constraint_(
ct), method_(method), name_(
name), param1_(param1) {}
545 void Run(
Solver*
const s)
override { (constraint_->*method_)(param1_); }
548 return absl::StrCat(
"CallMethod_", name_,
"(", constraint_->DebugString(),
553 T*
const constraint_;
554 void (T::*
const method_)(P);
555 const std::string name_;
559template <
class T,
class P>
561 const std::string&
name, P param1) {
566template <
class T,
class P,
class Q>
580 (constraint_->*method_)(param1_, param2_);
584 return absl::StrCat(absl::StrCat(
"CallMethod_", name_),
585 absl::StrCat(
"(", constraint_->DebugString()),
591 T*
const constraint_;
592 void (T::*
const method_)(P, Q);
593 const std::string name_;
598template <
class T,
class P,
class Q>
600 void (T::*method)(P, Q),
const std::string&
name,
601 P param1, Q param2) {
606template <
class T,
class P,
class Q,
class R>
610 P param1, Q param2, R param3)
621 (constraint_->*method_)(param1_, param2_, param3_);
625 return absl::StrCat(absl::StrCat(
"CallMethod_", name_),
626 absl::StrCat(
"(", constraint_->DebugString()),
633 T*
const constraint_;
634 void (T::*
const method_)(P, Q, R);
635 const std::string name_;
641template <
class T,
class P,
class Q,
class R>
643 void (T::*method)(P, Q, R),
const std::string&
name,
644 P param1, Q param2, R param3) {
660 : constraint_(
ct), method_(method), name_(
name) {}
664 void Run(
Solver*
const s)
override { (constraint_->*method_)(); }
671 return "DelayedCallMethod_" + name_ +
"(" + constraint_->DebugString() +
676 T*
const constraint_;
677 void (T::*
const method_)();
678 const std::string name_;
684 const std::string&
name) {
689template <
class T,
class P>
694 : constraint_(
ct), method_(method), name_(
name), param1_(param1) {}
698 void Run(
Solver*
const s)
override { (constraint_->*method_)(param1_); }
705 return absl::StrCat(
"DelayedCallMethod_", name_,
"(",
706 constraint_->DebugString(),
", ",
711 T*
const constraint_;
712 void (T::*
const method_)(P);
713 const std::string name_;
717template <
class T,
class P>
719 void (T::*method)(P),
720 const std::string&
name, P param1) {
725template <
class T,
class P,
class Q>
729 const std::string&
name, P param1, Q param2)
739 (constraint_->*method_)(param1_, param2_);
747 return absl::StrCat(absl::StrCat(
"DelayedCallMethod_", name_),
748 absl::StrCat(
"(", constraint_->DebugString()),
754 T*
const constraint_;
755 void (T::*
const method_)(P, Q);
756 const std::string name_;
761template <
class T,
class P,
class Q>
763 void (T::*method)(P, Q),
764 const std::string&
name, P param1,
807template <
class V,
class Val,
class Handler>
821 const int size =
Size();
823 <<
"Assignment contains fewer variables than operator";
824 for (
int i = 0; i < size; ++i) {
897 vars_.insert(
vars_.end(), vars.begin(), vars.end());
898 const int64_t size =
Size();
947 std::vector<int>* assignment_indices, int64_t
index,
952 if (assignment_indices !=
nullptr) {
953 if ((*assignment_indices)[
index] == -1) {
954 (*assignment_indices)[
index] = container->
Size();
992#if defined(SWIGPYTHON)
994%unignore VarLocalSearchOperator<IntVar, int64_t,
995 IntVarLocalSearchHandler>::Size;
996%unignore VarLocalSearchOperator<IntVar, int64_t,
997 IntVarLocalSearchHandler>
::Value;
998%unignore VarLocalSearchOperator<IntVar, int64_t,
999 IntVarLocalSearchHandler>::OldValue;
1000%unignore VarLocalSearchOperator<IntVar, int64_t,
1001 IntVarLocalSearchHandler>::SetValue;
1002%feature(
"director") VarLocalSearchOperator<IntVar, int64_t,
1003 IntVarLocalSearchHandler>::IsIncremental;
1004%feature("director") VarLocalSearchOperator<IntVar, int64_t,
1005 IntVarLocalSearchHandler>::OnStart;
1006%unignore VarLocalSearchOperator<IntVar, int64_t,
1007 IntVarLocalSearchHandler>::IsIncremental;
1008%unignore VarLocalSearchOperator<IntVar, int64_t,
1009 IntVarLocalSearchHandler>::OnStart;
1014%rename(IntVarLocalSearchOperatorTemplate)
1015 VarLocalSearchOperator<IntVar, int64_t, IntVarLocalSearchHandler>;
1016%
template(IntVarLocalSearchOperatorTemplate)
1017 VarLocalSearchOperator<IntVar, int64_t, IntVarLocalSearchHandler>;
1029 bool keep_inverse_values =
false)
1032 max_inverse_value_(keep_inverse_values ? vars.size() - 1 : -1) {
1034 if (keep_inverse_values) {
1035 int64_t max_value = -1;
1039 inverse_values_.resize(max_value + 1, -1);
1040 old_inverse_values_.resize(max_value + 1, -1);
1059 virtual bool MakeOneNeighbor();
1063 return index <= max_inverse_value_;
1069 return old_inverse_values_[
index];
1081 const int64_t max_inverse_value_;
1082 std::vector<int64_t> old_inverse_values_;
1083 std::vector<int64_t> inverse_values_;
1090 if (element->
Var() !=
var) {
1092 <<
"Assignment does not contain operator variable " <<
var;
1121 bool active, std::vector<int>* assignment_indices,
1125 void OnRevertChanges(int64_t
index,
const std::vector<int>&
value);
1140 SequenceVar, std::vector<int>, SequenceVarLocalSearchHandler>;
1142 SequenceVar, std::vector<int>, SequenceVarLocalSearchHandler>;
1146typedef VarLocalSearchOperator<SequenceVar, std::vector<int>,
1147 SequenceVarLocalSearchHandler>
1182 std::vector<int>* assignment_indices, int64_t
index,
1187 if (assignment_indices !=
nullptr) {
1188 if ((*assignment_indices)[
index] == -1) {
1189 (*assignment_indices)[
index] = container->
Size();
1208 std::vector<int>*
value) {
1212 if (element->
Var() !=
var) {
1214 <<
"Assignment does not contain operator variable " <<
var;
1220 *
value = element_value;
1225 int64_t
index,
const std::vector<int>&
value) {
1262 explicit BaseLns(
const std::vector<IntVar*>& vars);
1276 void OnStart()
override;
1277 std::vector<int> fragment_;
1286 explicit ChangeValue(
const std::vector<IntVar*>& vars);
1295 void OnStart()
override;
1338 const std::vector<IntVar*>& path_vars,
1341 const std::vector<IntVar*>& path_vars,
int number_of_base_nodes,
1342 bool skip_locally_optimal_paths,
bool accept_path_end_base,
1343 std::function<
int(int64_t)> start_empty_path_class)
1345 next_vars, path_vars,
1346 {number_of_base_nodes, skip_locally_optimal_paths,
1347 accept_path_end_base, std::move(start_empty_path_class)}) {}
1350 void Reset()
override;
1386 int64_t
BaseNode(
int i)
const {
return base_nodes_[i]; }
1392 const int alternative_index = alternative_index_[
BaseNode(i)];
1393 return alternative_index >= 0
1394 ? alternative_sets_[alternative_index][base_alternatives_[i]]
1399 return base_sibling_alternatives_[i];
1404 const int sibling_alternative_index =
1406 return sibling_alternative_index >= 0
1407 ? alternative_sets_[sibling_alternative_index]
1408 [base_sibling_alternatives_[i]]
1412 int64_t
StartNode(
int i)
const {
return path_starts_[base_paths_[i]]; }
1414 const std::vector<int64_t>&
path_starts()
const {
return path_starts_; }
1470 bool MoveChain(int64_t before_chain, int64_t chain_end, int64_t destination);
1474 bool ReverseChain(int64_t before_chain, int64_t after_chain,
1475 int64_t* chain_last);
1478 bool MakeActive(int64_t node, int64_t destination);
1486 void SetNext(int64_t from, int64_t to, int64_t path) {
1505 return !
IsPathEnd(node) && inactives_[node];
1520 const int alternative = alternative_sets_.size();
1521 for (int64_t node : alternative_set) {
1522 DCHECK_EQ(-1, alternative_index_[node]);
1523 alternative_index_[node] = alternative;
1525 alternative_sets_.push_back(alternative_set);
1526 sibling_alternative_.push_back(-1);
1533 const std::vector<std::pair<std::vector<int64_t>, std::vector<int64_t>>>&
1534 pair_alternative_sets) {
1535 for (
const auto& pair_alternative_set : pair_alternative_sets) {
1537 sibling_alternative_.back() = alternative + 1;
1543 int64_t GetActiveInAlternativeSet(int alternative_index) const {
1544 return alternative_index >= 0
1545 ? active_in_alternative_set_[alternative_index]
1550 return GetActiveInAlternativeSet(alternative_index_[node]);
1554 if (node >= alternative_index_.size())
return -1;
1555 const int alternative = alternative_index_[node];
1556 return alternative >= 0 ? sibling_alternative_[alternative] : -1;
1561 if (node >= alternative_index_.size())
return -1;
1562 const int alternative = alternative_index_[node];
1563 const int sibling_alternative =
1564 alternative >= 0 ? sibling_alternative_[alternative] : -1;
1565 return GetActiveInAlternativeSet(sibling_alternative);
1569 bool CheckChainValidity(int64_t before_chain, int64_t chain_end,
1570 int64_t exclude)
const;
1579 void OnStart()
override;
1581 bool OnSamePath(int64_t node1, int64_t node2)
const;
1583 bool CheckEnds()
const {
1584 const int base_node_size = base_nodes_.size();
1585 for (
int i = base_node_size - 1; i >= 0; --i) {
1586 if (base_nodes_[i] != end_nodes_[i]) {
1592 bool IncrementPosition();
1593 void InitializePathStarts();
1594 void InitializeInactives();
1595 void InitializeBaseNodes();
1596 void InitializeAlternatives();
1599 std::vector<int> base_nodes_;
1600 std::vector<int> base_alternatives_;
1601 std::vector<int> base_sibling_alternatives_;
1602 std::vector<int> end_nodes_;
1603 std::vector<int> base_paths_;
1604 std::vector<int64_t> path_starts_;
1605 std::vector<bool> inactives_;
1608 IterationParameters iteration_parameters_;
1609 bool optimal_paths_enabled_;
1610 std::vector<int> path_basis_;
1611 std::vector<bool> optimal_paths_;
1614 std::vector<std::vector<int64_t>> alternative_sets_;
1616 std::vector<int> alternative_index_;
1617 std::vector<int64_t> active_in_alternative_set_;
1618 std::vector<int> sibling_alternative_;
1624 Solver* solver,
const std::vector<IntVar*>& vars,
1625 const std::vector<IntVar*>& secondary_vars,
1626 std::function<
int(int64_t)> start_empty_path_class);
1655class LocalSearchVariable;
1672 void RelaxVariableBounds(
int variable_index);
1673 bool TightenVariableMin(
int variable_index, int64_t
value);
1674 bool TightenVariableMax(
int variable_index, int64_t
value);
1675 int64_t VariableMin(
int variable_index)
const;
1676 int64_t VariableMax(
int variable_index)
const;
1678 std::vector<Bounds> initial_variable_bounds_;
1679 std::vector<Bounds> variable_bounds_;
1680 std::vector<std::pair<Bounds, int>> saved_variable_bounds_trail_;
1681 std::vector<bool> variable_is_relaxed_;
1682 bool state_is_valid_ =
true;
1692 int64_t
Min()
const {
return state_->VariableMin(variable_index_); }
1693 int64_t
Max()
const {
return state_->VariableMax(variable_index_); }
1695 return state_->TightenVariableMin(variable_index_, new_min);
1698 return state_->TightenVariableMax(variable_index_, new_max);
1700 void Relax() { state_->RelaxVariableBounds(variable_index_); }
1707 : state_(state), variable_index_(variable_index) {}
1710 const int variable_index_;
1748 int64_t objective_min, int64_t objective_max) = 0;
1785 return "LocalSearchFilterManager";
1801 const Assignment* deltadelta, int64_t objective_min,
1802 int64_t objective_max);
1809 void InitializeForcedEvents();
1811 std::vector<FilterEvent> filter_events_;
1812 int last_event_called_ = -1;
1817 std::vector<int> next_forced_events_;
1818 int64_t synchronized_value_;
1819 int64_t accepted_value_;
1828 void Synchronize(
const Assignment* assignment,
1833 const int var_index =
var->index();
1834 *
index = (var_index < var_index_to_index_.size())
1835 ? var_index_to_index_[var_index]
1841 void AddVars(
const std::vector<IntVar*>& vars);
1846 return values_[
index];
1852 void SynchronizeOnAssignment(
const Assignment* assignment);
1855 std::vector<IntVar*>
vars_;
1856 std::vector<int64_t> values_;
1857 std::vector<bool> var_synced_;
1858 std::vector<int> var_index_to_index_;
1866 std::string
DebugString()
const override {
return "PropagationMonitor"; }
1888 int64_t new_max) = 0;
1893 int64_t new_max) = 0;
1899 const std::vector<int64_t>& values) = 0;
1901 const std::vector<int64_t>& values) = 0;
1906 int64_t new_max) = 0;
1910 int64_t new_max) = 0;
1914 int64_t new_max) = 0;
1922 const std::vector<int>& rank_first,
1923 const std::vector<int>& rank_last,
1924 const std::vector<int>& unperformed) = 0;
1926 void Install()
override;
1934 std::string
DebugString()
const override {
return "LocalSearchMonitor"; }
1945 bool neighbor_found) = 0;
1948 bool neighbor_found) = 0;
1953 void Install()
override;
1961 :
IntVar(s,
name), value_(kUnboundBooleanVarValue) {}
1965 int64_t
Min()
const override {
return (value_ == 1); }
1966 void SetMin(int64_t m)
override;
1967 int64_t
Max()
const override {
return (value_ != 0); }
1968 void SetMax(int64_t m)
override;
1969 void SetRange(int64_t mi, int64_t ma)
override;
1970 bool Bound()
const override {
return (value_ != kUnboundBooleanVarValue); }
1972 CHECK_NE(value_, kUnboundBooleanVarValue) <<
"variable is not bound";
1975 void RemoveValue(int64_t v)
override;
1976 void RemoveInterval(int64_t l, int64_t u)
override;
1977 void WhenBound(
Demon* d)
override;
1980 uint64_t Size()
const override;
1981 bool Contains(int64_t v)
const override;
1982 IntVarIterator* MakeHoleIterator(
bool reversible)
const override;
1983 IntVarIterator* MakeDomainIterator(
bool reversible)
const override;
1984 std::string DebugString()
const override;
1993 std::string
BaseName()
const override {
return "BooleanVar"; }
2011 : symmetry_manager_(nullptr), index_in_symmetry_manager_(-1) {}
2014 void AddIntegerVariableEqualValueClause(
IntVar*
const var, int64_t
value);
2015 void AddIntegerVariableGreaterOrEqualValueClause(
IntVar*
const var,
2017 void AddIntegerVariableLessOrEqualValueClause(
IntVar*
const var,
2023 CHECK(symmetry_manager_ ==
nullptr);
2024 CHECK_EQ(-1, index_in_symmetry_manager_);
2025 symmetry_manager_ = manager;
2026 index_in_symmetry_manager_ =
index;
2028 SymmetryManager* symmetry_manager()
const {
return symmetry_manager_; }
2029 int index_in_symmetry_manager()
const {
return index_in_symmetry_manager_; }
2031 SymmetryManager* symmetry_manager_;
2033 int index_in_symmetry_manager_;
2041 double scaling_factor,
double offset,
2042 std::function<std::string()> display_callback,
2043 bool display_on_new_solutions_only,
int period);
2045 void EnterSearch()
override;
2046 void ExitSearch()
override;
2047 bool AtSolution()
override;
2048 void BeginFail()
override;
2049 void NoMoreSolutions()
override;
2051 void ApplyDecision(
Decision*
const decision)
override;
2052 void RefuteDecision(
Decision*
const decision)
override;
2053 void OutputDecision();
2055 void BeginInitialPropagation()
override;
2056 void EndInitialPropagation()
override;
2057 std::string DebugString()
const override;
2061 virtual void OutputLine(
const std::string& line);
2067 std::unique_ptr<WallTimer> timer_;
2070 const double scaling_factor_;
2072 std::function<std::string()> display_callback_;
2073 const bool display_on_new_solutions_only_;
2076 int64_t objective_min_;
2077 int64_t objective_max_;
2078 int min_right_depth_;
2080 int sliding_min_depth_;
2081 int sliding_max_depth_;
2091 VOID_FALSE_CONSTRAINT = 0,
2097 VAR_CONSTANT_EQUALITY = 0,
2105 VAR_CONSTANT_CONSTANT_BETWEEN = 0,
2110 EXPR_EXPR_EQUALITY = 0,
2127 EXPR_EXPR_DIFFERENCE = 0,
2141 EXPR_EXPR_CONSTANT_CONDITIONAL = 0,
2146 EXPR_CONSTANT_DIFFERENCE = 0,
2159 VAR_CONSTANT_CONSTANT_SEMI_CONTINUOUS = 0,
2164 VAR_CONSTANT_ARRAY_ELEMENT = 0,
2169 VAR_ARRAY_CONSTANT_ARRAY_SCAL_PROD = 0,
2181 VAR_ARRAY_CONSTANT_INDEX = 0,
2209 IntVar*
const var, int64_t value1, int64_t value2,
2270 IntVar*
const var, int64_t value1, int64_t value2,
2280 IntVar*
const var,
const std::vector<int64_t>& values,
2285 const std::vector<int64_t>& values,
2294 const std::vector<IntVar*>& vars,
2300 const std::vector<IntVar*>& vars,
const std::vector<int64_t>& values,
2304 IntExpr*
const expression,
const std::vector<IntVar*>&
var,
2305 const std::vector<int64_t>& values,
2311 const std::vector<IntVar*>& vars, int64_t
value,
2315 IntExpr*
const expression,
const std::vector<IntVar*>&
var, int64_t
value,
2329 const std::string& TypeName()
const;
2330 void SetTypeName(
const std::string& type_name);
2333 void SetIntegerArgument(
const std::string& arg_name, int64_t
value);
2334 void SetIntegerArrayArgument(
const std::string& arg_name,
2335 const std::vector<int64_t>& values);
2336 void SetIntegerMatrixArgument(
const std::string& arg_name,
2338 void SetIntegerExpressionArgument(
const std::string& arg_name,
2340 void SetIntegerVariableArrayArgument(
const std::string& arg_name,
2341 const std::vector<IntVar*>& vars);
2342 void SetIntervalArgument(
const std::string& arg_name,
IntervalVar*
const var);
2343 void SetIntervalArrayArgument(
const std::string& arg_name,
2344 const std::vector<IntervalVar*>& vars);
2345 void SetSequenceArgument(
const std::string& arg_name,
SequenceVar*
const var);
2346 void SetSequenceArrayArgument(
const std::string& arg_name,
2347 const std::vector<SequenceVar*>& vars);
2350 bool HasIntegerExpressionArgument(
const std::string& arg_name)
const;
2351 bool HasIntegerVariableArrayArgument(
const std::string& arg_name)
const;
2354 int64_t FindIntegerArgumentWithDefault(
const std::string& arg_name,
2356 int64_t FindIntegerArgumentOrDie(
const std::string& arg_name)
const;
2357 const std::vector<int64_t>& FindIntegerArrayArgumentOrDie(
2358 const std::string& arg_name)
const;
2359 const IntTupleSet& FindIntegerMatrixArgumentOrDie(
2360 const std::string& arg_name)
const;
2362 IntExpr* FindIntegerExpressionArgumentOrDie(
2363 const std::string& arg_name)
const;
2364 const std::vector<IntVar*>& FindIntegerVariableArrayArgumentOrDie(
2365 const std::string& arg_name)
const;
2368 std::string type_name_;
2369 absl::flat_hash_map<std::string, int64_t> integer_argument_;
2370 absl::flat_hash_map<std::string, std::vector<int64_t>>
2371 integer_array_argument_;
2372 absl::flat_hash_map<std::string, IntTupleSet> matrix_argument_;
2373 absl::flat_hash_map<std::string, IntExpr*> integer_expression_argument_;
2374 absl::flat_hash_map<std::string, IntervalVar*> interval_argument_;
2375 absl::flat_hash_map<std::string, SequenceVar*> sequence_argument_;
2376 absl::flat_hash_map<std::string, std::vector<IntVar*>>
2377 integer_variable_array_argument_;
2378 absl::flat_hash_map<std::string, std::vector<IntervalVar*>>
2379 interval_array_argument_;
2380 absl::flat_hash_map<std::string, std::vector<SequenceVar*>>
2381 sequence_array_argument_;
2392 void BeginVisitModel(
const std::string& solver_name)
override;
2393 void EndVisitModel(
const std::string& solver_name)
override;
2394 void BeginVisitConstraint(
const std::string& type_name,
2395 const Constraint*
const constraint)
override;
2396 void EndVisitConstraint(
const std::string& type_name,
2397 const Constraint*
const constraint)
override;
2398 void BeginVisitIntegerExpression(
const std::string& type_name,
2399 const IntExpr*
const expr)
override;
2400 void EndVisitIntegerExpression(
const std::string& type_name,
2401 const IntExpr*
const expr)
override;
2402 void VisitIntegerVariable(
const IntVar*
const variable,
2403 IntExpr*
const delegate)
override;
2404 void VisitIntegerVariable(
const IntVar*
const variable,
2405 const std::string& operation, int64_t
value,
2406 IntVar*
const delegate)
override;
2407 void VisitIntervalVariable(
const IntervalVar*
const variable,
2408 const std::string& operation, int64_t
value,
2410 void VisitSequenceVariable(
const SequenceVar*
const variable)
override;
2412 void VisitIntegerArgument(
const std::string& arg_name,
2413 int64_t
value)
override;
2414 void VisitIntegerArrayArgument(
const std::string& arg_name,
2415 const std::vector<int64_t>& values)
override;
2416 void VisitIntegerMatrixArgument(
const std::string& arg_name,
2419 void VisitIntegerExpressionArgument(
const std::string& arg_name,
2420 IntExpr*
const argument)
override;
2421 void VisitIntegerVariableArrayArgument(
2422 const std::string& arg_name,
2423 const std::vector<IntVar*>& arguments)
override;
2425 void VisitIntervalArgument(
const std::string& arg_name,
2427 void VisitIntervalArrayArgument(
2428 const std::string& arg_name,
2429 const std::vector<IntervalVar*>& arguments)
override;
2431 void VisitSequenceArgument(
const std::string& arg_name,
2433 void VisitSequenceArrayArgument(
2434 const std::string& arg_name,
2435 const std::vector<SequenceVar*>& arguments)
override;
2438 void PushArgumentHolder();
2439 void PopArgumentHolder();
2443 std::vector<ArgumentHolder*> holders_;
2450 : index_min_(index_min),
2451 index_max_(index_max),
2452 values_(new T[index_max - index_min + 1]) {
2461 return values_[
index - index_min_];
2470 std::string
DebugString()
const override {
return "ArrayWithOffset"; }
2473 const int64_t index_min_;
2474 const int64_t index_max_;
2475 std::unique_ptr<T[]> values_;
2483template <
class T,
class C>
2487 : block_size_(block_size), block_offset_(0) {
2492 for (
int i = 0; i < elements_.size(); ++i) {
2493 delete[] elements_[i];
2498 const int64_t block_index = ComputeBlockIndex(
index);
2499 const int64_t relative_index = block_index - block_offset_;
2500 if (relative_index < 0 || relative_index >= elements_.size()) {
2503 const T* block = elements_[relative_index];
2504 return block !=
nullptr ? block[
index - block_index * block_size_] : T();
2508 const int64_t block_index = ComputeBlockIndex(
index);
2509 T*
const block = GetOrCreateBlock(block_index);
2510 const int64_t residual =
index - block_index * block_size_;
2512 reinterpret_cast<C
>(
value));
2516 T* NewBlock()
const {
2517 T*
const result =
new T[block_size_];
2518 for (
int i = 0; i < block_size_; ++i) {
2524 T* GetOrCreateBlock(
int block_index) {
2525 if (elements_.size() == 0) {
2526 block_offset_ = block_index;
2527 GrowUp(block_index);
2528 }
else if (block_index < block_offset_) {
2529 GrowDown(block_index);
2530 }
else if (block_index - block_offset_ >= elements_.size()) {
2531 GrowUp(block_index);
2533 T* block = elements_[block_index - block_offset_];
2534 if (block ==
nullptr) {
2536 elements_[block_index - block_offset_] = block;
2541 int64_t ComputeBlockIndex(int64_t
value)
const {
2543 : (
value - block_size_ + 1) / block_size_;
2546 void GrowUp(int64_t block_index) {
2547 elements_.resize(block_index - block_offset_ + 1);
2550 void GrowDown(int64_t block_index) {
2551 const int64_t
delta = block_offset_ - block_index;
2552 block_offset_ = block_index;
2554 elements_.insert(elements_.begin(),
delta,
nullptr);
2557 const int64_t block_size_;
2558 std::vector<T*> elements_;
2569 static constexpr int kNoInserted = -1;
2577 delete_position_(true) {
2578 for (
int i = 0; i <
capacity; ++i) {
2579 position_[i] = kNoInserted;
2588 position_(shared_positions),
2589 delete_position_(false) {
2590 for (
int i = 0; i < shared_positions_size; ++i) {
2591 position_[i] = kNoInserted;
2596 if (delete_position_) {
2601 int Size()
const {
return num_elements_.Value(); }
2608 return elements_[i];
2613 DCHECK_LT(i + num_elements_.Value(), capacity_);
2614 return elements_[i + num_elements_.Value()];
2618 const int position = num_elements_.Value();
2620 DCHECK(NotAlreadyInserted(elt));
2621 elements_[position] = elt;
2622 position_[elt] = position;
2623 num_elements_.Incr(solver);
2627 num_elements_.Decr(solver);
2628 SwapTo(value_index, num_elements_.Value());
2632 SwapTo(value_index, num_elements_.Value());
2633 num_elements_.Incr(solver);
2636 void Clear(
Solver*
const solver) { num_elements_.SetValue(solver, 0); }
2645 bool NotAlreadyInserted(
const T& elt) {
2646 for (
int i = 0; i < num_elements_.Value(); ++i) {
2647 if (elt == elements_[i]) {
2654 void SwapTo(T value_index,
int next_position) {
2655 const int current_position = position_[value_index];
2656 if (current_position != next_position) {
2657 const T next_value_index = elements_[next_position];
2658 elements_[current_position] = next_value_index;
2659 elements_[next_position] = value_index;
2660 position_[value_index] = next_position;
2661 position_[next_value_index] = current_position;
2666 std::unique_ptr<T[]> elements_;
2668 NumericalRev<int> num_elements_;
2670 const int capacity_;
2674 const bool delete_position_;
2684 last_ranked_(items.size() - 1),
2685 size_(items.size()),
2686 position_(new int[size_]) {
2687 for (
int i = 0; i < size_; ++i) {
2688 elements_[i] = items[i];
2696 last_ranked_(size - 1),
2698 position_(new int[size_]) {
2699 for (
int i = 0; i < size_; ++i) {
2717 return elements_[
index];
2722 DCHECK_LE(first_ranked_.Value(), last_ranked_.Value());
2723 SwapTo(elt, first_ranked_.Value());
2724 first_ranked_.Incr(solver);
2728 DCHECK_LE(first_ranked_.Value(), last_ranked_.Value());
2729 SwapTo(elt, last_ranked_.Value());
2730 last_ranked_.Decr(solver);
2734 const int position = position_[elt];
2735 return (position < first_ranked_.Value() ||
2736 position > last_ranked_.Value());
2740 std::string result =
"[";
2741 for (
int i = 0; i < first_ranked_.Value(); ++i) {
2742 absl::StrAppend(&result, elements_[i]);
2743 if (i != first_ranked_.Value() - 1) {
2748 for (
int i = first_ranked_.Value(); i <= last_ranked_.Value(); ++i) {
2749 absl::StrAppend(&result, elements_[i]);
2750 if (i != last_ranked_.Value()) {
2755 for (
int i = last_ranked_.Value() + 1; i < size_; ++i) {
2756 absl::StrAppend(&result, elements_[i]);
2757 if (i != size_ - 1) {
2766 void SwapTo(
int elt,
int next_position) {
2767 const int current_position = position_[elt];
2768 if (current_position != next_position) {
2769 const int next_elt = elements_[next_position];
2770 elements_[current_position] = next_elt;
2771 elements_[next_position] = elt;
2772 position_[elt] = next_position;
2773 position_[next_elt] = current_position;
2778 std::vector<int> elements_;
2780 NumericalRev<int> first_ranked_;
2782 NumericalRev<int> last_ranked_;
2786 std::unique_ptr<int[]> position_;
2802 void Init(
Solver*
const solver,
const std::vector<uint64_t>& mask);
2806 bool RevSubtract(
Solver*
const solver,
const std::vector<uint64_t>& mask);
2810 bool RevAnd(
Solver*
const solver,
const std::vector<uint64_t>& mask);
2817 bool Empty()
const {
return active_words_.Size() == 0; }
2826 bool Intersects(
const std::vector<uint64_t>& mask,
int* support_index);
2836 void CleanUpActives(
Solver*
const solver);
2838 const int64_t bit_size_;
2839 const int64_t word_size_;
2847 for (
int i = 0; i < values.size(); ++i) {
2848 if (values[i] !=
value) {
2857 for (
int i = 0; i < values.size(); ++i) {
2858 if (values[i] != 0 && values[i] != 1) {
2877 for (
const T& current_value : values) {
2878 if (current_value <
value) {
2887 for (
const T& current_value : values) {
2888 if (current_value >
value) {
2917 for (
int i = 0; i < values.size() - 1; ++i) {
2918 if (values[i + 1] != values[i] + 1) {
2927 for (
int i = 0; i < values.size() - 1; ++i) {
2928 if (values[i + 1] < values[i]) {
2938 for (
int i = 0; i < vars.size(); ++i) {
2939 if (vars[i]->Min() < range_min || vars[i]->Max() > range_max) {
2947 for (
int i = 0; i < vars.size(); ++i) {
2948 if (!vars[i]->Bound()) {
2963 const std::vector<T>& values) {
2964 for (
int i = 0; i < vars.size(); ++i) {
2965 if (values[i] != 0 && !vars[i]->Bound()) {
2974 for (
int i = 0; i < vars.size(); ++i) {
2975 if (!vars[i]->Bound() || vars[i]->Min() !=
value) {
2985 for (
int i = 0; i < vars.size(); ++i) {
2987 result = std::max<int64_t>(result, vars[i]->Max());
2995 for (
int i = 0; i < vars.size(); ++i) {
2997 result = std::min<int64_t>(result, vars[i]->Min());
3003 std::vector<int64_t>*
const values) {
3005 values->resize(vars.size());
3006 for (
int i = 0; i < vars.size(); ++i) {
3007 (*values)[i] = vars[i]->Value();
3013 return (e < 0 || e % v == 0) ? e / v : e / v + 1;
3018 return (e >= 0 || e % v == 0) ? e / v : e / v - 1;
3078 : begin_index(begin_index), end_index(end_index) {}
3087 PathState(
int num_nodes, std::vector<int> path_start,
3088 std::vector<int> path_end);
3097 int Start(
int path)
const {
return path_start_end_[path].start; }
3099 int End(
int path)
const {
return path_start_end_[path].end; }
3105 return committed_nodes_[committed_index_[node]].path;
3113 ChainRange Chains(
int path)
const;
3115 NodeRange Nodes(
int path)
const;
3124 void ChangePath(
int path,
const std::vector<ChainBounds>& chains);
3127 void ChangePath(
int path,
const std::initializer_list<ChainBounds>& chains) {
3128 changed_paths_.push_back(path);
3129 const int path_begin_index = chains_.size();
3130 chains_.insert(chains_.end(), chains.begin(), chains.end());
3131 const int path_end_index = chains_.size();
3132 paths_[path] = {path_begin_index, path_end_index};
3134 chains_.emplace_back(0, 0);
3138 void ChangeLoops(
const std::vector<int>& new_loops);
3154 struct PathStartEnd {
3164 struct CommittedNode {
3165 CommittedNode(
int node,
int path) : node(node), path(path) {}
3175 void CopyNewPathAtEndOfNodes(
int path);
3178 void IncrementalCommit();
3184 const int num_nodes_;
3185 const int num_paths_;
3186 std::vector<PathStartEnd> path_start_end_;
3214 std::vector<CommittedNode> committed_nodes_;
3215 std::vector<int> committed_index_;
3216 const int num_nodes_threshold_;
3217 std::vector<ChainBounds> chains_;
3218 std::vector<PathBounds> paths_;
3221 std::vector<int> changed_paths_;
3222 std::vector<int> changed_loops_;
3225 bool is_invalid_ =
false;
3239 return current_node_ != other.current_node_;
3245 explicit Iterator(
const CommittedNode* node) : current_node_(node) {}
3246 const CommittedNode* current_node_;
3251 Chain(
const CommittedNode* begin_node,
const CommittedNode* end_node)
3252 : begin_(begin_node), end_(end_node) {}
3255 int First()
const {
return begin_->node; }
3256 int Last()
const {
return (end_ - 1)->node; }
3261 const CommittedNode*
const begin_;
3262 const CommittedNode*
const end_;
3275 return {first_node_ + current_chain_->begin_index,
3276 first_node_ + current_chain_->end_index};
3279 return current_chain_ != other.current_chain_;
3286 : current_chain_(chain), first_node_(first_node) {}
3288 const CommittedNode*
const first_node_;
3295 const CommittedNode*
const first_node)
3296 : begin_(begin_chain), end_(end_chain), first_node_(first_node) {}
3304 const CommittedNode*
const first_node_;
3315 if (current_node_ == end_node_) {
3320 current_node_ = first_node_ +
bounds.begin_index;
3321 end_node_ = first_node_ +
bounds.end_index;
3327 return current_chain_ != other.current_chain_;
3334 const CommittedNode*
const first_node)
3335 : current_node_(first_node + current_chain->begin_index),
3336 end_node_(first_node + current_chain->end_index),
3337 current_chain_(current_chain),
3338 first_node_(first_node) {}
3339 const CommittedNode* current_node_;
3340 const CommittedNode* end_node_;
3342 const CommittedNode*
const first_node_;
3348 const CommittedNode* first_node)
3349 : begin_chain_(begin_chain),
3350 end_chain_(end_chain),
3351 first_node_(first_node) {}
3360 const CommittedNode*
const first_node_;
3385 std::vector<Interval> path_capacity,
3386 std::vector<int> path_class,
3387 std::vector<std::function<
Interval(int64_t)>>
3388 min_max_demand_per_path_class,
3389 std::vector<Interval> node_capacity);
3405 Interval GetMinMaxPartialDemandSum(
int first_node_index,
3406 int last_node_index)
const;
3412 bool SubpathOnlyHasTrivialNodes(
int first_node_index,
3413 int last_node_index)
const;
3419 void IncrementalCommit();
3422 void AppendPathDemandsToSums(
int path);
3428 void UpdateRMQStructure(
int begin_index,
int end_index);
3431 const std::vector<Interval> path_capacity_;
3432 const std::vector<int> path_class_;
3433 const std::vector<std::function<
Interval(int64_t)>>
3434 min_max_demand_per_path_class_;
3435 std::vector<Interval> cached_demand_;
3436 const std::vector<Interval> node_capacity_;
3442 std::vector<int> index_;
3452 std::vector<std::vector<Interval>> partial_demand_sums_rmq_;
3455 const int maximum_partial_demand_layer_size_;
3460 std::vector<int> previous_nontrivial_index_;
3469 std::unique_ptr<PathState> path_state,
3470 const std::vector<IntVar*>& nexts);
3480 Solver* solver, std::unique_ptr<UnaryDimensionChecker> checker,
3481 const std::string& dimension_name);
const std::vector< IntVar * > vars_
#define DCHECK_LE(val1, val2)
#define CHECK_EQ(val1, val2)
#define CHECK_GE(val1, val2)
#define CHECK_GT(val1, val2)
#define DCHECK_GE(val1, val2)
#define CHECK_NE(val1, val2)
#define DCHECK_GT(val1, val2)
#define DCHECK_LT(val1, val2)
#define DCHECK(condition)
#define CHECK_LE(val1, val2)
#define DCHECK_EQ(val1, val2)
int64_t MemoryUsage(int unused)
Argument Holder: useful when visiting a model.
virtual T Evaluate(int64_t index) const
~ArrayWithOffset() override
ArrayWithOffset(int64_t index_min, int64_t index_max)
void SetValue(int64_t index, T value)
std::string DebugString() const override
bool Contains(const V *const var) const
const E & Element(const V *const var) const
E * MutableElement(const V *const var)
An Assignment is a variable -> domains mapping, used to report solutions to the user.
SequenceContainer * MutableSequenceVarContainer()
const SequenceContainer & SequenceVarContainer() const
IntContainer * MutableIntVarContainer()
const IntContainer & IntVarContainer() const
IntVarElement * FastAdd(IntVar *const var)
Adds without checking if variable has been previously added.
BaseIntExpr(Solver *const s)
virtual IntVar * CastToVar()
IntVar * Var() override
Creates a variable from the expression.
This is the base class for building an Lns operator.
virtual bool NextFragment()=0
bool HasFragments() const override
void AppendToFragment(int index)
BaseLns(const std::vector< IntVar * > &vars)
bool MakeOneNeighbor() override
This method should not be overridden. Override NextFragment() instead.
virtual void InitFragments()
A BaseObject is the root of all reversibly allocated objects.
void SetContentFromBitsetOfSameSize(const Bitset64< OtherIndexType > &other)
void Resize(IndexType size)
void CopyBucket(const Bitset64< IndexType > &other, IndexType i)
int VarType() const override
virtual void RestoreValue()=0
bool Bound() const override
Returns true if the min and the max of the expression are equal.
void WhenRange(Demon *d) override
Attach a demon that will watch the min or the max of the expression.
SimpleRevFIFO< Demon * > delayed_bound_demons_
int64_t Min() const override
void WhenDomain(Demon *d) override
This method attaches a demon that will watch any domain modification of the domain of the variable.
static const int kUnboundBooleanVarValue
int64_t Value() const override
This method returns the value of the variable.
int64_t Max() const override
SimpleRevFIFO< Demon * > bound_demons_
std::string BaseName() const override
Returns a base name for automatic naming.
BooleanVar(Solver *const s, const std::string &name="")
Demon proxy to a method on the constraint with no arguments.
CallMethod0(T *const ct, void(T::*method)(), const std::string &name)
void Run(Solver *const s) override
This is the main callback of the demon.
std::string DebugString() const override
Demon proxy to a method on the constraint with one argument.
void Run(Solver *const s) override
This is the main callback of the demon.
std::string DebugString() const override
CallMethod1(T *const ct, void(T::*method)(P), const std::string &name, P param1)
Demon proxy to a method on the constraint with two arguments.
CallMethod2(T *const ct, void(T::*method)(P, Q), const std::string &name, P param1, Q param2)
void Run(Solver *const s) override
This is the main callback of the demon.
std::string DebugString() const override
Demon proxy to a method on the constraint with three arguments.
CallMethod3(T *const ct, void(T::*method)(P, Q, R), const std::string &name, P param1, Q param2, R param3)
void Run(Solver *const s) override
This is the main callback of the demon.
std::string DebugString() const override
Defines operators which change the value of variables; each neighbor corresponds to one modified vari...
ChangeValue(const std::vector< IntVar * > &vars)
virtual int64_t ModifyValue(int64_t index, int64_t value)=0
bool MakeOneNeighbor() override
This method should not be overridden. Override ModifyValue() instead.
A constraint is the main modeling object.
A Decision represents a choice point in the search tree.
A DecisionVisitor is used to inspect a decision.
Low-priority demon proxy to a method on the constraint with no arguments.
Solver::DemonPriority priority() const override
This method returns the priority of the demon.
~DelayedCallMethod0() override
void Run(Solver *const s) override
This is the main callback of the demon.
DelayedCallMethod0(T *const ct, void(T::*method)(), const std::string &name)
std::string DebugString() const override
Low-priority demon proxy to a method on the constraint with one argument.
Solver::DemonPriority priority() const override
This method returns the priority of the demon.
DelayedCallMethod1(T *const ct, void(T::*method)(P), const std::string &name, P param1)
void Run(Solver *const s) override
This is the main callback of the demon.
std::string DebugString() const override
~DelayedCallMethod1() override
Low-priority demon proxy to a method on the constraint with two arguments.
Solver::DemonPriority priority() const override
This method returns the priority of the demon.
~DelayedCallMethod2() override
DelayedCallMethod2(T *const ct, void(T::*method)(P, Q), const std::string &name, P param1, Q param2)
void Run(Solver *const s) override
This is the main callback of the demon.
std::string DebugString() const override
A Demon is the base element of a propagation queue.
The class IntExpr is the base of all integer expressions in constraint programming.
virtual int64_t Max() const =0
The class IntVar is a subset of IntExpr.
The class Iterator has two direct subclasses.
virtual void OnSynchronize(const Assignment *delta)
IntVar * Var(int index) const
bool FindIndex(IntVar *const var, int64_t *index) const
int64_t Value(int index) const
bool IsVarSynced(int index) const
bool ValueFromAssignment(const Assignment &assignment, IntVar *var, int64_t index, int64_t *value)
IntVarLocalSearchHandler()
IntVarLocalSearchHandler(const IntVarLocalSearchHandler &other)
IntVarLocalSearchHandler(IntVarLocalSearchOperator *op)
void OnRevertChanges(int64_t index, int64_t value)
void AddToAssignment(IntVar *var, int64_t value, bool active, std::vector< int > *assignment_indices, int64_t index, Assignment *assignment) const
Specialization of LocalSearchOperator built from an array of IntVars which specifies the scope of the...
int64_t OldInverseValue(int64_t index) const
int64_t InverseValue(int64_t index) const
friend class IntVarLocalSearchHandler
void SetOldInverseValue(int64_t index, int64_t value)
~IntVarLocalSearchOperator() override
void SetInverseValue(int64_t index, int64_t value)
IntVarLocalSearchOperator()
IntVarLocalSearchOperator(const std::vector< IntVar * > &vars, bool keep_inverse_values=false)
bool IsInverseValue(int64_t index) const
Interval variables are often used in scheduling.
Local Search Filters are used for fast neighbor pruning.
virtual void Synchronize(const Assignment *assignment, const Assignment *delta)=0
Synchronizes the filter with the current solution, delta being the difference with the solution passe...
virtual int64_t GetAcceptedObjectiveValue() const
Objective value from the last time Accept() was called and returned true.
virtual void Reset()
Sets the filter to empty solution.
virtual void Relax(const Assignment *delta, const Assignment *deltadelta)
Lets the filter know what delta and deltadelta will be passed in the next Accept().
virtual bool Accept(const Assignment *delta, const Assignment *deltadelta, int64_t objective_min, int64_t objective_max)=0
Accepts a "delta" given the assignment with which the filter has been synchronized; the delta holds t...
virtual bool IsIncremental() const
virtual int64_t GetSynchronizedObjectiveValue() const
Objective value from last time Synchronize() was called.
virtual void Revert()
Cancels the changes made by the last Relax()/Accept() calls.
virtual void Commit(const Assignment *delta, const Assignment *deltadelta)
Dual of Relax(), lets the filter know that the delta was accepted.
Filter manager: when a move is made, filters are executed to decide whether the solution is feasible ...
int64_t GetAcceptedObjectiveValue() const
int64_t GetSynchronizedObjectiveValue() const
std::string DebugString() const override
virtual void EndMakeNextNeighbor(const LocalSearchOperator *op, bool neighbor_found, const Assignment *delta, const Assignment *deltadelta)=0
virtual void EndAcceptNeighbor(const LocalSearchOperator *op, bool neighbor_found)=0
virtual void EndOperatorStart()=0
virtual void BeginMakeNextNeighbor(const LocalSearchOperator *op)=0
virtual void BeginOperatorStart()=0
Local search operator events.
virtual void EndFiltering(const LocalSearchFilter *filter, bool reject)=0
virtual void BeginFilterNeighbor(const LocalSearchOperator *op)=0
virtual void BeginAcceptNeighbor(const LocalSearchOperator *op)=0
virtual void BeginFiltering(const LocalSearchFilter *filter)=0
virtual void EndFilterNeighbor(const LocalSearchOperator *op, bool neighbor_found)=0
std::string DebugString() const override
The base class for all local search operators.
virtual bool HasFragments() const
virtual bool HoldsDelta() const
virtual const LocalSearchOperator * Self() const
virtual bool MakeNextNeighbor(Assignment *delta, Assignment *deltadelta)=0
virtual void Start(const Assignment *assignment)=0
~LocalSearchOperator() override
bool StateIsValid() const
bool SetMax(int64_t new_max)
bool SetMin(int64_t new_min)
Implements a complete cache for model elements: expressions and constraints.
virtual IntExpr * FindVarArrayExpression(const std::vector< IntVar * > &vars, VarArrayExpressionType type) const =0
Var Array Expressions.
virtual IntExpr * FindVarArrayConstantArrayExpression(const std::vector< IntVar * > &vars, const std::vector< int64_t > &values, VarArrayConstantArrayExpressionType type) const =0
Var Array Constant Array Expressions.
virtual IntExpr * FindExprConstantExpression(IntExpr *const expr, int64_t value, ExprConstantExpressionType type) const =0
Expr Constant Expressions.
ExprConstantExpressionType
@ EXPR_CONSTANT_EXPRESSION_MAX
@ EXPR_CONSTANT_IS_GREATER_OR_EQUAL
@ EXPR_CONSTANT_IS_NOT_EQUAL
@ EXPR_CONSTANT_IS_LESS_OR_EQUAL
virtual void InsertExprExprConstantExpression(IntExpr *const expression, IntExpr *const var1, IntExpr *const var2, int64_t constant, ExprExprConstantExpressionType type)=0
VarConstantConstraintType
@ VAR_CONSTANT_GREATER_OR_EQUAL
@ VAR_CONSTANT_NON_EQUALITY
@ VAR_CONSTANT_CONSTRAINT_MAX
@ VAR_CONSTANT_LESS_OR_EQUAL
virtual IntExpr * FindExprExpression(IntExpr *const expr, ExprExpressionType type) const =0
Expr Expressions.
virtual IntExpr * FindVarConstantConstantExpression(IntVar *const var, int64_t value1, int64_t value2, VarConstantConstantExpressionType type) const =0
Var Constant Constant Expressions.
virtual void InsertExprExprExpression(IntExpr *const expression, IntExpr *const var1, IntExpr *const var2, ExprExprExpressionType type)=0
virtual void InsertVarConstantArrayExpression(IntExpr *const expression, IntVar *const var, const std::vector< int64_t > &values, VarConstantArrayExpressionType type)=0
VarArrayConstantArrayExpressionType
@ VAR_ARRAY_CONSTANT_ARRAY_EXPRESSION_MAX
virtual IntExpr * FindExprExprConstantExpression(IntExpr *const var1, IntExpr *const var2, int64_t constant, ExprExprConstantExpressionType type) const =0
Expr Expr Constant Expressions.
VarConstantConstantExpressionType
@ VAR_CONSTANT_CONSTANT_EXPRESSION_MAX
VarConstantConstantConstraintType
@ VAR_CONSTANT_CONSTANT_CONSTRAINT_MAX
virtual void InsertVoidConstraint(Constraint *const ct, VoidConstraintType type)=0
virtual Constraint * FindVarConstantConstraint(IntVar *const var, int64_t value, VarConstantConstraintType type) const =0
Var Constant Constraints.
@ EXPR_EXPR_EXPRESSION_MAX
@ EXPR_EXPR_IS_LESS_OR_EQUAL
@ EXPR_EXPR_GREATER_OR_EQUAL
@ EXPR_EXPR_CONSTRAINT_MAX
@ EXPR_EXPR_LESS_OR_EQUAL
virtual void InsertVarArrayExpression(IntExpr *const expression, const std::vector< IntVar * > &vars, VarArrayExpressionType type)=0
virtual Constraint * FindVoidConstraint(VoidConstraintType type) const =0
Void constraints.
virtual IntExpr * FindVarConstantArrayExpression(IntVar *const var, const std::vector< int64_t > &values, VarConstantArrayExpressionType type) const =0
Var Constant Array Expressions.
virtual void InsertVarArrayConstantExpression(IntExpr *const expression, const std::vector< IntVar * > &var, int64_t value, VarArrayConstantExpressionType type)=0
ExprExprConstantExpressionType
@ EXPR_EXPR_CONSTANT_EXPRESSION_MAX
virtual void InsertVarConstantConstraint(Constraint *const ct, IntVar *const var, int64_t value, VarConstantConstraintType type)=0
virtual IntExpr * FindVarArrayConstantExpression(const std::vector< IntVar * > &vars, int64_t value, VarArrayConstantExpressionType type) const =0
Var Array Constant Expressions.
virtual Constraint * FindVarConstantConstantConstraint(IntVar *const var, int64_t value1, int64_t value2, VarConstantConstantConstraintType type) const =0
Var Constant Constant Constraints.
VarArrayConstantExpressionType
@ VAR_ARRAY_CONSTANT_EXPRESSION_MAX
virtual void InsertVarArrayConstantArrayExpression(IntExpr *const expression, const std::vector< IntVar * > &var, const std::vector< int64_t > &values, VarArrayConstantArrayExpressionType type)=0
virtual void InsertExprConstantExpression(IntExpr *const expression, IntExpr *const var, int64_t value, ExprConstantExpressionType type)=0
@ VAR_ARRAY_EXPRESSION_MAX
virtual IntExpr * FindExprExprExpression(IntExpr *const var1, IntExpr *const var2, ExprExprExpressionType type) const =0
Expr Expr Expressions.
virtual void InsertVarConstantConstantExpression(IntExpr *const expression, IntVar *const var, int64_t value1, int64_t value2, VarConstantConstantExpressionType type)=0
VarConstantArrayExpressionType
@ VAR_CONSTANT_ARRAY_EXPRESSION_MAX
virtual void InsertVarConstantConstantConstraint(Constraint *const ct, IntVar *const var, int64_t value1, int64_t value2, VarConstantConstantConstraintType type)=0
virtual Constraint * FindExprExprConstraint(IntExpr *const expr1, IntExpr *const expr2, ExprExprConstraintType type) const =0
Expr Expr Constraints.
virtual void InsertExprExpression(IntExpr *const expression, IntExpr *const expr, ExprExpressionType type)=0
virtual void InsertExprExprConstraint(Constraint *const ct, IntExpr *const expr1, IntExpr *const expr2, ExprExprConstraintType type)=0
void Decr(Solver *const s)
void Incr(Solver *const s)
This class encapsulates an objective.
Base class of the local search operators dedicated to path modifications (a path is a set of nodes li...
int64_t StartNode(int i) const
Returns the start node of the ith base node.
bool IsInactive(int64_t node) const
Returns true if node is inactive.
int64_t OldPrev(int64_t node) const
virtual bool ConsiderAlternatives(int64_t base_index) const
Indicates if alternatives should be considered when iterating over base nodes.
virtual bool MakeNeighbor()=0
int PathClass(int i) const
Returns the class of the path of the ith base node.
virtual void OnNodeInitialization()
Called by OnStart() after initializing node information.
virtual bool OnSamePathAsPreviousBase(int64_t base_index)
Returns true if a base node has to be on the same path as the "previous" base node (base node of inde...
int64_t OldPath(int64_t node) const
bool IsPathStart(int64_t node) const
Returns true if node is the first node on the path.
int64_t GetActiveAlternativeNode(int node) const
Returns the active node in the alternative set of the given node.
int number_of_nexts() const
Number of next variables.
int AddAlternativeSet(const std::vector< int64_t > &alternative_set)
Handling node alternatives.
const std::vector< int64_t > & path_starts() const
Returns the vector of path start nodes.
virtual bool RestartAtPathStartOnSynchronize()
When the operator is being synchronized with a new solution (when Start() is called),...
bool IsPathEnd(int64_t node) const
Returns true if node is the last node on the path; defined by the fact that node is outside the range...
int BaseSiblingAlternative(int i) const
Returns the alternative for the sibling of the ith base node.
int64_t Next(int64_t node) const
Returns the node after node in the current delta.
bool MoveChain(int64_t before_chain, int64_t chain_end, int64_t destination)
Moves the chain starting after the node before_chain and ending at the node chain_end after the node ...
bool MakeActive(int64_t node, int64_t destination)
Insert the inactive node after destination.
int BaseAlternative(int i) const
Returns the alternative for the ith base node.
bool ReverseChain(int64_t before_chain, int64_t after_chain, int64_t *chain_last)
Reverses the chain starting after before_chain and ending before after_chain.
std::vector< int64_t > start_to_path_
void SetNext(int64_t from, int64_t to, int64_t path)
Sets 'to' to be the node after 'from' on the given path.
void AddPairAlternativeSets(const std::vector< std::pair< std::vector< int64_t >, std::vector< int64_t > > > &pair_alternative_sets)
Adds all sets of node alternatives of a vector of alternative pairs.
int64_t BaseSiblingAlternativeNode(int i) const
Returns the alternative node for the sibling of the ith base node.
int64_t Prev(int64_t node) const
Returns the node before node in the current delta.
int64_t GetActiveAlternativeSibling(int node) const
Returns the active node in the alternative set of the sibling of the given node.
int64_t OldNext(int64_t node) const
bool SkipUnchanged(int index) const override
const int number_of_nexts_
bool SwapActiveAndInactive(int64_t active, int64_t inactive)
Replaces active by inactive in the current path, making active inactive.
void ResetPosition()
Reset the position of the operator to its position when Start() was last called; this can be used to ...
virtual int64_t GetBaseNodeRestartPosition(int base_index)
Returns the index of the node to which the base node of index base_index must be set to when it reach...
int64_t BaseNode(int i) const
Returns the ith base node of the operator.
PathOperator(const std::vector< IntVar * > &next_vars, const std::vector< IntVar * > &path_vars, int number_of_base_nodes, bool skip_locally_optimal_paths, bool accept_path_end_base, std::function< int(int64_t)> start_empty_path_class)
int next_base_to_increment_
int64_t BaseAlternativeNode(int i) const
Returns the alternative node for the ith base node.
int GetSiblingAlternativeIndex(int node) const
Returns the index of the alternative set of the sibling of node.
bool MakeOneNeighbor() override
This method should not be overridden. Override MakeNeighbor() instead.
int64_t Path(int64_t node) const
Returns the index of the path to which node belongs in the current delta.
virtual bool InitPosition() const
Returns true if the operator needs to restart its initial position at each call to Start()
const bool ignore_path_vars_
PathOperator(const std::vector< IntVar * > &next_vars, const std::vector< IntVar * > &path_vars, IterationParameters iteration_parameters)
Builds an instance of PathOperator from next and path variables.
virtual void SetNextBaseToIncrement(int64_t base_index)
Set the next base to increment on next iteration.
bool MakeChainInactive(int64_t before_chain, int64_t chain_end)
Makes the nodes on the chain starting after before_chain and ending at chain_end inactive.
bool operator!=(Iterator other) const
Chain(const CommittedNode *begin_node, const CommittedNode *end_node)
bool operator!=(Iterator other) const
ChainRange(const ChainBounds *const begin_chain, const ChainBounds *const end_chain, const CommittedNode *const first_node)
bool operator!=(Iterator other) const
NodeRange(const ChainBounds *begin_chain, const ChainBounds *end_chain, const CommittedNode *first_node)
const std::vector< int > & ChangedPaths() const
const std::vector< int > & ChangedLoops() const
int CommittedIndex(int node) const
ChainBounds CommittedPathRange(int path) const
void ChangePath(int path, const std::initializer_list< ChainBounds > &chains)
int Start(int path) const
virtual void SetValues(IntVar *const var, const std::vector< int64_t > &values)=0
virtual void SetDurationMax(IntervalVar *const var, int64_t new_max)=0
virtual void SetDurationRange(IntervalVar *const var, int64_t new_min, int64_t new_max)=0
virtual void SetMax(IntExpr *const expr, int64_t new_max)=0
virtual void RankLast(SequenceVar *const var, int index)=0
virtual void EndConstraintInitialPropagation(Constraint *const constraint)=0
virtual void SetMin(IntVar *const var, int64_t new_min)=0
IntVar modifiers.
virtual void RemoveValue(IntVar *const var, int64_t value)=0
virtual void SetValue(IntVar *const var, int64_t value)=0
virtual void SetDurationMin(IntervalVar *const var, int64_t new_min)=0
virtual void SetStartMin(IntervalVar *const var, int64_t new_min)=0
IntervalVar modifiers.
virtual void RankNotLast(SequenceVar *const var, int index)=0
virtual void RankNotFirst(SequenceVar *const var, int index)=0
virtual void BeginDemonRun(Demon *const demon)=0
virtual void SetRange(IntExpr *const expr, int64_t new_min, int64_t new_max)=0
virtual void RankSequence(SequenceVar *const var, const std::vector< int > &rank_first, const std::vector< int > &rank_last, const std::vector< int > &unperformed)=0
virtual void SetEndRange(IntervalVar *const var, int64_t new_min, int64_t new_max)=0
virtual void SetEndMax(IntervalVar *const var, int64_t new_max)=0
virtual void PushContext(const std::string &context)=0
virtual void RemoveInterval(IntVar *const var, int64_t imin, int64_t imax)=0
virtual void SetEndMin(IntervalVar *const var, int64_t new_min)=0
virtual void BeginNestedConstraintInitialPropagation(Constraint *const parent, Constraint *const nested)=0
virtual void EndNestedConstraintInitialPropagation(Constraint *const parent, Constraint *const nested)=0
virtual void SetMax(IntVar *const var, int64_t new_max)=0
virtual void SetPerformed(IntervalVar *const var, bool value)=0
virtual void StartProcessingIntegerVariable(IntVar *const var)=0
virtual void BeginConstraintInitialPropagation(Constraint *const constraint)=0
Propagation events.
virtual void SetRange(IntVar *const var, int64_t new_min, int64_t new_max)=0
virtual void SetMin(IntExpr *const expr, int64_t new_min)=0
IntExpr modifiers.
virtual void SetStartMax(IntervalVar *const var, int64_t new_max)=0
virtual void EndDemonRun(Demon *const demon)=0
virtual void RegisterDemon(Demon *const demon)=0
virtual void EndProcessingIntegerVariable(IntVar *const var)=0
virtual void PopContext()=0
virtual void RemoveValues(IntVar *const var, const std::vector< int64_t > &values)=0
std::string DebugString() const override
virtual void SetStartRange(IntervalVar *const var, int64_t new_min, int64_t new_max)=0
virtual void RankFirst(SequenceVar *const var, int index)=0
SequenceVar modifiers.
Matrix version of the RevBitSet class.
void SetToZero(Solver *const solver, int64_t row, int64_t column)
Erases the 'column' bit in the 'row' row.
bool IsSet(int64_t row, int64_t column) const
Returns whether the 'column' bit in the 'row' row is set.
void SetToOne(Solver *const solver, int64_t row, int64_t column)
Sets the 'column' bit in the 'row' row.
void ClearAll(Solver *const solver)
Cleans all bits.
int64_t GetFirstBit(int row, int start) const
Returns the first bit in the row 'row' which position is >= 'start'.
This class represents a reversible bitset.
void SetToOne(Solver *const solver, int64_t index)
Sets the 'index' bit.
bool IsCardinalityOne() const
Does it contains only one bit set?
void SetToZero(Solver *const solver, int64_t index)
Erases the 'index' bit.
int64_t Cardinality() const
Returns the number of bits set to one.
int64_t GetFirstBit(int start) const
Gets the index of the first bit set starting from start.
bool IsSet(int64_t index) const
Returns whether the 'index' bit is set.
void ClearAll(Solver *const solver)
Cleans all bits.
friend class RevBitMatrix
bool IsCardinalityZero() const
Is bitset null?
This class is a reversible growing array.
void RevInsert(Solver *const solver, int64_t index, T value)
T At(int64_t index) const
RevGrowingArray(int64_t block_size)
void SetValue(Solver *const s, const T &val)
Reversible Immutable MultiMap class.
void Insert(const K &key, const V &value)
Inserts (key, value) in the multi-map.
RevImmutableMultiMap(Solver *const solver, int initial_size)
const V & FindWithDefault(const K &key, const V &default_value) const
Returns one value attached to 'key', or 'default_value' if 'key' is not in the multi-map.
bool ContainsKey(const K &key) const
Returns true if the multi-map contains at least one instance of 'key'.
This is a special class to represent a 'residual' set of T.
void Insert(Solver *const solver, const T &elt)
RevIntSet(int capacity)
Capacity is the fixed size of the set (it cannot grow).
const_iterator begin() const
const T * const_iterator
Iterators on the indices.
T RemovedElement(int i) const
RevIntSet(int capacity, int *shared_positions, int shared_positions_size)
Capacity is the fixed size of the set (it cannot grow).
void Restore(Solver *const solver, const T &value_index)
const_iterator end() const
void Remove(Solver *const solver, const T &value_index)
void Clear(Solver *const solver)
--— RevPartialSequence --—
int NumLastRanked() const
RevPartialSequence(int size)
int NumFirstRanked() const
bool IsRanked(int elt) const
std::string DebugString() const
void RankLast(Solver *const solver, int elt)
const int & operator[](int index) const
void RankFirst(Solver *const solver, int elt)
RevPartialSequence(const std::vector< int > &items)
A reversible switch that can switch once from false to true.
void Switch(Solver *const solver)
The base class of all search logs that periodically outputs information when the search is running.
A search monitor is a simple set of callbacks to monitor all search events.
The SequenceVarElement stores a partial representation of ranked interval variables in the underlying...
void SetBackwardSequence(const std::vector< int > &backward_sequence)
const std::vector< int > & ForwardSequence() const
void SetForwardSequence(const std::vector< int > &forward_sequence)
SequenceVar * Var() const
A sequence variable is a variable whose domain is a set of possible orderings of the interval variabl...
void OnRevertChanges(int64_t index, const std::vector< int > &value)
bool ValueFromAssignment(const Assignment &assignment, SequenceVar *var, int64_t index, std::vector< int > *value)
SequenceVarLocalSearchHandler(const SequenceVarLocalSearchHandler &other)
SequenceVarLocalSearchHandler()
SequenceVarLocalSearchHandler(SequenceVarLocalSearchOperator *op)
void AddToAssignment(SequenceVar *var, const std::vector< int > &value, bool active, std::vector< int > *assignment_indices, int64_t index, Assignment *assignment) const
void SetBackwardSequence(int64_t index, const std::vector< int > &value)
void SetForwardSequence(int64_t index, const std::vector< int > &value)
~SequenceVarLocalSearchOperator() override
const std::vector< int > & Sequence(int64_t index) const
Returns the value in the current assignment of the variable of given index.
std::vector< std::vector< int > > backward_values_
SequenceVarLocalSearchOperator(const std::vector< SequenceVar * > &vars)
const std::vector< int > & OldSequence(int64_t index) const
SequenceVarLocalSearchOperator()
This iterator is not stable with respect to deletion.
Iterator(const SimpleRevFIFO< T > *l)
This class represent a reversible FIFO structure.
void SetLastValue(const T &v)
Sets the last value in the FIFO.
const T * Last() const
Returns the last item of the FIFO.
const T & LastValue() const
Returns the last value in the FIFO.
void PushIfNotTop(Solver *const s, T val)
Pushes the var on top if is not a duplicate of the current top object.
void Push(Solver *const s, T val)
This class represents a small reversible bitset (size <= 64).
bool IsCardinalityOne() const
Does it contains only one bit set?
int64_t Cardinality() const
Returns the number of bits set to one.
SmallRevBitSet(int64_t size)
void SetToZero(Solver *const solver, int64_t pos)
Erases the 'pos' bit.
bool IsCardinalityZero() const
Is bitset null?
int64_t GetFirstOne() const
Gets the index of the first bit set starting from 0.
void SetToOne(Solver *const solver, int64_t pos)
Sets the 'pos' bit.
DemonPriority
This enum represents the three possible priorities for a demon in the Solver queue.
@ DELAYED_PRIORITY
DELAYED_PRIORITY is the lowest priority: Demons will be processed after VAR_PRIORITY and NORMAL_PRIOR...
void SaveAndSetValue(T *adr, T val)
All-in-one SaveAndSetValue.
T * RevAlloc(T *object)
Registers the given object as being reversible.
void Set(IntegerType index)
const std::vector< IntegerType > & PositionsSetAtLeastOnce() const
void ClearAndResize(IntegerType size)
A symmetry breaker is an object that will visit a decision and create the 'symmetrical' decision in r...
~SymmetryBreaker() override
This class represents a reversible bitset.
int64_t word_size() const
Returns the number of 64 bit words used to store the bitset.
int64_t bit_size() const
Returns the number of bits given in the constructor of the bitset.
~UnsortedNullableRevBitset()
const RevIntSet< int > & active_words() const
Returns the set of active word indices.
bool Empty() const
This method returns true if the active bitset is null.
int ActiveWordSize() const
This method returns the number of non null 64 bit words in the bitset representation.
Base operator class for operators manipulating variables.
void Activate(int64_t index)
void RevertChanges(bool incremental)
void Deactivate(int64_t index)
std::vector< Val > old_values_
virtual bool SkipUnchanged(int index) const
void SetValue(int64_t index, const Val &value)
bool HoldsDelta() const override
std::vector< Val > values_
const Val & Value(int64_t index) const
Returns the value in the current assignment of the variable of given index.
SparseBitset delta_changes_
std::vector< Val > prev_values_
const Val & OldValue(int64_t index) const
std::vector< int > assignment_indices_
bool Activated(int64_t index) const
V * Var(int64_t index) const
Returns the variable of given index.
virtual bool IsIncremental() const
bool ApplyChanges(Assignment *delta, Assignment *deltadelta) const
VarLocalSearchOperator(Handler var_handler)
virtual void OnStart()
Called by Start() after synchronizing the operator with the current assignment.
void MarkChange(int64_t index)
OnStart() should really be protected, but then SWIG doesn't see it.
~VarLocalSearchOperator() override
void AddVars(const std::vector< V * > &vars)
void Start(const Assignment *assignment) override
This method should not be overridden.
std::vector< int64_t > to_remove_
SharedBoundsManager * bounds
GurobiMPCallbackContext * context
static const int64_t kint64max
static const int64_t kint64min
std::function< int64_t(const Model &)> Value(IntegerVariable v)
Collection of objects used to extend the Constraint Solver library.
std::string ParameterDebugString(P param)
bool IsArrayConstant(const std::vector< T > &values, const T &value)
bool AreAllLessOrEqual(const std::vector< T > &values, const T &value)
LocalSearchOperator * MakeLocalSearchOperator(Solver *solver, const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class)
Operator Factories.
LocalSearchFilter * MakeUnaryDimensionFilter(Solver *solver, std::unique_ptr< UnaryDimensionChecker > checker, const std::string &dimension_name)
Demon * MakeConstraintDemon3(Solver *const s, T *const ct, void(T::*method)(P, Q, R), const std::string &name, P param1, Q param2, R param3)
bool AreAllNegative(const std::vector< T > &values)
bool AreAllGreaterOrEqual(const std::vector< T > &values, const T &value)
bool IsIncreasing(const std::vector< T > &values)
bool AreAllStrictlyPositive(const std::vector< T > &values)
bool IsArrayBoolean(const std::vector< T > &values)
VarTypes
This enum is used internally to do dynamic typing on subclasses of integer variables.
bool AreAllBoundOrNull(const std::vector< IntVar * > &vars, const std::vector< T > &values)
Returns true if all the variables are assigned to a single value, or if their corresponding value is ...
int64_t MaxVarArray(const std::vector< IntVar * > &vars)
Demon * MakeConstraintDemon2(Solver *const s, T *const ct, void(T::*method)(P, Q), const std::string &name, P param1, Q param2)
Demon * MakeDelayedConstraintDemon0(Solver *const s, T *const ct, void(T::*method)(), const std::string &name)
Demon * MakeDelayedConstraintDemon2(Solver *const s, T *const ct, void(T::*method)(P, Q), const std::string &name, P param1, Q param2)
bool AreAllBoundTo(const std::vector< IntVar * > &vars, int64_t value)
Returns true if all variables are assigned to 'value'.
void FillValues(const std::vector< IntVar * > &vars, std::vector< int64_t > *const values)
bool AreAllBooleans(const std::vector< IntVar * > &vars)
bool AreAllStrictlyNegative(const std::vector< T > &values)
int64_t MinVarArray(const std::vector< IntVar * > &vars)
Demon * MakeConstraintDemon0(Solver *const s, T *const ct, void(T::*method)(), const std::string &name)
bool IsIncreasingContiguous(const std::vector< T > &values)
bool AreAllNull(const std::vector< T > &values)
bool AreAllPositive(const std::vector< T > &values)
std::vector< int64_t > ToInt64Vector(const std::vector< int > &input)
Demon * MakeDelayedConstraintDemon1(Solver *const s, T *const ct, void(T::*method)(P), const std::string &name, P param1)
VarLocalSearchOperator< SequenceVar, std::vector< int >, SequenceVarLocalSearchHandler > SequenceVarLocalSearchOperatorTemplate
int64_t PosIntDivDown(int64_t e, int64_t v)
bool IsArrayInRange(const std::vector< IntVar * > &vars, T range_min, T range_max)
static const int kUnassigned
Demon * MakeConstraintDemon1(Solver *const s, T *const ct, void(T::*method)(P), const std::string &name, P param1)
LocalSearchFilter * MakePathStateFilter(Solver *solver, std::unique_ptr< PathState > path_state, const std::vector< IntVar * > &nexts)
bool AreAllOnes(const std::vector< T > &values)
bool AreAllBound(const std::vector< IntVar * > &vars)
uint64_t Hash1(uint64_t value)
Hash functions.
void AcceptUncheckedNeighbor(Search *const search)
int64_t PosIntDivUp(int64_t e, int64_t v)
static int input(yyscan_t yyscanner)
std::optional< int64_t > end
LocalSearchFilter * filter
FilterEventType event_type
Set of parameters used to configure how the neighnorhood is traversed.
bool accept_path_end_base
True if path ends should be considered when iterating over neighbors.
int number_of_base_nodes
Number of nodes needed to define a neighbor.
std::function< int(int64_t)> start_empty_path_class
Callback returning an index such that if c1 = start_empty_path_class(StartNode(p1)),...
bool skip_locally_optimal_paths
Skip paths which have been proven locally optimal.
ChainBounds(int begin_index, int end_index)