 |
OR-Tools
8.0
|
Go to the documentation of this file.
49 #ifndef OR_TOOLS_CONSTRAINT_SOLVER_CONSTRAINT_SOLVERI_H_
50 #define OR_TOOLS_CONSTRAINT_SOLVER_CONSTRAINT_SOLVERI_H_
60 #include "absl/container/flat_hash_map.h"
61 #include "absl/strings/str_cat.h"
62 #include "absl/strings/str_format.h"
63 #include "absl/strings/str_join.h"
79 class CPArgumentProto;
80 class CPConstraintProto;
81 class CPIntegerExpressionProto;
82 class CPIntervalVariableProto;
111 explicit BaseIntExpr(Solver*
const s) : IntExpr(s), var_(nullptr) {}
114 IntVar*
Var()
override;
147 enum { CHUNK_SIZE = 16 };
150 const Chunk*
const next_;
151 explicit Chunk(
const Chunk*
next) : next_(
next) {}
159 : chunk_(l->chunks_), value_(l->
Last()) {}
160 bool ok()
const {
return (value_ !=
nullptr); }
164 if (value_ == chunk_->data_ + CHUNK_SIZE) {
165 chunk_ = chunk_->next_;
166 value_ = chunk_ ? chunk_->data_ :
nullptr;
177 void Push(Solver*
const s, T val) {
178 if (pos_.Value() == 0) {
179 Chunk*
const chunk = s->UnsafeRevAlloc(
new Chunk(chunks_));
180 s->SaveAndSetValue(
reinterpret_cast<void**
>(&chunks_),
181 reinterpret_cast<void*
>(chunk));
182 pos_.SetValue(s, CHUNK_SIZE - 1);
186 chunks_->data_[pos_.Value()] = val;
191 if (chunks_ ==
nullptr ||
LastValue() != val) {
198 return chunks_ ? &chunks_->data_[pos_.Value()] :
nullptr;
201 T*
MutableLast() {
return chunks_ ? &chunks_->data_[pos_.Value()] :
nullptr; }
206 return chunks_->data_[pos_.Value()];
212 chunks_->data_[pos_.Value()] = v;
217 NumericalRev<int> pos_;
235 a = (
a + 0x7ed55d16) + (
a << 12);
236 a = (
a ^ 0xc761c23c) ^ (
a >> 19);
237 a = (
a + 0x165667b1) + (
a << 5);
238 a = (
a + 0xd3a2646c) ^ (
a << 9);
239 a = (
a + 0xfd7046c5) + (
a << 3);
240 a = (
a ^ 0xb55a4f09) ^ (
a >> 16);
249 #if defined(__x86_64__) || defined(_M_X64) || defined(__powerpc64__) || \
261 }
else if (ptrs.size() == 1) {
262 return Hash1(ptrs[0]);
265 for (
int i = 1; i < ptrs.size(); ++i) {
275 }
else if (ptrs.size() == 1) {
276 return Hash1(ptrs[0]);
279 for (
int i = 1; i < ptrs.size(); ++i) {
288 template <
class K,
class V>
293 array_(solver->UnsafeRevAllocArray(new Cell*[initial_size])),
296 memset(array_, 0,
sizeof(*array_) * size_.Value());
306 Cell* tmp = array_[code];
308 if (tmp->key() == key) {
321 Cell* tmp = array_[code];
323 if (tmp->key() == key) {
328 return default_value;
333 const int position =
Hash1(key) % size_.Value();
335 solver_->UnsafeRevAlloc(
new Cell(key,
value, array_[position]));
336 solver_->SaveAndSetValue(
reinterpret_cast<void**
>(&array_[position]),
337 reinterpret_cast<void*
>(cell));
338 num_items_.Incr(solver_);
339 if (num_items_.Value() > 2 * size_.Value()) {
347 Cell(
const K& key,
const V&
value, Cell*
const next)
348 : key_(key), value_(
value), next_(
next) {}
350 void SetRevNext(Solver*
const solver, Cell*
const next) {
351 solver->SaveAndSetValue(
reinterpret_cast<void**
>(&next_),
352 reinterpret_cast<void*
>(
next));
355 Cell*
next()
const {
return next_; }
357 const K& key()
const {
return key_; }
359 const V&
value()
const {
return value_; }
368 Cell**
const old_cell_array = array_;
369 const int old_size = size_.Value();
370 size_.SetValue(solver_, size_.Value() * 2);
371 solver_->SaveAndSetValue(
372 reinterpret_cast<void**
>(&array_),
373 reinterpret_cast<void*
>(
374 solver_->UnsafeRevAllocArray(
new Cell*[size_.Value()])));
375 memset(array_, 0, size_.Value() *
sizeof(*array_));
376 for (
int i = 0; i < old_size; ++i) {
377 Cell* tmp = old_cell_array[i];
378 while (tmp !=
nullptr) {
379 Cell*
const to_reinsert = tmp;
381 const uint64 new_position =
Hash1(to_reinsert->key()) % size_.Value();
382 to_reinsert->SetRevNext(solver_, array_[new_position]);
383 solver_->SaveAndSetValue(
384 reinterpret_cast<void**
>(&array_[new_position]),
385 reinterpret_cast<void*
>(to_reinsert));
390 Solver*
const solver_;
392 NumericalRev<int> size_;
393 NumericalRev<int> num_items_;
403 void Switch(Solver*
const solver) { solver->SaveAndSetValue(&value_,
true); }
424 return (bits_.Value() != 0) && !(bits_.Value() & (bits_.Value() - 1));
457 void ClearAll(Solver*
const solver);
463 void Save(Solver*
const solver,
int offset);
483 DCHECK_LT(
row, rows_);
484 DCHECK_GE(column, 0);
485 DCHECK_LT(column, columns_);
498 void ClearAll(Solver*
const solver);
502 const int64 columns_;
516 : constraint_(
ct), method_(method), name_(
name) {}
520 void Run(Solver*
const s)
override { (constraint_->*method_)(); }
523 return "CallMethod_" + name_ +
"(" + constraint_->DebugString() +
")";
527 T*
const constraint_;
528 void (T::*
const method_)();
529 const std::string name_;
534 const std::string&
name) {
540 return absl::StrCat(param);
546 return param->DebugString();
550 template <
class T,
class P>
555 : constraint_(
ct), method_(method), name_(
name), param1_(param1) {}
559 void Run(Solver*
const s)
override { (constraint_->*method_)(param1_); }
562 return absl::StrCat(
"CallMethod_", name_,
"(", constraint_->DebugString(),
567 T*
const constraint_;
568 void (T::*
const method_)(P);
569 const std::string name_;
573 template <
class T,
class P>
575 const std::string&
name, P param1) {
580 template <
class T,
class P,
class Q>
593 void Run(Solver*
const s)
override {
594 (constraint_->*method_)(param1_, param2_);
598 return absl::StrCat(absl::StrCat(
"CallMethod_", name_),
599 absl::StrCat(
"(", constraint_->DebugString()),
605 T*
const constraint_;
606 void (T::*
const method_)(P, Q);
607 const std::string name_;
612 template <
class T,
class P,
class Q>
614 void (T::*method)(P, Q),
const std::string&
name,
615 P param1, Q param2) {
620 template <
class T,
class P,
class Q,
class R>
624 P param1, Q param2, R param3)
634 void Run(Solver*
const s)
override {
635 (constraint_->*method_)(param1_, param2_, param3_);
639 return absl::StrCat(absl::StrCat(
"CallMethod_", name_),
640 absl::StrCat(
"(", constraint_->DebugString()),
647 T*
const constraint_;
648 void (T::*
const method_)(P, Q, R);
649 const std::string name_;
655 template <
class T,
class P,
class Q,
class R>
657 void (T::*method)(P, Q, R),
const std::string&
name,
658 P param1, Q param2, R param3) {
674 : constraint_(
ct), method_(method), name_(
name) {}
678 void Run(Solver*
const s)
override { (constraint_->*method_)(); }
681 return Solver::DELAYED_PRIORITY;
685 return "DelayedCallMethod_" + name_ +
"(" + constraint_->DebugString() +
690 T*
const constraint_;
691 void (T::*
const method_)();
692 const std::string name_;
698 const std::string&
name) {
703 template <
class T,
class P>
708 : constraint_(
ct), method_(method), name_(
name), param1_(param1) {}
712 void Run(Solver*
const s)
override { (constraint_->*method_)(param1_); }
715 return Solver::DELAYED_PRIORITY;
719 return absl::StrCat(
"DelayedCallMethod_", name_,
"(",
720 constraint_->DebugString(),
", ",
725 T*
const constraint_;
726 void (T::*
const method_)(P);
727 const std::string name_;
731 template <
class T,
class P>
733 void (T::*method)(P),
734 const std::string&
name, P param1) {
739 template <
class T,
class P,
class Q>
743 const std::string&
name, P param1, Q param2)
752 void Run(Solver*
const s)
override {
753 (constraint_->*method_)(param1_, param2_);
757 return Solver::DELAYED_PRIORITY;
761 return absl::StrCat(absl::StrCat(
"DelayedCallMethod_", name_),
762 absl::StrCat(
"(", constraint_->DebugString()),
768 T*
const constraint_;
769 void (T::*
const method_)(P, Q);
770 const std::string name_;
775 template <
class T,
class P,
class Q>
777 void (T::*method)(P, Q),
778 const std::string&
name, P param1,
785 #endif // !defined(SWIG)
811 virtual void Start(
const Assignment* assignment) = 0;
821 template <
class V,
class Val,
class Handler>
834 void Start(
const Assignment* assignment)
override {
835 const int size =
Size();
836 CHECK_LE(size, assignment->Size())
837 <<
"Assignment contains fewer variables than operator";
838 for (
int i = 0; i < size; ++i) {
911 vars_.insert(
vars_.end(), vars.begin(), vars.end());
961 std::vector<int>* assignment_indices,
int64 index,
962 Assignment* assignment)
const {
963 Assignment::IntContainer*
const container =
964 assignment->MutableIntVarContainer();
965 IntVarElement* element =
nullptr;
966 if (assignment_indices !=
nullptr) {
967 if ((*assignment_indices)[
index] == -1) {
968 (*assignment_indices)[
index] = container->Size();
969 element = assignment->FastAdd(
var);
971 element = container->MutableElement((*assignment_indices)[
index]);
974 element = assignment->FastAdd(
var);
977 element->SetValue(
value);
980 element->Deactivate();
1006 #if defined(SWIGPYTHON)
1007 %unignore VarLocalSearchOperator<IntVar,
int64,
1008 IntVarLocalSearchHandler>::Size;
1009 %unignore VarLocalSearchOperator<IntVar,
int64,
1010 IntVarLocalSearchHandler>
::Value;
1011 %unignore VarLocalSearchOperator<IntVar,
int64,
1012 IntVarLocalSearchHandler>::OldValue;
1013 %unignore VarLocalSearchOperator<IntVar,
int64,
1014 IntVarLocalSearchHandler>::SetValue;
1015 %feature(
"director") VarLocalSearchOperator<IntVar,
int64,
1016 IntVarLocalSearchHandler>::IsIncremental;
1017 %feature("director") VarLocalSearchOperator<IntVar,
int64,
1018 IntVarLocalSearchHandler>::OnStart;
1019 %unignore VarLocalSearchOperator<IntVar,
int64,
1020 IntVarLocalSearchHandler>::IsIncremental;
1021 %unignore VarLocalSearchOperator<IntVar,
int64,
1022 IntVarLocalSearchHandler>::OnStart;
1023 #endif // SWIGPYTHON
1026 %rename(IntVarLocalSearchOperatorTemplate)
1027 VarLocalSearchOperator<IntVar, int64, IntVarLocalSearchHandler>;
1028 %
template(IntVarLocalSearchOperatorTemplate)
1029 VarLocalSearchOperator<IntVar, int64, IntVarLocalSearchHandler>;
1041 bool keep_inverse_values =
false)
1044 max_inverse_value_(keep_inverse_values ? vars.size() - 1 : -1) {
1046 if (keep_inverse_values) {
1047 int64 max_value = -1;
1048 for (
const IntVar*
const var : vars) {
1051 inverse_values_.resize(max_value + 1, -1);
1052 old_inverse_values_.resize(max_value + 1, -1);
1062 bool MakeNextNeighbor(Assignment*
delta, Assignment* deltadelta)
override;
1071 virtual bool MakeOneNeighbor();
1074 DCHECK_GE(
index, 0);
1075 return index <= max_inverse_value_;
1081 return old_inverse_values_[
index];
1093 const int64 max_inverse_value_;
1094 std::vector<int64> old_inverse_values_;
1095 std::vector<int64> inverse_values_;
1100 const Assignment::IntContainer& container = assignment.IntVarContainer();
1101 const IntVarElement* element = &(container.Element(
index));
1102 if (element->Var() !=
var) {
1103 CHECK(container.Contains(
var))
1104 <<
"Assignment does not contain operator variable " <<
var;
1105 element = &(container.Element(
var));
1107 *
value = element->Value();
1112 return element->Activated();
1132 void AddToAssignment(SequenceVar*
var,
const std::vector<int>&
value,
1133 bool active, std::vector<int>* assignment_indices,
1135 bool ValueFromAssignment(
const Assignment& assignment, SequenceVar*
var,
1152 SequenceVar, std::vector<int>, SequenceVarLocalSearchHandler>;
1154 SequenceVar, std::vector<int>, SequenceVarLocalSearchHandler>;
1158 typedef VarLocalSearchOperator<SequenceVar, std::vector<int>,
1159 SequenceVarLocalSearchHandler>
1193 SequenceVar*
var,
const std::vector<int>&
value,
bool active,
1194 std::vector<int>* assignment_indices,
int64 index,
1195 Assignment* assignment)
const {
1196 Assignment::SequenceContainer*
const container =
1197 assignment->MutableSequenceVarContainer();
1198 SequenceVarElement* element =
nullptr;
1199 if (assignment_indices !=
nullptr) {
1200 if ((*assignment_indices)[
index] == -1) {
1201 (*assignment_indices)[
index] = container->Size();
1202 element = assignment->FastAdd(
var);
1204 element = container->MutableElement((*assignment_indices)[
index]);
1207 element = assignment->FastAdd(
var);
1210 element->SetForwardSequence(
value);
1212 element->Activate();
1214 element->Deactivate();
1219 const Assignment& assignment, SequenceVar*
var,
int64 index,
1220 std::vector<int>*
value) {
1221 const Assignment::SequenceContainer& container =
1222 assignment.SequenceVarContainer();
1223 const SequenceVarElement* element = &(container.Element(
index));
1224 if (element->Var() !=
var) {
1225 CHECK(container.Contains(
var))
1226 <<
"Assignment does not contain operator variable " <<
var;
1227 element = &(container.Element(
var));
1229 const std::vector<int>& element_value = element->ForwardSequence();
1230 CHECK_GE(
var->size(), element_value.size());
1232 *
value = element_value;
1233 return element->Activated();
1274 explicit BaseLns(
const std::vector<IntVar*>& vars);
1288 void OnStart()
override;
1289 std::vector<int> fragment_;
1298 explicit ChangeValue(
const std::vector<IntVar*>& vars);
1307 void OnStart()
override;
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)> start_empty_path_class);
1346 void Reset()
override;
1388 const int alternative_index = alternative_index_[
BaseNode(i)];
1389 return alternative_index >= 0
1390 ? alternative_sets_[alternative_index][base_alternatives_[i]]
1395 return base_sibling_alternatives_[i];
1400 const int sibling_alternative_index =
1402 return sibling_alternative_index >= 0
1403 ? alternative_sets_[sibling_alternative_index]
1404 [base_sibling_alternatives_[i]]
1410 const std::vector<int64>&
path_starts()
const {
return path_starts_; }
1413 return start_empty_path_class_ !=
nullptr
1499 return !
IsPathEnd(node) && inactives_[node];
1514 const int alternative = alternative_sets_.size();
1515 for (
int64 node : alternative_set) {
1516 DCHECK_EQ(-1, alternative_index_[node]);
1517 alternative_index_[node] = alternative;
1519 alternative_sets_.push_back(alternative_set);
1520 sibling_alternative_.push_back(-1);
1527 const std::vector<std::pair<std::vector<int64>, std::vector<int64>>>&
1528 pair_alternative_sets) {
1529 for (
const auto& pair_alternative_set : pair_alternative_sets) {
1531 sibling_alternative_.back() = alternative + 1;
1538 return alternative_index >= 0
1539 ? active_in_alternative_set_[alternative_index]
1548 if (node >= alternative_index_.size())
return -1;
1549 const int alternative = alternative_index_[node];
1550 return alternative >= 0 ? sibling_alternative_[alternative] : -1;
1555 if (node >= alternative_index_.size())
return -1;
1556 const int alternative = alternative_index_[node];
1557 const int sibling_alternative =
1558 alternative >= 0 ? sibling_alternative_[alternative] : -1;
1564 int64 exclude)
const;
1573 void OnStart()
override;
1575 bool OnSamePath(
int64 node1,
int64 node2)
const;
1577 bool CheckEnds()
const {
1578 const int base_node_size = base_nodes_.size();
1579 for (
int i = base_node_size - 1; i >= 0; --i) {
1580 if (base_nodes_[i] != end_nodes_[i]) {
1586 bool IncrementPosition();
1587 void InitializePathStarts();
1588 void InitializeInactives();
1589 void InitializeBaseNodes();
1590 void InitializeAlternatives();
1593 std::vector<int> base_nodes_;
1594 std::vector<int> base_alternatives_;
1595 std::vector<int> base_sibling_alternatives_;
1596 std::vector<int> end_nodes_;
1597 std::vector<int> base_paths_;
1598 std::vector<int64> path_starts_;
1599 std::vector<bool> inactives_;
1602 const bool accept_path_end_base_;
1603 std::function<int(
int64)> start_empty_path_class_;
1604 bool skip_locally_optimal_paths_;
1605 bool optimal_paths_enabled_;
1606 std::vector<int> path_basis_;
1607 std::vector<bool> optimal_paths_;
1610 std::vector<std::vector<int64>> alternative_sets_;
1612 std::vector<int> alternative_index_;
1613 std::vector<int64> active_in_alternative_set_;
1614 std::vector<int> sibling_alternative_;
1620 Solver* solver,
const std::vector<IntVar*>& vars,
1621 const std::vector<IntVar*>& secondary_vars,
1622 std::function<
int(
int64)> start_empty_path_class);
1630 class MakeActiveOperator;
1631 class MakeInactiveOperator;
1632 class MakeChainInactiveOperator;
1633 class SwapActiveOperator;
1634 class ExtendedSwapActiveOperator;
1635 class MakeActiveAndRelocate;
1636 class RelocateAndMakeActiveOperator;
1637 class RelocateAndMakeInactiveOperator;
1651 class LocalSearchVariable;
1667 void RelaxVariableBounds(
int variable_index);
1668 bool TightenVariableMin(
int variable_index,
int64 value);
1669 bool TightenVariableMax(
int variable_index,
int64 value);
1670 int64 VariableMin(
int variable_index)
const;
1671 int64 VariableMax(
int variable_index)
const;
1673 std::vector<Bounds> initial_variable_bounds_;
1674 std::vector<Bounds> variable_bounds_;
1675 std::vector<std::pair<Bounds, int>> saved_variable_bounds_trail_;
1676 std::vector<bool> variable_is_relaxed_;
1677 bool state_is_valid_ =
true;
1687 int64 Min()
const {
return state_->VariableMin(variable_index_); }
1688 int64 Max()
const {
return state_->VariableMax(variable_index_); }
1690 return state_->TightenVariableMin(variable_index_, new_min);
1693 return state_->TightenVariableMax(variable_index_, new_max);
1695 void Relax() { state_->RelaxVariableBounds(variable_index_); }
1702 : state_(state), variable_index_(variable_index) {}
1705 const int variable_index_;
1707 #endif // !defined(SWIG)
1729 virtual void Relax(
const Assignment*
delta,
const Assignment* deltadelta) {}
1731 virtual void Commit(
const Assignment*
delta,
const Assignment* deltadelta) {}
1742 virtual bool Accept(
const Assignment*
delta,
const Assignment* deltadelta,
1743 int64 objective_min,
int64 objective_max) = 0;
1752 const Assignment*
delta) = 0;
1777 return "LocalSearchFilterManager";
1793 const Assignment* deltadelta,
int64 objective_min,
1794 int64 objective_max);
1801 void InitializeForcedEvents();
1803 std::vector<FilterEvent> filter_events_;
1804 int last_event_called_ = -1;
1809 std::vector<int> next_forced_events_;
1810 int64 synchronized_value_;
1811 int64 accepted_value_;
1821 const Assignment*
delta)
override;
1824 DCHECK(
index !=
nullptr);
1825 const int var_index =
var->index();
1826 *
index = (var_index < var_index_to_index_.size())
1827 ? var_index_to_index_[var_index]
1829 return *
index != kUnassigned;
1833 void AddVars(
const std::vector<IntVar*>& vars);
1834 int Size()
const {
return vars_.size(); }
1838 return values_[
index];
1847 std::vector<IntVar*> vars_;
1848 std::vector<int64> values_;
1849 std::vector<bool> var_synced_;
1850 std::vector<int> var_index_to_index_;
1851 static const int kUnassigned;
1858 std::string
DebugString()
const override {
return "PropagationMonitor"; }
1862 Constraint*
const constraint) = 0;
1864 Constraint*
const constraint) = 0;
1866 Constraint*
const parent, Constraint*
const nested) = 0;
1868 Constraint*
const parent, Constraint*
const nested) = 0;
1888 const std::vector<int64>& values) = 0;
1890 const std::vector<int64>& values) = 0;
1911 const std::vector<int>& rank_first,
1912 const std::vector<int>& rank_last,
1913 const std::vector<int>& unperformed) = 0;
1923 std::string
DebugString()
const override {
return "LocalSearchMonitor"; }
1930 bool neighbor_found,
const Assignment*
delta,
1931 const Assignment* deltadelta) = 0;
1934 bool neighbor_found) = 0;
1937 bool neighbor_found) = 0;
1982 std::string
BaseName()
const override {
return "BooleanVar"; }
2000 : symmetry_manager_(nullptr), index_in_symmetry_manager_(-1) {}
2011 CHECK(symmetry_manager_ ==
nullptr);
2012 CHECK_EQ(-1, index_in_symmetry_manager_);
2013 symmetry_manager_ = manager;
2014 index_in_symmetry_manager_ =
index;
2016 SymmetryManager* symmetry_manager()
const {
return symmetry_manager_; }
2017 int index_in_symmetry_manager()
const {
return index_in_symmetry_manager_; }
2021 int index_in_symmetry_manager_;
2028 SearchLog(Solver*
const s, OptimizeVar*
const obj, IntVar*
const var,
2029 double scaling_factor,
double offset,
2030 std::function<std::string()> display_callback,
int period);
2048 virtual void OutputLine(
const std::string& line);
2051 static std::string MemoryUsage();
2054 std::unique_ptr<WallTimer> timer_;
2056 OptimizeVar*
const obj_;
2057 const double scaling_factor_;
2058 const double offset_;
2059 std::function<std::string()> display_callback_;
2062 int64 objective_min_;
2063 int64 objective_max_;
2064 int min_right_depth_;
2066 int sliding_min_depth_;
2067 int sliding_max_depth_;
2204 IntExpr*
const expr1, IntExpr*
const expr2,
2208 IntExpr*
const expr1,
2209 IntExpr*
const expr2,
2218 IntExpr*
const expr,
2234 IntExpr*
const var1, IntExpr*
const var2,
2238 IntExpr*
const var1,
2239 IntExpr*
const var2,
2245 IntExpr*
const var1, IntExpr*
const var2,
int64 constant,
2249 IntExpr*
const expression, IntExpr*
const var1, IntExpr*
const var2,
2259 IntExpr*
const expression, IntVar*
const var,
int64 value1,
int64 value2,
2265 IntVar*
const var,
const std::vector<int64>& values,
2269 IntExpr*
const expression, IntVar*
const var,
2270 const std::vector<int64>& values,
2279 const std::vector<IntVar*>& vars,
2285 const std::vector<IntVar*>& vars,
const std::vector<int64>& values,
2289 IntExpr*
const expression,
const std::vector<IntVar*>&
var,
2290 const std::vector<int64>& values,
2296 const std::vector<IntVar*>& vars,
int64 value,
2300 IntExpr*
const expression,
const std::vector<IntVar*>&
var,
int64 value,
2306 Solver*
const solver_;
2314 const std::string&
TypeName()
const;
2320 const std::vector<int64>& values);
2324 IntExpr*
const expr);
2326 const std::vector<IntVar*>& vars);
2329 const std::vector<IntervalVar*>& vars);
2332 const std::vector<SequenceVar*>& vars);
2343 const std::string& arg_name)
const;
2345 const std::string& arg_name)
const;
2348 const std::string& arg_name)
const;
2350 const std::string& arg_name)
const;
2353 std::string type_name_;
2354 absl::flat_hash_map<std::string, int64> integer_argument_;
2355 absl::flat_hash_map<std::string, std::vector<int64>> integer_array_argument_;
2356 absl::flat_hash_map<std::string, IntTupleSet> matrix_argument_;
2357 absl::flat_hash_map<std::string, IntExpr*> integer_expression_argument_;
2358 absl::flat_hash_map<std::string, IntervalVar*> interval_argument_;
2359 absl::flat_hash_map<std::string, SequenceVar*> sequence_argument_;
2360 absl::flat_hash_map<std::string, std::vector<IntVar*>>
2361 integer_variable_array_argument_;
2362 absl::flat_hash_map<std::string, std::vector<IntervalVar*>>
2363 interval_array_argument_;
2364 absl::flat_hash_map<std::string, std::vector<SequenceVar*>>
2365 sequence_array_argument_;
2377 void EndVisitModel(
const std::string& solver_name)
override;
2379 const Constraint*
const constraint)
override;
2381 const Constraint*
const constraint)
override;
2383 const IntExpr*
const expr)
override;
2385 const IntExpr*
const expr)
override;
2387 IntExpr*
const delegate)
override;
2390 IntVar*
const delegate)
override;
2393 IntervalVar*
const delegate)
override;
2398 const std::vector<int64>& values)
override;
2403 IntExpr*
const argument)
override;
2405 const std::string& arg_name,
2406 const std::vector<IntVar*>& arguments)
override;
2409 IntervalVar*
const argument)
override;
2411 const std::string& arg_name,
2412 const std::vector<IntervalVar*>& arguments)
override;
2415 SequenceVar*
const argument)
override;
2417 const std::string& arg_name,
2418 const std::vector<SequenceVar*>& arguments)
override;
2426 std::vector<ArgumentHolder*> holders_;
2433 : index_min_(index_min),
2434 index_max_(index_max),
2435 values_(new T[index_max - index_min + 1]) {
2436 DCHECK_LE(index_min, index_max);
2442 DCHECK_GE(
index, index_min_);
2443 DCHECK_LE(
index, index_max_);
2444 return values_[
index - index_min_];
2448 DCHECK_GE(
index, index_min_);
2449 DCHECK_LE(
index, index_max_);
2453 std::string
DebugString()
const override {
return "ArrayWithOffset"; }
2456 const int64 index_min_;
2457 const int64 index_max_;
2458 std::unique_ptr<T[]> values_;
2466 template <
class T,
class C>
2470 : block_size_(block_size), block_offset_(0) {
2471 CHECK_GT(block_size, 0);
2475 for (
int i = 0; i < elements_.size(); ++i) {
2476 delete[] elements_[i];
2481 const int64 block_index = ComputeBlockIndex(
index);
2482 const int64 relative_index = block_index - block_offset_;
2483 if (relative_index < 0 || relative_index >= elements_.size()) {
2486 const T* block = elements_[relative_index];
2487 return block !=
nullptr ? block[
index - block_index * block_size_] : T();
2491 const int64 block_index = ComputeBlockIndex(
index);
2492 T*
const block = GetOrCreateBlock(block_index);
2493 const int64 residual =
index - block_index * block_size_;
2494 solver->SaveAndSetValue(
reinterpret_cast<C*
>(&block[residual]),
2495 reinterpret_cast<C
>(
value));
2499 T* NewBlock()
const {
2500 T*
const result =
new T[block_size_];
2501 for (
int i = 0; i < block_size_; ++i) {
2507 T* GetOrCreateBlock(
int block_index) {
2508 if (elements_.size() == 0) {
2509 block_offset_ = block_index;
2510 GrowUp(block_index);
2511 }
else if (block_index < block_offset_) {
2512 GrowDown(block_index);
2513 }
else if (block_index - block_offset_ >= elements_.size()) {
2514 GrowUp(block_index);
2516 T* block = elements_[block_index - block_offset_];
2517 if (block ==
nullptr) {
2519 elements_[block_index - block_offset_] = block;
2526 : (
value - block_size_ + 1) / block_size_;
2529 void GrowUp(
int64 block_index) {
2530 elements_.resize(block_index - block_offset_ + 1);
2533 void GrowDown(
int64 block_index) {
2534 const int64 delta = block_offset_ - block_index;
2535 block_offset_ = block_index;
2536 DCHECK_GT(
delta, 0);
2537 elements_.insert(elements_.begin(),
delta,
nullptr);
2540 const int64 block_size_;
2541 std::vector<T*> elements_;
2560 delete_position_(true) {
2561 for (
int i = 0; i <
capacity; ++i) {
2571 position_(shared_positions),
2572 delete_position_(false) {
2573 for (
int i = 0; i < shared_positions_size; ++i) {
2579 if (delete_position_) {
2584 int Size()
const {
return num_elements_.Value(); }
2590 DCHECK_LT(i, num_elements_.Value());
2591 return elements_[i];
2596 DCHECK_LT(i + num_elements_.Value(), capacity_);
2597 return elements_[i + num_elements_.Value()];
2600 void Insert(Solver*
const solver,
const T& elt) {
2601 const int position = num_elements_.Value();
2602 DCHECK_LT(position, capacity_);
2603 DCHECK(NotAlreadyInserted(elt));
2604 elements_[position] = elt;
2605 position_[elt] = position;
2606 num_elements_.Incr(solver);
2609 void Remove(Solver*
const solver,
const T& value_index) {
2610 num_elements_.Decr(solver);
2611 SwapTo(value_index, num_elements_.Value());
2614 void Restore(Solver*
const solver,
const T& value_index) {
2615 SwapTo(value_index, num_elements_.Value());
2616 num_elements_.Incr(solver);
2619 void Clear(Solver*
const solver) { num_elements_.SetValue(solver, 0); }
2628 bool NotAlreadyInserted(
const T& elt) {
2629 for (
int i = 0; i < num_elements_.Value(); ++i) {
2630 if (elt == elements_[i]) {
2637 void SwapTo(T value_index,
int next_position) {
2638 const int current_position = position_[value_index];
2639 if (current_position != next_position) {
2640 const T next_value_index = elements_[next_position];
2641 elements_[current_position] = next_value_index;
2642 elements_[next_position] = value_index;
2643 position_[value_index] = next_position;
2644 position_[next_value_index] = current_position;
2649 std::unique_ptr<T[]> elements_;
2651 NumericalRev<int> num_elements_;
2653 const int capacity_;
2657 const bool delete_position_;
2667 last_ranked_(items.size() - 1),
2668 size_(items.size()),
2669 position_(new int[size_]) {
2670 for (
int i = 0; i < size_; ++i) {
2671 elements_[i] = items[i];
2679 last_ranked_(size - 1),
2681 position_(new int[size_]) {
2682 for (
int i = 0; i < size_; ++i) {
2698 DCHECK_GE(
index, 0);
2699 DCHECK_LT(
index, size_);
2700 return elements_[
index];
2705 DCHECK_LE(first_ranked_.Value(), last_ranked_.Value());
2706 SwapTo(elt, first_ranked_.Value());
2707 first_ranked_.Incr(solver);
2711 DCHECK_LE(first_ranked_.Value(), last_ranked_.Value());
2712 SwapTo(elt, last_ranked_.Value());
2713 last_ranked_.Decr(solver);
2717 const int position = position_[elt];
2718 return (position < first_ranked_.Value() ||
2719 position > last_ranked_.Value());
2723 std::string result =
"[";
2724 for (
int i = 0; i < first_ranked_.Value(); ++i) {
2725 absl::StrAppend(&result, elements_[i]);
2726 if (i != first_ranked_.Value() - 1) {
2731 for (
int i = first_ranked_.Value(); i <= last_ranked_.Value(); ++i) {
2732 absl::StrAppend(&result, elements_[i]);
2733 if (i != last_ranked_.Value()) {
2738 for (
int i = last_ranked_.Value() + 1; i < size_; ++i) {
2739 absl::StrAppend(&result, elements_[i]);
2740 if (i != size_ - 1) {
2749 void SwapTo(
int elt,
int next_position) {
2750 const int current_position = position_[elt];
2751 if (current_position != next_position) {
2752 const int next_elt = elements_[next_position];
2753 elements_[current_position] = next_elt;
2754 elements_[next_position] = elt;
2755 position_[elt] = next_position;
2756 position_[next_elt] = current_position;
2761 std::vector<int> elements_;
2763 NumericalRev<int> first_ranked_;
2765 NumericalRev<int> last_ranked_;
2769 std::unique_ptr<int[]> position_;
2785 void Init(Solver*
const solver,
const std::vector<uint64>& mask);
2789 bool RevSubtract(Solver*
const solver,
const std::vector<uint64>& mask);
2793 bool RevAnd(Solver*
const solver,
const std::vector<uint64>& mask);
2809 bool Intersects(
const std::vector<uint64>& mask,
int* support_index);
2819 void CleanUpActives(Solver*
const solver);
2821 const int64 bit_size_;
2822 const int64 word_size_;
2823 RevArray<uint64> bits_;
2825 std::vector<int> to_remove_;
2830 for (
int i = 0; i < values.size(); ++i) {
2831 if (values[i] !=
value) {
2840 for (
int i = 0; i < values.size(); ++i) {
2841 if (values[i] != 0 && values[i] != 1) {
2860 for (
const T& current_value : values) {
2861 if (current_value <
value) {
2870 for (
const T& current_value : values) {
2871 if (current_value >
value) {
2900 for (
int i = 0; i < values.size() - 1; ++i) {
2901 if (values[i + 1] != values[i] + 1) {
2910 for (
int i = 0; i < values.size() - 1; ++i) {
2911 if (values[i + 1] < values[i]) {
2921 for (
int i = 0; i < vars.size(); ++i) {
2922 if (vars[i]->Min() < range_min || vars[i]->Max() > range_max) {
2930 for (
int i = 0; i < vars.size(); ++i) {
2931 if (!vars[i]->Bound()) {
2946 const std::vector<T>& values) {
2947 for (
int i = 0; i < vars.size(); ++i) {
2948 if (values[i] != 0 && !vars[i]->Bound()) {
2957 for (
int i = 0; i < vars.size(); ++i) {
2958 if (!vars[i]->Bound() || vars[i]->Min() !=
value) {
2966 DCHECK(!vars.empty());
2968 for (
int i = 0; i < vars.size(); ++i) {
2970 result = std::max<int64>(result, vars[i]->Max());
2976 DCHECK(!vars.empty());
2978 for (
int i = 0; i < vars.size(); ++i) {
2980 result = std::min<int64>(result, vars[i]->Min());
2986 std::vector<int64>*
const values) {
2988 values->resize(vars.size());
2989 for (
int i = 0; i < vars.size(); ++i) {
2990 (*values)[i] = vars[i]->Value();
2997 return e % v == 0 ? e / v : e / v + 1;
3008 return e % v == 0 ? e / v : e / v - 1;
3074 PathState(
int num_nodes, std::vector<int> path_start,
3075 std::vector<int> path_end);
3084 int Start(
int path)
const {
return path_start_end_[path].start; }
3086 int End(
int path)
const {
return path_start_end_[path].end; }
3092 return committed_nodes_[committed_index_[node]].path;
3097 return changed_arcs_;
3103 ChainRange
Chains(
int path)
const;
3105 NodeRange
Nodes(
int path)
const;
3112 changed_arcs_.emplace_back(node, new_next);
3128 struct PathStartEnd {
3129 PathStartEnd(
int start,
int end) : start(start), end(end) {}
3138 struct ChainBounds {
3139 ChainBounds() =
default;
3140 ChainBounds(
int begin_index,
int end_index)
3141 : begin_index(begin_index), end_index(end_index) {}
3145 struct CommittedNode {
3146 CommittedNode(
int node,
int path) : node(node), path(path) {}
3154 struct TailHeadIndices {
3161 bool operator<(
const IndexArc& other)
const {
return index < other.index; }
3166 void CopyNewPathAtEndOfNodes(
int path);
3169 void IncrementalCommit();
3175 const int num_nodes_;
3176 const int num_paths_;
3177 std::vector<PathStartEnd> path_start_end_;
3204 std::vector<CommittedNode> committed_nodes_;
3205 std::vector<int> committed_index_;
3206 const int num_nodes_threshold_;
3207 std::vector<ChainBounds> chains_;
3208 std::vector<PathBounds> paths_;
3212 std::vector<std::pair<int, int>> changed_arcs_;
3213 std::vector<int> changed_paths_;
3214 std::vector<bool> path_has_changed_;
3218 std::vector<TailHeadIndices> tail_head_indices_;
3219 std::vector<IndexArc> arcs_by_tail_index_;
3220 std::vector<IndexArc> arcs_by_head_index_;
3221 std::vector<int> next_arc_;
3235 return current_node_ != other.current_node_;
3241 explicit Iterator(
const CommittedNode* node) : current_node_(node) {}
3242 const CommittedNode* current_node_;
3247 Chain(
const CommittedNode* begin_node,
const CommittedNode* end_node)
3248 : begin_(begin_node), end_(end_node) {}
3251 int First()
const {
return begin_->node; }
3252 int Last()
const {
return (end_ - 1)->node; }
3257 const CommittedNode*
const begin_;
3258 const CommittedNode*
const end_;
3271 return {first_node_ + current_chain_->begin_index,
3272 first_node_ + current_chain_->end_index};
3275 return current_chain_ != other.current_chain_;
3281 Iterator(
const ChainBounds* chain,
const CommittedNode*
const first_node)
3282 : current_chain_(chain), first_node_(first_node) {}
3283 const ChainBounds* current_chain_;
3284 const CommittedNode*
const first_node_;
3290 const ChainBounds*
const end_chain,
3291 const CommittedNode*
const first_node)
3292 : begin_(begin_chain), end_(end_chain), first_node_(first_node) {}
3298 const ChainBounds*
const begin_;
3299 const ChainBounds*
const end_;
3300 const CommittedNode*
const first_node_;
3311 if (current_node_ == end_node_) {
3315 const ChainBounds
bounds = *current_chain_;
3316 current_node_ = first_node_ +
bounds.begin_index;
3317 end_node_ = first_node_ +
bounds.end_index;
3323 return current_chain_ != other.current_chain_;
3329 Iterator(
const ChainBounds* current_chain,
3330 const CommittedNode*
const first_node)
3331 : current_node_(first_node + current_chain->begin_index),
3332 end_node_(first_node + current_chain->end_index),
3333 current_chain_(current_chain),
3334 first_node_(first_node) {}
3335 const CommittedNode* current_node_;
3336 const CommittedNode* end_node_;
3337 const ChainBounds* current_chain_;
3338 const CommittedNode*
const first_node_;
3343 NodeRange(
const ChainBounds* begin_chain,
const ChainBounds* end_chain,
3344 const CommittedNode* first_node)
3345 : begin_chain_(begin_chain),
3346 end_chain_(end_chain),
3347 first_node_(first_node) {}
3354 const ChainBounds* begin_chain_;
3355 const ChainBounds* end_chain_;
3356 const CommittedNode*
const first_node_;
3381 std::vector<Interval> path_capacity,
3382 std::vector<int> path_class,
3383 std::vector<std::vector<Interval>>
demand,
3384 std::vector<Interval> node_capacity);
3400 Interval GetMinMaxPartialDemandSum(
int first_node_index,
3401 int last_node_index)
const;
3407 bool SubpathOnlyHasTrivialNodes(
int first_node_index,
3408 int last_node_index)
const;
3414 void IncrementalCommit();
3417 void AppendPathDemandsToSums(
int path);
3423 void UpdateRMQStructure(
int begin_index,
int end_index);
3426 const std::vector<Interval> path_capacity_;
3427 const std::vector<int> path_class_;
3428 const std::vector<std::vector<Interval>> demand_;
3429 const std::vector<Interval> node_capacity_;
3435 std::vector<int> index_;
3445 std::vector<std::vector<Interval>> partial_demand_sums_rmq_;
3448 const int maximum_partial_demand_layer_size_;
3453 std::vector<int> previous_nontrivial_index_;
3462 std::unique_ptr<PathState> path_state,
3463 const std::vector<IntVar*>& nexts);
3473 Solver* solver, std::unique_ptr<UnaryDimensionChecker> checker);
3475 #endif // !defined(SWIG)
3479 #endif // OR_TOOLS_CONSTRAINT_SOLVER_CONSTRAINT_SOLVERI_H_
bool AreAllPositive(const std::vector< T > &values)
int BaseAlternative(int i) const
Returns the alternative for the ith base node.
@ EXPR_EXPR_EXPRESSION_MAX
bool ContainsKey(const K &key) const
Returns true if the multi-map contains at least one instance of 'key'.
virtual void BeginAcceptNeighbor(const LocalSearchOperator *op)=0
int64 MinVarArray(const std::vector< IntVar * > &vars)
void Run(Solver *const s) override
void SetInverseValue(int64 index, int64 value)
void Insert(const K &key, const V &value)
Inserts (key, value) in the multi-map.
bool IsVarSynced(int index) const
const std::vector< std::pair< int, int > > & ChangedArcs() const
void AppendToFragment(int index)
virtual void SetEndRange(IntervalVar *const var, int64 new_min, int64 new_max)=0
void SetIntegerExpressionArgument(const std::string &arg_name, IntExpr *const expr)
friend class IntVarLocalSearchHandler
int NumFirstRanked() const
IntVarLocalSearchHandler(IntVarLocalSearchOperator *op)
BooleanVar(Solver *const s, const std::string &name="")
std::string DebugString() const override
CallMethod0(T *const ct, void(T::*method)(), const std::string &name)
virtual void RankNotFirst(SequenceVar *const var, int index)=0
std::vector< int64 > ToInt64Vector(const std::vector< int > &input)
Demon proxy to a method on the constraint with one argument.
int64 Next(int64 node) const
Returns the node after node in the current delta.
int64 bit_size() const
Returns the number of bits given in the constructor of the bitset.
bool AreAllBooleans(const std::vector< IntVar * > &vars)
friend class RevBitMatrix
virtual void SetDurationMin(IntervalVar *const var, int64 new_min)=0
int NumLastRanked() const
bool IsSet(int64 row, int64 column) const
Returns whether the 'column' bit in the 'row' row is set.
int64 FindIntegerArgumentWithDefault(const std::string &arg_name, int64 def) const
Getters.
void Run(Solver *const s) override
std::string DebugString() const override
Demon proxy to a method on the constraint with three arguments.
int64 GetSynchronizedObjectiveValue() const
const bool ignore_path_vars_
void EndInitialPropagation() override
ChainRange Chains(int path) const
void SetValue(int64 index, T value)
IntVarLocalSearchOperator()
bool IsIncreasingContiguous(const std::vector< T > &values)
std::string DebugString() const override
VarConstantConstraintType
virtual void InitFragments()
const T * const_iterator
Iterators on the indices.
bool ValueFromAssignment(const Assignment &assignment, SequenceVar *var, int64 index, std::vector< int > *value)
FilterEventType event_type
int64 StartNode(int i) const
Returns the start node of the ith base node.
virtual Constraint * FindExprExprConstraint(IntExpr *const expr1, IntExpr *const expr2, ExprExprConstraintType type) const =0
Expr Expr Constraints.
virtual void BeginNestedConstraintInitialPropagation(Constraint *const parent, Constraint *const nested)=0
SequenceVarLocalSearchHandler(SequenceVarLocalSearchOperator *op)
std::vector< int64 > start_to_path_
int VarType() const override
void ClearAndResize(IntegerType size)
virtual void RankSequence(SequenceVar *const var, const std::vector< int > &rank_first, const std::vector< int > &rank_last, const std::vector< int > &unperformed)=0
void AddIntegerVariableLessOrEqualValueClause(IntVar *const var, int64 value)
virtual void RankLast(SequenceVar *const var, int index)=0
This class represents a small reversible bitset (size <= 64).
bool IsCardinalityZero() const
Is bitset null?
This is the base class for building an Lns operator.
virtual int64 GetSynchronizedObjectiveValue() const
Objective value from last time Synchronize() was called.
virtual void BeginMakeNextNeighbor(const LocalSearchOperator *op)=0
const std::vector< int > & ChangedPaths() const
The base class of all search logs that periodically outputs information when the search is running.
Low-priority demon proxy to a method on the constraint with two arguments.
@ VAR_ARRAY_CONSTANT_ARRAY_EXPRESSION_MAX
virtual void SetDurationRange(IntervalVar *const var, int64 new_min, int64 new_max)=0
bool HasIntegerVariableArrayArgument(const std::string &arg_name) const
SequenceVarLocalSearchOperator(const std::vector< SequenceVar * > &vars)
virtual void InsertVarArrayExpression(IntExpr *const expression, const std::vector< IntVar * > &vars, VarArrayExpressionType type)=0
const std::vector< IntVar * > & FindIntegerVariableArrayArgumentOrDie(const std::string &arg_name) const
virtual void StartProcessingIntegerVariable(IntVar *const var)=0
void VisitIntegerVariable(const IntVar *const variable, IntExpr *const delegate) override
int64 GetFirstOne() const
Gets the index of the first bit set starting from 0.
void SetIntegerArrayArgument(const std::string &arg_name, const std::vector< int64 > &values)
void VisitSequenceArgument(const std::string &arg_name, SequenceVar *const argument) override
Visit sequence argument.
std::string DebugString() const
RevPartialSequence(const std::vector< int > &items)
void AddVars(const std::vector< IntVar * > &vars)
Add variables to "track" to the filter.
virtual void SetValue(IntVar *const var, int64 value)=0
void SetIntervalArrayArgument(const std::string &arg_name, const std::vector< IntervalVar * > &vars)
int64 GetFirstBit(int row, int start) const
Returns the first bit in the row 'row' which position is >= 'start'.
const std::vector< int64 > & path_starts() const
Returns the vector of path start nodes.
bool AreAllOnes(const std::vector< T > &values)
bool MoveChain(int64 before_chain, int64 chain_end, int64 destination)
Moves the chain starting after the node before_chain and ending at the node chain_end after the node ...
virtual void EndConstraintInitialPropagation(Constraint *const constraint)=0
DelayedCallMethod2(T *const ct, void(T::*method)(P, Q), const std::string &name, P param1, Q param2)
void Run(Solver *const s) override
VarConstantConstantExpressionType
Solver::DemonPriority priority() const override
bool SetMax(int64 new_max)
void Install() override
Install itself on the solver.
void WhenRange(Demon *d) override
bool ApplyChanges(Assignment *delta, Assignment *deltadelta) const
std::string DebugString() const override
void Activate(int64 index)
bool MakeOneNeighbor() override
This method should not be overridden. Override NextFragment() instead.
IntVar * IsGreaterOrEqual(int64 constant) override
const Val & Value(int64 index) const
Returns the value in the current assignment of the variable of given index.
virtual bool ConsiderAlternatives(int64 base_index) const
Indicates if alternatives should be considered when iterating over base nodes.
void Resize(IndexType size)
virtual void SetMin(IntExpr *const expr, int64 new_min)=0
IntExpr modifiers.
int64 OldPrev(int64 node) const
int64 BaseAlternativeNode(int i) const
Returns the alternative node for the ith base node.
virtual void OnStart()
Called by Start() after synchronizing the operator with the current assignment.
const Val & OldValue(int64 index) const
virtual void InsertVarConstantConstantConstraint(Constraint *const ct, IntVar *const var, int64 value1, int64 value2, VarConstantConstantConstraintType type)=0
void VisitIntegerVariableArrayArgument(const std::string &arg_name, const std::vector< IntVar * > &arguments) override
bool StateIsValid() const
virtual bool Accept(const Assignment *delta, const Assignment *deltadelta, int64 objective_min, int64 objective_max)=0
Accepts a "delta" given the assignment with which the filter has been synchronized; the delta holds t...
int AddAlternativeSet(const std::vector< int64 > &alternative_set)
Handling node alternatives.
--— RevPartialSequence --—
virtual void InsertExprExprConstraint(Constraint *const ct, IntExpr *const expr1, IntExpr *const expr2, ExprExprConstraintType type)=0
This class represents a reversible bitset.
@ VAR_CONSTANT_CONSTANT_CONSTRAINT_MAX
~VarLocalSearchOperator() override
bool AreAllBoundTo(const std::vector< IntVar * > &vars, int64 value)
Returns true if all variables are assigned to 'value'.
virtual Constraint * FindVarConstantConstraint(IntVar *const var, int64 value, VarConstantConstraintType type) const =0
Var Constant Constraints.
virtual void InsertExprExprConstantExpression(IntExpr *const expression, IntExpr *const var1, IntExpr *const var2, int64 constant, ExprExprConstantExpressionType type)=0
int64 Cardinality() const
Returns the number of bits set to one.
~ArrayWithOffset() override
CallMethod2(T *const ct, void(T::*method)(P, Q), const std::string &name, P param1, Q param2)
void Run(Solver *const s) override
VarTypes
This enum is used internally to do dynamic typing on subclasses of integer variables.
Demon * MakeConstraintDemon2(Solver *const s, T *const ct, void(T::*method)(P, Q), const std::string &name, P param1, Q param2)
T RemovedElement(int i) const
IntVar * IsEqual(int64 constant) override
~SymmetryBreaker() override
int next_base_to_increment_
A symmetry breaker is an object that will visit a decision and create the 'symmetrical' decision in r...
virtual void RemoveValue(IntVar *const var, int64 value)=0
virtual IntExpr * FindExprConstantExpression(IntExpr *const expr, int64 value, ExprConstantExpressionType type) const =0
Expr Constant Expressions.
~DelayedCallMethod0() override
virtual IntExpr * FindVarConstantArrayExpression(IntVar *const var, const std::vector< int64 > &values, VarConstantArrayExpressionType type) const =0
Var Constant Array Expressions.
SharedBoundsManager * bounds
Matrix version of the RevBitSet class.
const std::vector< int > & Sequence(int64 index) const
Returns the value in the current assignment of the variable of given index.
Demon proxy to a method on the constraint with no arguments.
The vehicle routing library lets one model and solve generic vehicle routing problems ranging from th...
int64 InverseValue(int64 index) const
bool SwapActiveAndInactive(int64 active, int64 inactive)
Replaces active by inactive in the current path, making active inactive.
void SetToOne(Solver *const solver, int64 row, int64 column)
Sets the 'column' bit in the 'row' row.
int64 PosIntDivUp(int64 e, int64 v)
virtual IntExpr * FindExprExprExpression(IntExpr *const var1, IntExpr *const var2, ExprExprExpressionType type) const =0
Expr Expr Expressions.
bool AreAllGreaterOrEqual(const std::vector< T > &values, const T &value)
@ VAR_CONSTANT_CONSTANT_EXPRESSION_MAX
virtual void InsertExprExpression(IntExpr *const expression, IntExpr *const expr, ExprExpressionType type)=0
@ EXPR_EXPR_CONSTRAINT_MAX
bool AreAllNull(const std::vector< T > &values)
LocalSearchOperator * MakeLocalSearchOperator(Solver *solver, const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64)> start_empty_path_class)
Operator Factories.
virtual void Revert()
Cancels the changes made by the last Relax()/Accept() calls.
static const int64 kint64min
virtual int64 GetAcceptedObjectiveValue() const
Objective value from the last time Accept() was called and returned true.
int Start(int path) const
bool Contains(int64 v) const override
virtual void EndNestedConstraintInitialPropagation(Constraint *const parent, Constraint *const nested)=0
void ChangeNext(int node, int new_next)
void Synchronize(const Assignment *assignment, const Assignment *delta) override
This method should not be overridden.
bool Intersects(const std::vector< uint64 > &mask, int *support_index)
This method returns true iff the mask and the active bitset have a non null intersection.
virtual void SetMax(IntVar *const var, int64 new_max)=0
virtual int64 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...
SequenceVarLocalSearchHandler()
virtual void RegisterDemon(Demon *const demon)=0
@ EXPR_CONSTANT_EXPRESSION_MAX
static const int kUnboundBooleanVarValue
This is the base class for all expressions that are not variables.
virtual void SetStartMax(IntervalVar *const var, int64 new_max)=0
void AcceptUncheckedNeighbor() override
This class represents a reversible bitset.
bool MakeOneNeighbor() override
This method should not be overridden. Override MakeNeighbor() instead.
void VisitSequenceVariable(const SequenceVar *const variable) override
~PropagationMonitor() override
void ResetPosition()
Reset the position of the operator to its position when Start() was last called; this can be used to ...
Solver::DemonPriority priority() const override
bool Accept(LocalSearchMonitor *const monitor, const Assignment *delta, const Assignment *deltadelta, int64 objective_min, int64 objective_max)
Returns true iff all filters return true, and the sum of their accepted objectives is between objecti...
void BeginFail() override
Low-priority demon proxy to a method on the constraint with one argument.
void WhenBound(Demon *d) override
virtual void InsertVarConstantConstantExpression(IntExpr *const expression, IntVar *const var, int64 value1, int64 value2, VarConstantConstantExpressionType type)=0
std::string DebugString() const override
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...
void RemoveInterval(int64 l, int64 u) override
bool IsCardinalityOne() const
Does it contains only one bit set?
SparseBitset delta_changes_
void Switch(Solver *const solver)
virtual void EndFilterNeighbor(const LocalSearchOperator *op, bool neighbor_found)=0
GurobiMPCallbackContext * context
virtual void RankNotLast(SequenceVar *const var, int index)=0
const std::string & TypeName() const
Type of the argument.
virtual void SetMax(IntExpr *const expr, int64 new_max)=0
void BeginVisitConstraint(const std::string &type_name, const Constraint *const constraint) override
~DelayedCallMethod2() override
const RevIntSet< int > & active_words() const
Returns the set of active word indices.
void SetIntervalArgument(const std::string &arg_name, IntervalVar *const var)
~UnsortedNullableRevBitset()
void AddToAssignment(IntVar *var, int64 value, bool active, std::vector< int > *assignment_indices, int64 index, Assignment *assignment) const
bool HasFragments() const override
void EndVisitConstraint(const std::string &type_name, const Constraint *const constraint) override
void Set(IntegerType index)
RevPartialSequence(int size)
virtual void InsertExprExprExpression(IntExpr *const expression, IntExpr *const var1, IntExpr *const var2, ExprExprExpressionType type)=0
@ VAR_ARRAY_CONSTANT_EXPRESSION_MAX
ExprConstantExpressionType
Local Search Filters are used for fast neighbor pruning.
virtual void SetRange(IntVar *const var, int64 new_min, int64 new_max)=0
bool IsCardinalityZero() const
Is bitset null?
void Synchronize(const Assignment *assignment, const Assignment *delta)
Synchronizes all filters to assignment.
std::string BaseName() const override
LocalSearchFilter * MakeUnaryDimensionFilter(Solver *solver, std::unique_ptr< UnaryDimensionChecker > checker)
VarArrayConstantArrayExpressionType
Demon * MakeDelayedConstraintDemon0(Solver *const s, T *const ct, void(T::*method)(), const std::string &name)
void SynchronizeOnAssignment(const Assignment *assignment)
void ExitSearch() override
bool Activated(int64 index) const
bool MakeOneNeighbor() override
This method should not be overridden. Override ModifyValue() instead.
void AddVars(const std::vector< V * > &vars)
virtual bool SkipUnchanged(int index) const
bool SetMin(int64 new_min)
std::vector< Val > values_
void VisitIntegerMatrixArgument(const std::string &arg_name, const IntTupleSet &values) override
bool IsArrayConstant(const std::vector< T > &values, const T &value)
int PathClass(int i) const
Returns the class of the path of the ith base node.
bool IsIncreasing(const std::vector< T > &values)
This class represent a reversible FIFO structure.
virtual void Commit(const Assignment *delta, const Assignment *deltadelta)
Dual of Relax(), lets the filter know that the delta was accepted.
@ EXPR_CONSTANT_IS_NOT_EQUAL
void SetToOne(Solver *const solver, int64 pos)
Sets the 'pos' bit.
void SetToZero(Solver *const solver, int64 pos)
Erases the 'pos' bit.
~LocalSearchOperator() override
bool Empty() const
This method returns true if the active bitset is null.
~SequenceVarLocalSearchOperator() override
void EndVisitModel(const std::string &solver_name) override
void SetIntegerArgument(const std::string &arg_name, int64 value)
Setters.
ExprExprConstantExpressionType
int64 Min() const override
void Insert(Solver *const solver, const T &elt)
@ EXPR_CONSTANT_DIFFERENCE
void ClearAll(Solver *const solver)
Cleans all bits.
virtual void BeginConstraintInitialPropagation(Constraint *const constraint)=0
Propagation events.
void RemoveValue(int64 v) override
virtual void EndOperatorStart()=0
CallMethod1(T *const ct, void(T::*method)(P), const std::string &name, P param1)
Argument Holder: useful when visiting a model.
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.
VarLocalSearchOperator(Handler var_handler)
void SetSequenceArrayArgument(const std::string &arg_name, const std::vector< SequenceVar * > &vars)
Base operator class for operators manipulating variables.
@ EXPR_EXPR_IS_LESS_OR_EQUAL
int64 GetActiveInAlternativeSet(int alternative_index) const
Returns the active node in the given alternative set.
virtual IntExpr * FindExprExpression(IntExpr *const expr, ExprExpressionType type) const =0
Expr Expressions.
void RevInsert(Solver *const solver, int64 index, T value)
virtual void BeginOperatorStart()=0
Local search operator events.
int64 Value(int index) const
bool AreAllLessOrEqual(const std::vector< T > &values, const T &value)
PathState(int num_nodes, std::vector< int > path_start, std::vector< int > path_end)
virtual void SetEndMin(IntervalVar *const var, int64 new_min)=0
ModelCache(Solver *const solver)
virtual IntExpr * FindExprExprConstantExpression(IntExpr *const var1, IntExpr *const var2, int64 constant, ExprExprConstantExpressionType type) const =0
Expr Expr Constant Expressions.
virtual void SetStartRange(IntervalVar *const var, int64 new_min, int64 new_max)=0
std::string DebugString() const override
SequenceVarLocalSearchOperator()
~DelayedCallMethod1() override
bool Bound() const override
void RevertChanges(bool incremental)
virtual void InsertVarConstantConstraint(Constraint *const ct, IntVar *const var, int64 value, VarConstantConstraintType type)=0
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 ...
void Remove(Solver *const solver, const T &value_index)
void SetRange(int64 mi, int64 ma) override
LocalSearchMonitor(Solver *const solver)
virtual int64 ModifyValue(int64 index, int64 value)=0
bool RevSubtract(Solver *const solver, const std::vector< uint64 > &mask)
This method subtracts the mask from the active bitset.
virtual void EndMakeNextNeighbor(const LocalSearchOperator *op, bool neighbor_found, const Assignment *delta, const Assignment *deltadelta)=0
LocalSearchFilter * MakePathStateFilter(Solver *solver, std::unique_ptr< PathState > path_state, const std::vector< IntVar * > &nexts)
const std::vector< IntegerType > & PositionsSetAtLeastOnce() const
VarLocalSearchOperator< SequenceVar, std::vector< int >, SequenceVarLocalSearchHandler > SequenceVarLocalSearchOperatorTemplate
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)> start_empty_path_class)
Builds an instance of PathOperator from next and path variables.
void VisitIntervalVariable(const IntervalVar *const variable, const std::string &operation, int64 value, IntervalVar *const delegate) override
V * Var(int64 index) const
Returns the variable of given index.
VarConstantConstantConstraintType
void SetContentFromBitsetOfSameSize(const Bitset64< OtherIndexType > &other)
This iterator is not stable with respect to deletion.
virtual void SetEndMax(IntervalVar *const var, int64 new_max)=0
Demon * MakeConstraintDemon1(Solver *const s, T *const ct, void(T::*method)(P), const std::string &name, P param1)
void AddIntegerVariableEqualValueClause(IntVar *const var, int64 value)
BaseIntExpr(Solver *const s)
IntVar * IsDifferent(int64 constant) override
void Run(Solver *const s) override
SimpleRevFIFO< Demon * > bound_demons_
virtual bool RestartAtPathStartOnSynchronize()
When the operator is being synchronized with a new solution (when Start() is called),...
void Init(Solver *const solver, const std::vector< uint64 > &mask)
This methods overwrites the active bitset with the mask.
virtual void SetStartMin(IntervalVar *const var, int64 new_min)=0
IntervalVar modifiers.
int64 GetFirstBit(int start) const
Gets the index of the first bit set starting from start.
bool CheckChainValidity(int64 before_chain, int64 chain_end, int64 exclude) const
Returns true if the chain is a valid path without cycles from before_chain to chain_end and does not ...
virtual void BeginFiltering(const LocalSearchFilter *filter)=0
friend class SymmetryManager
int64 FindIntegerArgumentOrDie(const std::string &arg_name) const
std::string DebugString() const override
virtual bool MakeNextNeighbor(Assignment *delta, Assignment *deltadelta)=0
void RankFirst(Solver *const solver, int elt)
int64 OldPath(int64 node) const
int64 Value() const override
void BeginVisitIntegerExpression(const std::string &type_name, const IntExpr *const expr) override
int BaseSiblingAlternative(int i) const
Returns the alternative for the sibling of the ith base node.
virtual void PushContext(const std::string &context)=0
static constexpr int kNoInserted
void SetIntegerMatrixArgument(const std::string &arg_name, const IntTupleSet &values)
virtual void RemoveValues(IntVar *const var, const std::vector< int64 > &values)=0
Reversible Immutable MultiMap class.
@ VAR_CONSTANT_GREATER_OR_EQUAL
virtual void EndFiltering(const LocalSearchFilter *filter, bool reject)=0
SmallRevBitSet(int64 size)
int64 Cardinality() const
Returns the number of bits set to one.
std::function< int64(const Model &)> Value(IntegerVariable v)
LocalSearchFilterManager(std::vector< FilterEvent > filter_events)
const T * Last() const
Returns the last item of the FIFO.
virtual IntExpr * FindVarArrayConstantExpression(const std::vector< IntVar * > &vars, int64 value, VarArrayConstantExpressionType type) const =0
Var Array Constant Expressions.
void PushIfNotTop(Solver *const s, T val)
Pushes the var on top if is not a duplicate of the current top object.
virtual bool MakeNeighbor()=0
virtual void EndDemonRun(Demon *const demon)=0
void VisitIntegerArrayArgument(const std::string &arg_name, const std::vector< int64 > &values) override
virtual Constraint * FindVarConstantConstantConstraint(IntVar *const var, int64 value1, int64 value2, VarConstantConstantConstraintType type) const =0
Var Constant Constant Constraints.
void MarkChange(int64 index)
OnStart() should really be protected, but then SWIG doesn't see it.
IntVarIterator * MakeDomainIterator(bool reversible) const override
virtual void OutputLine(const std::string &line)
uint64 Hash1(uint64 value)
Hash functions.
@ VAR_CONSTANT_CONSTANT_BETWEEN
bool operator!=(Iterator other) const
bool operator!=(Iterator other) const
uint64 Size() const override
void SetToZero(Solver *const solver, int64 index)
Erases the 'index' bit.
virtual T Evaluate(int64 index) const
VarConstantArrayExpressionType
@ VAR_CONSTANT_CONSTRAINT_MAX
int64 Prev(int64 node) const
Returns the node before node in the current delta.
void BeginVisitModel(const std::string &solver_name) override
Header/footers.
void SetNext(int64 from, int64 to, int64 path)
Sets 'to' to be the node after 'from' on the given path.
UnaryDimensionChecker(const PathState *path_state, std::vector< Interval > path_capacity, std::vector< int > path_class, std::vector< std::vector< Interval >> demand, std::vector< Interval > node_capacity)
virtual void SetValues(IntVar *const var, const std::vector< int64 > &values)=0
void VisitIntervalArrayArgument(const std::string &arg_name, const std::vector< IntervalVar * > &arguments) override
RevImmutableMultiMap(Solver *const solver, int initial_size)
bool AreAllStrictlyNegative(const std::vector< T > &values)
std::string DebugString() const override
void AddPairAlternativeSets(const std::vector< std::pair< std::vector< int64 >, std::vector< int64 >>> &pair_alternative_sets)
Adds all sets of node alternatives of a vector of alternative pairs.
int number_of_nexts() const
Number of next variables.
virtual IntExpr * FindVarConstantConstantExpression(IntVar *const var, int64 value1, int64 value2, VarConstantConstantExpressionType type) const =0
Var Constant Constant Expressions.
bool IsCardinalityOne() const
Does it contains only one bit set?
virtual void SetMin(IntVar *const var, int64 new_min)=0
IntVar modifiers.
void VisitIntegerExpressionArgument(const std::string &arg_name, IntExpr *const argument) override
Variables.
~IntVarLocalSearchFilter() override
void OnRevertChanges(int64 index, const std::vector< int > &value)
virtual bool OnSamePathAsPreviousBase(int64 base_index)
Returns true if a base node has to be on the same path as the "previous" base node (base node of inde...
virtual IntVar * CastToVar()
bool MakeActive(int64 node, int64 destination)
Insert the inactive node after destination.
bool AreAllStrictlyPositive(const std::vector< T > &values)
bool operator!=(Iterator other) const
void SetMax(int64 m) override
NodeRange(const ChainBounds *begin_chain, const ChainBounds *end_chain, const CommittedNode *first_node)
void AddIntegerVariableGreaterOrEqualValueClause(IntVar *const var, int64 value)
virtual void InsertVarArrayConstantExpression(IntExpr *const expression, const std::vector< IntVar * > &var, int64 value, VarArrayConstantExpressionType type)=0
Low-priority demon proxy to a method on the constraint with no arguments.
LocalSearchFilter * filter
virtual void SetRange(IntExpr *const expr, int64 new_min, int64 new_max)=0
int GetSiblingAlternativeIndex(int node) const
Returns the index of the alternative set of the sibling of node.
IntVarLocalSearchHandler()
void Run(Solver *const s) override
bool IsSet(int64 index) const
Returns whether the 'index' bit is set.
int64 BaseSiblingAlternativeNode(int i) const
Returns the alternative node for the sibling of the ith base node.
bool AreAllBound(const std::vector< IntVar * > &vars)
BaseLns(const std::vector< IntVar * > &vars)
bool IsInverseValue(int64 index) const
void EndVisitIntegerExpression(const std::string &type_name, const IntExpr *const expr) override
virtual void InsertVarArrayConstantArrayExpression(IntExpr *const expression, const std::vector< IntVar * > &var, const std::vector< int64 > &values, VarArrayConstantArrayExpressionType type)=0
void SetBackwardSequence(int64 index, const std::vector< int > &value)
IntVarLocalSearchOperator(const std::vector< IntVar * > &vars, bool keep_inverse_values=false)
Filter manager: when a move is made, filters are executed to decide whether the solution is feasible ...
int64 GetActiveAlternativeSibling(int node) const
Returns the active node in the alternative set of the sibling of the given node.
SequenceVarLocalSearchHandler(const SequenceVarLocalSearchHandler &other)
ArrayWithOffset(int64 index_min, int64 index_max)
void ClearAll(Solver *const solver)
Cleans all bits.
bool IsArrayInRange(const std::vector< IntVar * > &vars, T range_min, T range_max)
void RankLast(Solver *const solver, int elt)
bool ValueFromAssignment(const Assignment &assignment, IntVar *var, int64 index, int64 *value)
void SetSequenceArgument(const std::string &arg_name, SequenceVar *const var)
IntVarLocalSearchFilter(const std::vector< IntVar * > &vars)
IntExpr * FindIntegerExpressionArgumentOrDie(const std::string &arg_name) const
Solver::DemonPriority priority() const override
std::vector< int > assignment_indices_
Demon * MakeConstraintDemon3(Solver *const s, T *const ct, void(T::*method)(P, Q, R), const std::string &name, P param1, Q param2, R param3)
void VisitIntervalArgument(const std::string &arg_name, IntervalVar *const argument) override
Visit interval argument.
void Restore(Solver *const solver, const T &value_index)
virtual void RankFirst(SequenceVar *const var, int index)=0
SequenceVar modifiers.
void SetForwardSequence(int64 index, const std::vector< int > &value)
static int input(yyscan_t yyscanner)
void SetValue(int64 index, const Val &value)
Specialization of LocalSearchOperator built from an array of IntVars which specifies the scope of the...
std::string DebugString() const override
void Deactivate(int64 index)
const std::vector< int > & OldSequence(int64 index) const
Base class of the local search operators dedicated to path modifications (a path is a set of nodes li...
ChainRange(const ChainBounds *const begin_chain, const ChainBounds *const end_chain, const CommittedNode *const first_node)
void SetToOne(Solver *const solver, int64 index)
Sets the 'index' bit.
void VisitIntegerArgument(const std::string &arg_name, int64 value) override
Integer arguments.
virtual bool HoldsDelta() const
void SetTypeName(const std::string &type_name)
@ VAR_CONSTANT_NON_EQUALITY
bool IsInactive(int64 node) const
Returns true if node is inactive.
virtual void SetNextBaseToIncrement(int64 base_index)
Set the next base to increment on next iteration.
void RefuteDecision(Decision *const decision) override
DelayedCallMethod0(T *const ct, void(T::*method)(), const std::string &name)
This is a special class to represent a 'residual' set of T.
@ VAR_CONSTANT_CONSTANT_SEMI_CONTINUOUS
const int number_of_nexts_
Iterator(const SimpleRevFIFO< T > *l)
void AddToAssignment(SequenceVar *var, const std::vector< int > &value, bool active, std::vector< int > *assignment_indices, int64 index, Assignment *assignment) const
A reversible switch that can switch once from false to true.
virtual void EndProcessingIntegerVariable(IntVar *const var)=0
virtual void RemoveInterval(IntVar *const var, int64 imin, int64 imax)=0
bool IsRanked(int elt) const
SimpleRevFIFO< Demon * > delayed_bound_demons_
virtual void Relax(const Assignment *delta, const Assignment *deltadelta)
Lets the filter know what delta and deltadelta will be passed in the next Accept().
@ EXPR_EXPR_LESS_OR_EQUAL
virtual void SetPerformed(IntervalVar *const var, bool value)=0
std::string DebugString() const override
Demon proxy to a method on the constraint with two arguments.
int64 OldInverseValue(int64 index) const
std::string DebugString() const override
bool AtSolution() override
ArgumentHolder * Top() const
virtual void InsertVarConstantArrayExpression(IntExpr *const expression, IntVar *const var, const std::vector< int64 > &values, VarConstantArrayExpressionType type)=0
Defines operators which change the value of variables; each neighbor corresponds to one modified vari...
bool IsPathEnd(int64 node) const
Returns true if node is the last node on the path; defined by the fact that node is outside the range...
virtual void RestoreValue()=0
VarArrayConstantExpressionType
void SetIntegerVariableArrayArgument(const std::string &arg_name, const std::vector< IntVar * > &vars)
The base class for all local search operators.
const std::vector< int64 > & FindIntegerArrayArgumentOrDie(const std::string &arg_name) const
const_iterator end() const
IntVar * IsLessOrEqual(int64 constant) override
virtual void SetDurationMax(IntervalVar *const var, int64 new_max)=0
virtual void OnNodeInitialization()
Called by OnStart() after initializing node information.
@ EXPR_EXPR_CONSTANT_EXPRESSION_MAX
int64 PosIntDivDown(int64 e, int64 v)
@ VAR_ARRAY_EXPRESSION_MAX
std::vector< Val > old_values_
const_iterator begin() const
virtual void BeginFilterNeighbor(const LocalSearchOperator *op)=0
bool RevAnd(Solver *const solver, const std::vector< uint64 > &mask)
This method ANDs the mask with the active bitset.
RevIntSet(int capacity, int *shared_positions, int shared_positions_size)
Capacity is the fixed size of the set (it cannot grow).
virtual IntExpr * FindVarArrayExpression(const std::vector< IntVar * > &vars, VarArrayExpressionType type) const =0
Var Array Expressions.
virtual void InsertVoidConstraint(Constraint *const ct, VoidConstraintType type)=0
const IntTupleSet & FindIntegerMatrixArgumentOrDie(const std::string &arg_name) const
virtual void EndAcceptNeighbor(const LocalSearchOperator *op, bool neighbor_found)=0
Implements a complete cache for model elements: expressions and constraints.
@ EXPR_CONSTANT_IS_GREATER_OR_EQUAL
virtual bool IsIncremental() const
void BeginInitialPropagation() override
void SetMin(int64 m) override
virtual void InsertExprConstantExpression(IntExpr *const expression, IntExpr *const var, int64 value, ExprConstantExpressionType type)=0
const int & operator[](int index) const
virtual void Start(const Assignment *assignment)=0
NodeRange Nodes(int path) const
SearchLog(Solver *const s, OptimizeVar *const obj, IntVar *const var, double scaling_factor, double offset, std::function< std::string()> display_callback, int period)
~LocalSearchMonitor() override
void SetToZero(Solver *const solver, int64 row, int64 column)
Erases the 'column' bit in the 'row' row.
virtual void PopContext()=0
bool IsPathStart(int64 node) const
Returns true if node is the first node on the path.
virtual bool NextFragment()=0
void OnRevertChanges(int64 index, int64 value)
Demon * MakeConstraintDemon0(Solver *const s, T *const ct, void(T::*method)(), const std::string &name)
void VisitSequenceArrayArgument(const std::string &arg_name, const std::vector< SequenceVar * > &arguments) override
@ VAR_CONSTANT_ARRAY_EXPRESSION_MAX
~IntVarLocalSearchOperator() override
int64 MaxVarArray(const std::vector< IntVar * > &vars)
int64 BaseNode(int i) const
Returns the ith base node of the operator.
std::vector< Val > prev_values_
void Push(Solver *const s, T val)
@ EXPR_EXPR_GREATER_OR_EQUAL
std::string DebugString() const override
void FillValues(const std::vector< IntVar * > &vars, std::vector< int64 > *const values)
This class is a reversible growing array.
Demon * MakeDelayedConstraintDemon2(Solver *const s, T *const ct, void(T::*method)(P, Q), const std::string &name, P param1, Q param2)
void EnterSearch() override
virtual bool IsIncremental() const
bool SkipUnchanged(int index) const override
virtual const LocalSearchOperator * Self() const
Chain(const CommittedNode *begin_node, const CommittedNode *end_node)
IntVar * Var(int index) const
IntVarLocalSearchHandler(const IntVarLocalSearchHandler &other)
int ActiveWordSize() const
This method returns the number of non null 64 bit words in the bitset representation.
bool HasIntegerExpressionArgument(const std::string &arg_name) const
Checks if arguments exist.
int64 GetAcceptedObjectiveValue() const
DelayedCallMethod1(T *const ct, void(T::*method)(P), const std::string &name, P param1)
void SetLastValue(const T &v)
Sets the last value in the FIFO.
IntVarIterator * MakeHoleIterator(bool reversible) const override
@ EXPR_CONSTANT_IS_LESS_OR_EQUAL
std::string DebugString() const override
void CopyBucket(const Bitset64< IndexType > &other, IndexType i)
void Install() override
Install itself on the solver.
RevGrowingArray(int64 block_size)
ChangeValue(const std::vector< IntVar * > &vars)
@ VAR_CONSTANT_ARRAY_ELEMENT
void SetOldInverseValue(int64 index, int64 value)
bool IsArrayBoolean(const std::vector< T > &values)
int64 OldNext(int64 node) const
int64 word_size() const
Returns the number of 64 bit words used to store the bitset.
RevIntSet(int capacity)
Capacity is the fixed size of the set (it cannot grow).
UnsortedNullableRevBitset(int bit_size)
Size is the number of bits to store in the bitset.
virtual IntExpr * FindVarArrayConstantArrayExpression(const std::vector< IntVar * > &vars, const std::vector< int64 > &values, VarArrayConstantArrayExpressionType type) const =0
Var Array Constant Array Expressions.
virtual bool InitPosition() const
Returns true if the operator needs to restart its initial position at each call to Start()
const T & LastValue() const
Returns the last value in the FIFO.
int64 Path(int64 node) const
Returns the index of the path to which node belongs in the current delta.
void PushArgumentHolder()
Demon * MakeDelayedConstraintDemon1(Solver *const s, T *const ct, void(T::*method)(P), const std::string &name, P param1)
@ VAR_ARRAY_CONSTANT_ARRAY_SCAL_PROD
PropagationMonitor(Solver *const solver)
int64 Max() const override
std::vector< std::vector< int > > backward_values_
@ VAR_CONSTANT_LESS_OR_EQUAL
static const int64 kint64max
virtual Constraint * FindVoidConstraint(VoidConstraintType type) const =0
Void constraints.
bool MakeChainInactive(int64 before_chain, int64 chain_end)
Makes the nodes on the chain starting after before_chain and ending at chain_end inactive.
void Clear(Solver *const solver)
int64 GetActiveAlternativeNode(int node) const
Returns the active node in the alternative set of the given node.
@ VAR_ARRAY_CONSTANT_INDEX
void ApplyDecision(Decision *const decision) override
LocalSearchVariable AddVariable(int64 initial_min, int64 initial_max)
void WhenDomain(Demon *d) override
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
bool AreAllNegative(const std::vector< T > &values)
@ EXPR_EXPR_CONSTANT_CONDITIONAL
bool ReverseChain(int64 before_chain, int64 after_chain, int64 *chain_last)
Reverses the chain starting after before_chain and ending before after_chain.
std::string ParameterDebugString(P param)
bool HoldsDelta() const override
virtual void OnSynchronize(const Assignment *delta)
void Start(const Assignment *assignment) override
This method should not be overridden.
virtual bool HasFragments() const
virtual void BeginDemonRun(Demon *const demon)=0
void NoMoreSolutions() override
bool FindIndex(IntVar *const var, int64 *index) const