 |
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__) || defined(__aarch64__)
260 }
else if (ptrs.size() == 1) {
261 return Hash1(ptrs[0]);
264 for (
int i = 1; i < ptrs.size(); ++i) {
274 }
else if (ptrs.size() == 1) {
275 return Hash1(ptrs[0]);
278 for (
int i = 1; i < ptrs.size(); ++i) {
287 template <
class K,
class V>
292 array_(solver->UnsafeRevAllocArray(new Cell*[initial_size])),
295 memset(array_, 0,
sizeof(*array_) * size_.Value());
305 Cell* tmp = array_[code];
307 if (tmp->key() == key) {
320 Cell* tmp = array_[code];
322 if (tmp->key() == key) {
327 return default_value;
332 const int position =
Hash1(key) % size_.Value();
334 solver_->UnsafeRevAlloc(
new Cell(key,
value, array_[position]));
335 solver_->SaveAndSetValue(
reinterpret_cast<void**
>(&array_[position]),
336 reinterpret_cast<void*
>(cell));
337 num_items_.Incr(solver_);
338 if (num_items_.Value() > 2 * size_.Value()) {
346 Cell(
const K& key,
const V&
value, Cell*
const next)
347 : key_(key), value_(
value), next_(
next) {}
349 void SetRevNext(Solver*
const solver, Cell*
const next) {
350 solver->SaveAndSetValue(
reinterpret_cast<void**
>(&next_),
351 reinterpret_cast<void*
>(
next));
354 Cell*
next()
const {
return next_; }
356 const K& key()
const {
return key_; }
358 const V&
value()
const {
return value_; }
367 Cell**
const old_cell_array = array_;
368 const int old_size = size_.Value();
369 size_.SetValue(solver_, size_.Value() * 2);
370 solver_->SaveAndSetValue(
371 reinterpret_cast<void**
>(&array_),
372 reinterpret_cast<void*
>(
373 solver_->UnsafeRevAllocArray(
new Cell*[size_.Value()])));
374 memset(array_, 0, size_.Value() *
sizeof(*array_));
375 for (
int i = 0; i < old_size; ++i) {
376 Cell* tmp = old_cell_array[i];
377 while (tmp !=
nullptr) {
378 Cell*
const to_reinsert = tmp;
380 const uint64 new_position =
Hash1(to_reinsert->key()) % size_.Value();
381 to_reinsert->SetRevNext(solver_, array_[new_position]);
382 solver_->SaveAndSetValue(
383 reinterpret_cast<void**
>(&array_[new_position]),
384 reinterpret_cast<void*
>(to_reinsert));
389 Solver*
const solver_;
391 NumericalRev<int> size_;
392 NumericalRev<int> num_items_;
402 void Switch(Solver*
const solver) { solver->SaveAndSetValue(&value_,
true); }
423 return (bits_.Value() != 0) && !(bits_.Value() & (bits_.Value() - 1));
456 void ClearAll(Solver*
const solver);
462 void Save(Solver*
const solver,
int offset);
482 DCHECK_LT(
row, rows_);
483 DCHECK_GE(column, 0);
484 DCHECK_LT(column, columns_);
497 void ClearAll(Solver*
const solver);
501 const int64 columns_;
515 : constraint_(
ct), method_(method), name_(
name) {}
519 void Run(Solver*
const s)
override { (constraint_->*method_)(); }
522 return "CallMethod_" + name_ +
"(" + constraint_->DebugString() +
")";
526 T*
const constraint_;
527 void (T::*
const method_)();
528 const std::string name_;
533 const std::string&
name) {
539 return absl::StrCat(param);
545 return param->DebugString();
549 template <
class T,
class P>
554 : constraint_(
ct), method_(method), name_(
name), param1_(param1) {}
558 void Run(Solver*
const s)
override { (constraint_->*method_)(param1_); }
561 return absl::StrCat(
"CallMethod_", name_,
"(", constraint_->DebugString(),
566 T*
const constraint_;
567 void (T::*
const method_)(P);
568 const std::string name_;
572 template <
class T,
class P>
574 const std::string&
name, P param1) {
579 template <
class T,
class P,
class Q>
592 void Run(Solver*
const s)
override {
593 (constraint_->*method_)(param1_, param2_);
597 return absl::StrCat(absl::StrCat(
"CallMethod_", name_),
598 absl::StrCat(
"(", constraint_->DebugString()),
604 T*
const constraint_;
605 void (T::*
const method_)(P, Q);
606 const std::string name_;
611 template <
class T,
class P,
class Q>
613 void (T::*method)(P, Q),
const std::string&
name,
614 P param1, Q param2) {
619 template <
class T,
class P,
class Q,
class R>
623 P param1, Q param2, R param3)
633 void Run(Solver*
const s)
override {
634 (constraint_->*method_)(param1_, param2_, param3_);
638 return absl::StrCat(absl::StrCat(
"CallMethod_", name_),
639 absl::StrCat(
"(", constraint_->DebugString()),
646 T*
const constraint_;
647 void (T::*
const method_)(P, Q, R);
648 const std::string name_;
654 template <
class T,
class P,
class Q,
class R>
656 void (T::*method)(P, Q, R),
const std::string&
name,
657 P param1, Q param2, R param3) {
673 : constraint_(
ct), method_(method), name_(
name) {}
677 void Run(Solver*
const s)
override { (constraint_->*method_)(); }
680 return Solver::DELAYED_PRIORITY;
684 return "DelayedCallMethod_" + name_ +
"(" + constraint_->DebugString() +
689 T*
const constraint_;
690 void (T::*
const method_)();
691 const std::string name_;
697 const std::string&
name) {
702 template <
class T,
class P>
707 : constraint_(
ct), method_(method), name_(
name), param1_(param1) {}
711 void Run(Solver*
const s)
override { (constraint_->*method_)(param1_); }
714 return Solver::DELAYED_PRIORITY;
718 return absl::StrCat(
"DelayedCallMethod_", name_,
"(",
719 constraint_->DebugString(),
", ",
724 T*
const constraint_;
725 void (T::*
const method_)(P);
726 const std::string name_;
730 template <
class T,
class P>
732 void (T::*method)(P),
733 const std::string&
name, P param1) {
738 template <
class T,
class P,
class Q>
742 const std::string&
name, P param1, Q param2)
751 void Run(Solver*
const s)
override {
752 (constraint_->*method_)(param1_, param2_);
756 return Solver::DELAYED_PRIORITY;
760 return absl::StrCat(absl::StrCat(
"DelayedCallMethod_", name_),
761 absl::StrCat(
"(", constraint_->DebugString()),
767 T*
const constraint_;
768 void (T::*
const method_)(P, Q);
769 const std::string name_;
774 template <
class T,
class P,
class Q>
776 void (T::*method)(P, Q),
777 const std::string&
name, P param1,
784 #endif // !defined(SWIG)
810 virtual void Start(
const Assignment* assignment) = 0;
820 template <
class V,
class Val,
class Handler>
833 void Start(
const Assignment* assignment)
override {
834 const int size =
Size();
835 CHECK_LE(size, assignment->Size())
836 <<
"Assignment contains fewer variables than operator";
837 for (
int i = 0; i < size; ++i) {
910 vars_.insert(
vars_.end(), vars.begin(), vars.end());
960 std::vector<int>* assignment_indices,
int64 index,
961 Assignment* assignment)
const {
962 Assignment::IntContainer*
const container =
963 assignment->MutableIntVarContainer();
964 IntVarElement* element =
nullptr;
965 if (assignment_indices !=
nullptr) {
966 if ((*assignment_indices)[
index] == -1) {
967 (*assignment_indices)[
index] = container->Size();
968 element = assignment->FastAdd(
var);
970 element = container->MutableElement((*assignment_indices)[
index]);
973 element = assignment->FastAdd(
var);
976 element->SetValue(
value);
979 element->Deactivate();
1005 #if defined(SWIGPYTHON)
1006 %unignore VarLocalSearchOperator<IntVar,
int64,
1007 IntVarLocalSearchHandler>::Size;
1008 %unignore VarLocalSearchOperator<IntVar,
int64,
1009 IntVarLocalSearchHandler>
::Value;
1010 %unignore VarLocalSearchOperator<IntVar,
int64,
1011 IntVarLocalSearchHandler>::OldValue;
1012 %unignore VarLocalSearchOperator<IntVar,
int64,
1013 IntVarLocalSearchHandler>::SetValue;
1014 %feature(
"director") VarLocalSearchOperator<IntVar,
int64,
1015 IntVarLocalSearchHandler>::IsIncremental;
1016 %feature("director") VarLocalSearchOperator<IntVar,
int64,
1017 IntVarLocalSearchHandler>::OnStart;
1018 %unignore VarLocalSearchOperator<IntVar,
int64,
1019 IntVarLocalSearchHandler>::IsIncremental;
1020 %unignore VarLocalSearchOperator<IntVar,
int64,
1021 IntVarLocalSearchHandler>::OnStart;
1022 #endif // SWIGPYTHON
1025 %rename(IntVarLocalSearchOperatorTemplate)
1026 VarLocalSearchOperator<IntVar, int64, IntVarLocalSearchHandler>;
1027 %
template(IntVarLocalSearchOperatorTemplate)
1028 VarLocalSearchOperator<IntVar, int64, IntVarLocalSearchHandler>;
1040 bool keep_inverse_values =
false)
1043 max_inverse_value_(keep_inverse_values ? vars.size() - 1 : -1) {
1045 if (keep_inverse_values) {
1046 int64 max_value = -1;
1047 for (
const IntVar*
const var : vars) {
1050 inverse_values_.resize(max_value + 1, -1);
1051 old_inverse_values_.resize(max_value + 1, -1);
1061 bool MakeNextNeighbor(Assignment*
delta, Assignment* deltadelta)
override;
1070 virtual bool MakeOneNeighbor();
1073 DCHECK_GE(
index, 0);
1074 return index <= max_inverse_value_;
1080 return old_inverse_values_[
index];
1092 const int64 max_inverse_value_;
1093 std::vector<int64> old_inverse_values_;
1094 std::vector<int64> inverse_values_;
1099 const Assignment::IntContainer& container = assignment.IntVarContainer();
1100 const IntVarElement* element = &(container.Element(
index));
1101 if (element->Var() !=
var) {
1102 CHECK(container.Contains(
var))
1103 <<
"Assignment does not contain operator variable " <<
var;
1104 element = &(container.Element(
var));
1106 *
value = element->Value();
1111 return element->Activated();
1131 void AddToAssignment(SequenceVar*
var,
const std::vector<int>&
value,
1132 bool active, std::vector<int>* assignment_indices,
1134 bool ValueFromAssignment(
const Assignment& assignment, SequenceVar*
var,
1151 SequenceVar, std::vector<int>, SequenceVarLocalSearchHandler>;
1153 SequenceVar, std::vector<int>, SequenceVarLocalSearchHandler>;
1157 typedef VarLocalSearchOperator<SequenceVar, std::vector<int>,
1158 SequenceVarLocalSearchHandler>
1192 SequenceVar*
var,
const std::vector<int>&
value,
bool active,
1193 std::vector<int>* assignment_indices,
int64 index,
1194 Assignment* assignment)
const {
1195 Assignment::SequenceContainer*
const container =
1196 assignment->MutableSequenceVarContainer();
1197 SequenceVarElement* element =
nullptr;
1198 if (assignment_indices !=
nullptr) {
1199 if ((*assignment_indices)[
index] == -1) {
1200 (*assignment_indices)[
index] = container->Size();
1201 element = assignment->FastAdd(
var);
1203 element = container->MutableElement((*assignment_indices)[
index]);
1206 element = assignment->FastAdd(
var);
1209 element->SetForwardSequence(
value);
1211 element->Activate();
1213 element->Deactivate();
1218 const Assignment& assignment, SequenceVar*
var,
int64 index,
1219 std::vector<int>*
value) {
1220 const Assignment::SequenceContainer& container =
1221 assignment.SequenceVarContainer();
1222 const SequenceVarElement* element = &(container.Element(
index));
1223 if (element->Var() !=
var) {
1224 CHECK(container.Contains(
var))
1225 <<
"Assignment does not contain operator variable " <<
var;
1226 element = &(container.Element(
var));
1228 const std::vector<int>& element_value = element->ForwardSequence();
1229 CHECK_GE(
var->size(), element_value.size());
1231 *
value = element_value;
1232 return element->Activated();
1273 explicit BaseLns(
const std::vector<IntVar*>& vars);
1287 void OnStart()
override;
1288 std::vector<int> fragment_;
1297 explicit ChangeValue(
const std::vector<IntVar*>& vars);
1306 void OnStart()
override;
1340 const std::vector<IntVar*>& path_vars,
int number_of_base_nodes,
1341 bool skip_locally_optimal_paths,
bool accept_path_end_base,
1342 std::function<
int(
int64)> start_empty_path_class);
1345 void Reset()
override;
1387 const int alternative_index = alternative_index_[
BaseNode(i)];
1388 return alternative_index >= 0
1389 ? alternative_sets_[alternative_index][base_alternatives_[i]]
1394 return base_sibling_alternatives_[i];
1399 const int sibling_alternative_index =
1401 return sibling_alternative_index >= 0
1402 ? alternative_sets_[sibling_alternative_index]
1403 [base_sibling_alternatives_[i]]
1409 const std::vector<int64>&
path_starts()
const {
return path_starts_; }
1412 return start_empty_path_class_ !=
nullptr
1498 return !
IsPathEnd(node) && inactives_[node];
1513 const int alternative = alternative_sets_.size();
1514 for (
int64 node : alternative_set) {
1515 DCHECK_EQ(-1, alternative_index_[node]);
1516 alternative_index_[node] = alternative;
1518 alternative_sets_.push_back(alternative_set);
1519 sibling_alternative_.push_back(-1);
1526 const std::vector<std::pair<std::vector<int64>, std::vector<int64>>>&
1527 pair_alternative_sets) {
1528 for (
const auto& pair_alternative_set : pair_alternative_sets) {
1530 sibling_alternative_.back() = alternative + 1;
1537 return alternative_index >= 0
1538 ? active_in_alternative_set_[alternative_index]
1547 if (node >= alternative_index_.size())
return -1;
1548 const int alternative = alternative_index_[node];
1549 return alternative >= 0 ? sibling_alternative_[alternative] : -1;
1554 if (node >= alternative_index_.size())
return -1;
1555 const int alternative = alternative_index_[node];
1556 const int sibling_alternative =
1557 alternative >= 0 ? sibling_alternative_[alternative] : -1;
1563 int64 exclude)
const;
1572 void OnStart()
override;
1574 bool OnSamePath(
int64 node1,
int64 node2)
const;
1576 bool CheckEnds()
const {
1577 const int base_node_size = base_nodes_.size();
1578 for (
int i = base_node_size - 1; i >= 0; --i) {
1579 if (base_nodes_[i] != end_nodes_[i]) {
1585 bool IncrementPosition();
1586 void InitializePathStarts();
1587 void InitializeInactives();
1588 void InitializeBaseNodes();
1589 void InitializeAlternatives();
1592 std::vector<int> base_nodes_;
1593 std::vector<int> base_alternatives_;
1594 std::vector<int> base_sibling_alternatives_;
1595 std::vector<int> end_nodes_;
1596 std::vector<int> base_paths_;
1597 std::vector<int64> path_starts_;
1598 std::vector<bool> inactives_;
1601 const bool accept_path_end_base_;
1602 std::function<int(
int64)> start_empty_path_class_;
1603 bool skip_locally_optimal_paths_;
1604 bool optimal_paths_enabled_;
1605 std::vector<int> path_basis_;
1606 std::vector<bool> optimal_paths_;
1609 std::vector<std::vector<int64>> alternative_sets_;
1611 std::vector<int> alternative_index_;
1612 std::vector<int64> active_in_alternative_set_;
1613 std::vector<int> sibling_alternative_;
1619 Solver* solver,
const std::vector<IntVar*>& vars,
1620 const std::vector<IntVar*>& secondary_vars,
1621 std::function<
int(
int64)> start_empty_path_class);
1629 class MakeActiveOperator;
1630 class MakeInactiveOperator;
1631 class MakeChainInactiveOperator;
1632 class SwapActiveOperator;
1633 class ExtendedSwapActiveOperator;
1634 class MakeActiveAndRelocate;
1635 class RelocateAndMakeActiveOperator;
1636 class RelocateAndMakeInactiveOperator;
1650 class LocalSearchVariable;
1666 void RelaxVariableBounds(
int variable_index);
1667 bool TightenVariableMin(
int variable_index,
int64 value);
1668 bool TightenVariableMax(
int variable_index,
int64 value);
1669 int64 VariableMin(
int variable_index)
const;
1670 int64 VariableMax(
int variable_index)
const;
1672 std::vector<Bounds> initial_variable_bounds_;
1673 std::vector<Bounds> variable_bounds_;
1674 std::vector<std::pair<Bounds, int>> saved_variable_bounds_trail_;
1675 std::vector<bool> variable_is_relaxed_;
1676 bool state_is_valid_ =
true;
1686 int64 Min()
const {
return state_->VariableMin(variable_index_); }
1687 int64 Max()
const {
return state_->VariableMax(variable_index_); }
1689 return state_->TightenVariableMin(variable_index_, new_min);
1692 return state_->TightenVariableMax(variable_index_, new_max);
1694 void Relax() { state_->RelaxVariableBounds(variable_index_); }
1701 : state_(state), variable_index_(variable_index) {}
1704 const int variable_index_;
1706 #endif // !defined(SWIG)
1728 virtual void Relax(
const Assignment*
delta,
const Assignment* deltadelta) {}
1730 virtual void Commit(
const Assignment*
delta,
const Assignment* deltadelta) {}
1741 virtual bool Accept(
const Assignment*
delta,
const Assignment* deltadelta,
1742 int64 objective_min,
int64 objective_max) = 0;
1751 const Assignment*
delta) = 0;
1776 return "LocalSearchFilterManager";
1792 const Assignment* deltadelta,
int64 objective_min,
1793 int64 objective_max);
1800 void InitializeForcedEvents();
1802 std::vector<FilterEvent> filter_events_;
1803 int last_event_called_ = -1;
1808 std::vector<int> next_forced_events_;
1809 int64 synchronized_value_;
1810 int64 accepted_value_;
1820 const Assignment*
delta)
override;
1823 DCHECK(
index !=
nullptr);
1824 const int var_index =
var->index();
1825 *
index = (var_index < var_index_to_index_.size())
1826 ? var_index_to_index_[var_index]
1828 return *
index != kUnassigned;
1832 void AddVars(
const std::vector<IntVar*>& vars);
1833 int Size()
const {
return vars_.size(); }
1837 return values_[
index];
1846 std::vector<IntVar*> vars_;
1847 std::vector<int64> values_;
1848 std::vector<bool> var_synced_;
1849 std::vector<int> var_index_to_index_;
1850 static const int kUnassigned;
1857 std::string
DebugString()
const override {
return "PropagationMonitor"; }
1861 Constraint*
const constraint) = 0;
1863 Constraint*
const constraint) = 0;
1865 Constraint*
const parent, Constraint*
const nested) = 0;
1867 Constraint*
const parent, Constraint*
const nested) = 0;
1887 const std::vector<int64>& values) = 0;
1889 const std::vector<int64>& values) = 0;
1910 const std::vector<int>& rank_first,
1911 const std::vector<int>& rank_last,
1912 const std::vector<int>& unperformed) = 0;
1922 std::string
DebugString()
const override {
return "LocalSearchMonitor"; }
1929 bool neighbor_found,
const Assignment*
delta,
1930 const Assignment* deltadelta) = 0;
1933 bool neighbor_found) = 0;
1936 bool neighbor_found) = 0;
1981 std::string
BaseName()
const override {
return "BooleanVar"; }
1999 : symmetry_manager_(nullptr), index_in_symmetry_manager_(-1) {}
2010 CHECK(symmetry_manager_ ==
nullptr);
2011 CHECK_EQ(-1, index_in_symmetry_manager_);
2012 symmetry_manager_ = manager;
2013 index_in_symmetry_manager_ =
index;
2015 SymmetryManager* symmetry_manager()
const {
return symmetry_manager_; }
2016 int index_in_symmetry_manager()
const {
return index_in_symmetry_manager_; }
2020 int index_in_symmetry_manager_;
2027 SearchLog(Solver*
const s, OptimizeVar*
const obj, IntVar*
const var,
2028 double scaling_factor,
double offset,
2029 std::function<std::string()> display_callback,
int period);
2047 virtual void OutputLine(
const std::string& line);
2050 static std::string MemoryUsage();
2053 std::unique_ptr<WallTimer> timer_;
2055 OptimizeVar*
const obj_;
2056 const double scaling_factor_;
2057 const double offset_;
2058 std::function<std::string()> display_callback_;
2061 int64 objective_min_;
2062 int64 objective_max_;
2063 int min_right_depth_;
2065 int sliding_min_depth_;
2066 int sliding_max_depth_;
2203 IntExpr*
const expr1, IntExpr*
const expr2,
2207 IntExpr*
const expr1,
2208 IntExpr*
const expr2,
2217 IntExpr*
const expr,
2233 IntExpr*
const var1, IntExpr*
const var2,
2237 IntExpr*
const var1,
2238 IntExpr*
const var2,
2244 IntExpr*
const var1, IntExpr*
const var2,
int64 constant,
2248 IntExpr*
const expression, IntExpr*
const var1, IntExpr*
const var2,
2258 IntExpr*
const expression, IntVar*
const var,
int64 value1,
int64 value2,
2264 IntVar*
const var,
const std::vector<int64>& values,
2268 IntExpr*
const expression, IntVar*
const var,
2269 const std::vector<int64>& values,
2278 const std::vector<IntVar*>& vars,
2284 const std::vector<IntVar*>& vars,
const std::vector<int64>& values,
2288 IntExpr*
const expression,
const std::vector<IntVar*>&
var,
2289 const std::vector<int64>& values,
2295 const std::vector<IntVar*>& vars,
int64 value,
2299 IntExpr*
const expression,
const std::vector<IntVar*>&
var,
int64 value,
2305 Solver*
const solver_;
2313 const std::string&
TypeName()
const;
2319 const std::vector<int64>& values);
2323 IntExpr*
const expr);
2325 const std::vector<IntVar*>& vars);
2328 const std::vector<IntervalVar*>& vars);
2331 const std::vector<SequenceVar*>& vars);
2342 const std::string& arg_name)
const;
2344 const std::string& arg_name)
const;
2347 const std::string& arg_name)
const;
2349 const std::string& arg_name)
const;
2352 std::string type_name_;
2353 absl::flat_hash_map<std::string, int64> integer_argument_;
2354 absl::flat_hash_map<std::string, std::vector<int64>> integer_array_argument_;
2355 absl::flat_hash_map<std::string, IntTupleSet> matrix_argument_;
2356 absl::flat_hash_map<std::string, IntExpr*> integer_expression_argument_;
2357 absl::flat_hash_map<std::string, IntervalVar*> interval_argument_;
2358 absl::flat_hash_map<std::string, SequenceVar*> sequence_argument_;
2359 absl::flat_hash_map<std::string, std::vector<IntVar*>>
2360 integer_variable_array_argument_;
2361 absl::flat_hash_map<std::string, std::vector<IntervalVar*>>
2362 interval_array_argument_;
2363 absl::flat_hash_map<std::string, std::vector<SequenceVar*>>
2364 sequence_array_argument_;
2376 void EndVisitModel(
const std::string& solver_name)
override;
2378 const Constraint*
const constraint)
override;
2380 const Constraint*
const constraint)
override;
2382 const IntExpr*
const expr)
override;
2384 const IntExpr*
const expr)
override;
2386 IntExpr*
const delegate)
override;
2389 IntVar*
const delegate)
override;
2392 IntervalVar*
const delegate)
override;
2397 const std::vector<int64>& values)
override;
2402 IntExpr*
const argument)
override;
2404 const std::string& arg_name,
2405 const std::vector<IntVar*>& arguments)
override;
2408 IntervalVar*
const argument)
override;
2410 const std::string& arg_name,
2411 const std::vector<IntervalVar*>& arguments)
override;
2414 SequenceVar*
const argument)
override;
2416 const std::string& arg_name,
2417 const std::vector<SequenceVar*>& arguments)
override;
2425 std::vector<ArgumentHolder*> holders_;
2432 : index_min_(index_min),
2433 index_max_(index_max),
2434 values_(new T[index_max - index_min + 1]) {
2435 DCHECK_LE(index_min, index_max);
2441 DCHECK_GE(
index, index_min_);
2442 DCHECK_LE(
index, index_max_);
2443 return values_[
index - index_min_];
2447 DCHECK_GE(
index, index_min_);
2448 DCHECK_LE(
index, index_max_);
2452 std::string
DebugString()
const override {
return "ArrayWithOffset"; }
2455 const int64 index_min_;
2456 const int64 index_max_;
2457 std::unique_ptr<T[]> values_;
2465 template <
class T,
class C>
2469 : block_size_(block_size), block_offset_(0) {
2470 CHECK_GT(block_size, 0);
2474 for (
int i = 0; i < elements_.size(); ++i) {
2475 delete[] elements_[i];
2480 const int64 block_index = ComputeBlockIndex(
index);
2481 const int64 relative_index = block_index - block_offset_;
2482 if (relative_index < 0 || relative_index >= elements_.size()) {
2485 const T* block = elements_[relative_index];
2486 return block !=
nullptr ? block[
index - block_index * block_size_] : T();
2490 const int64 block_index = ComputeBlockIndex(
index);
2491 T*
const block = GetOrCreateBlock(block_index);
2492 const int64 residual =
index - block_index * block_size_;
2493 solver->SaveAndSetValue(
reinterpret_cast<C*
>(&block[residual]),
2494 reinterpret_cast<C
>(
value));
2498 T* NewBlock()
const {
2499 T*
const result =
new T[block_size_];
2500 for (
int i = 0; i < block_size_; ++i) {
2506 T* GetOrCreateBlock(
int block_index) {
2507 if (elements_.size() == 0) {
2508 block_offset_ = block_index;
2509 GrowUp(block_index);
2510 }
else if (block_index < block_offset_) {
2511 GrowDown(block_index);
2512 }
else if (block_index - block_offset_ >= elements_.size()) {
2513 GrowUp(block_index);
2515 T* block = elements_[block_index - block_offset_];
2516 if (block ==
nullptr) {
2518 elements_[block_index - block_offset_] = block;
2525 : (
value - block_size_ + 1) / block_size_;
2528 void GrowUp(
int64 block_index) {
2529 elements_.resize(block_index - block_offset_ + 1);
2532 void GrowDown(
int64 block_index) {
2533 const int64 delta = block_offset_ - block_index;
2534 block_offset_ = block_index;
2535 DCHECK_GT(
delta, 0);
2536 elements_.insert(elements_.begin(),
delta,
nullptr);
2539 const int64 block_size_;
2540 std::vector<T*> elements_;
2559 delete_position_(true) {
2560 for (
int i = 0; i <
capacity; ++i) {
2570 position_(shared_positions),
2571 delete_position_(false) {
2572 for (
int i = 0; i < shared_positions_size; ++i) {
2578 if (delete_position_) {
2583 int Size()
const {
return num_elements_.Value(); }
2589 DCHECK_LT(i, num_elements_.Value());
2590 return elements_[i];
2595 DCHECK_LT(i + num_elements_.Value(), capacity_);
2596 return elements_[i + num_elements_.Value()];
2599 void Insert(Solver*
const solver,
const T& elt) {
2600 const int position = num_elements_.Value();
2601 DCHECK_LT(position, capacity_);
2602 DCHECK(NotAlreadyInserted(elt));
2603 elements_[position] = elt;
2604 position_[elt] = position;
2605 num_elements_.Incr(solver);
2608 void Remove(Solver*
const solver,
const T& value_index) {
2609 num_elements_.Decr(solver);
2610 SwapTo(value_index, num_elements_.Value());
2613 void Restore(Solver*
const solver,
const T& value_index) {
2614 SwapTo(value_index, num_elements_.Value());
2615 num_elements_.Incr(solver);
2618 void Clear(Solver*
const solver) { num_elements_.SetValue(solver, 0); }
2627 bool NotAlreadyInserted(
const T& elt) {
2628 for (
int i = 0; i < num_elements_.Value(); ++i) {
2629 if (elt == elements_[i]) {
2636 void SwapTo(T value_index,
int next_position) {
2637 const int current_position = position_[value_index];
2638 if (current_position != next_position) {
2639 const T next_value_index = elements_[next_position];
2640 elements_[current_position] = next_value_index;
2641 elements_[next_position] = value_index;
2642 position_[value_index] = next_position;
2643 position_[next_value_index] = current_position;
2648 std::unique_ptr<T[]> elements_;
2650 NumericalRev<int> num_elements_;
2652 const int capacity_;
2656 const bool delete_position_;
2666 last_ranked_(items.size() - 1),
2667 size_(items.size()),
2668 position_(new int[size_]) {
2669 for (
int i = 0; i < size_; ++i) {
2670 elements_[i] = items[i];
2678 last_ranked_(size - 1),
2680 position_(new int[size_]) {
2681 for (
int i = 0; i < size_; ++i) {
2697 DCHECK_GE(
index, 0);
2698 DCHECK_LT(
index, size_);
2699 return elements_[
index];
2704 DCHECK_LE(first_ranked_.Value(), last_ranked_.Value());
2705 SwapTo(elt, first_ranked_.Value());
2706 first_ranked_.Incr(solver);
2710 DCHECK_LE(first_ranked_.Value(), last_ranked_.Value());
2711 SwapTo(elt, last_ranked_.Value());
2712 last_ranked_.Decr(solver);
2716 const int position = position_[elt];
2717 return (position < first_ranked_.Value() ||
2718 position > last_ranked_.Value());
2722 std::string result =
"[";
2723 for (
int i = 0; i < first_ranked_.Value(); ++i) {
2724 absl::StrAppend(&result, elements_[i]);
2725 if (i != first_ranked_.Value() - 1) {
2730 for (
int i = first_ranked_.Value(); i <= last_ranked_.Value(); ++i) {
2731 absl::StrAppend(&result, elements_[i]);
2732 if (i != last_ranked_.Value()) {
2737 for (
int i = last_ranked_.Value() + 1; i < size_; ++i) {
2738 absl::StrAppend(&result, elements_[i]);
2739 if (i != size_ - 1) {
2748 void SwapTo(
int elt,
int next_position) {
2749 const int current_position = position_[elt];
2750 if (current_position != next_position) {
2751 const int next_elt = elements_[next_position];
2752 elements_[current_position] = next_elt;
2753 elements_[next_position] = elt;
2754 position_[elt] = next_position;
2755 position_[next_elt] = current_position;
2760 std::vector<int> elements_;
2762 NumericalRev<int> first_ranked_;
2764 NumericalRev<int> last_ranked_;
2768 std::unique_ptr<int[]> position_;
2784 void Init(Solver*
const solver,
const std::vector<uint64>& mask);
2788 bool RevSubtract(Solver*
const solver,
const std::vector<uint64>& mask);
2792 bool RevAnd(Solver*
const solver,
const std::vector<uint64>& mask);
2808 bool Intersects(
const std::vector<uint64>& mask,
int* support_index);
2818 void CleanUpActives(Solver*
const solver);
2820 const int64 bit_size_;
2821 const int64 word_size_;
2822 RevArray<uint64> bits_;
2824 std::vector<int> to_remove_;
2829 for (
int i = 0; i < values.size(); ++i) {
2830 if (values[i] !=
value) {
2839 for (
int i = 0; i < values.size(); ++i) {
2840 if (values[i] != 0 && values[i] != 1) {
2859 for (
const T& current_value : values) {
2860 if (current_value <
value) {
2869 for (
const T& current_value : values) {
2870 if (current_value >
value) {
2899 for (
int i = 0; i < values.size() - 1; ++i) {
2900 if (values[i + 1] != values[i] + 1) {
2909 for (
int i = 0; i < values.size() - 1; ++i) {
2910 if (values[i + 1] < values[i]) {
2920 for (
int i = 0; i < vars.size(); ++i) {
2921 if (vars[i]->Min() < range_min || vars[i]->Max() > range_max) {
2929 for (
int i = 0; i < vars.size(); ++i) {
2930 if (!vars[i]->Bound()) {
2945 const std::vector<T>& values) {
2946 for (
int i = 0; i < vars.size(); ++i) {
2947 if (values[i] != 0 && !vars[i]->Bound()) {
2956 for (
int i = 0; i < vars.size(); ++i) {
2957 if (!vars[i]->Bound() || vars[i]->Min() !=
value) {
2965 DCHECK(!vars.empty());
2967 for (
int i = 0; i < vars.size(); ++i) {
2969 result = std::max<int64>(result, vars[i]->Max());
2975 DCHECK(!vars.empty());
2977 for (
int i = 0; i < vars.size(); ++i) {
2979 result = std::min<int64>(result, vars[i]->Min());
2985 std::vector<int64>*
const values) {
2987 values->resize(vars.size());
2988 for (
int i = 0; i < vars.size(); ++i) {
2989 (*values)[i] = vars[i]->Value();
2996 return e % v == 0 ? e / v : e / v + 1;
3007 return e % v == 0 ? e / v : e / v - 1;
3073 PathState(
int num_nodes, std::vector<int> path_start,
3074 std::vector<int> path_end);
3083 int Start(
int path)
const {
return path_start_end_[path].start; }
3085 int End(
int path)
const {
return path_start_end_[path].end; }
3091 return committed_nodes_[committed_index_[node]].path;
3096 return changed_arcs_;
3102 ChainRange
Chains(
int path)
const;
3104 NodeRange
Nodes(
int path)
const;
3111 changed_arcs_.emplace_back(node, new_next);
3127 struct PathStartEnd {
3128 PathStartEnd(
int start,
int end) : start(start), end(end) {}
3137 struct ChainBounds {
3138 ChainBounds() =
default;
3139 ChainBounds(
int begin_index,
int end_index)
3140 : begin_index(begin_index), end_index(end_index) {}
3144 struct CommittedNode {
3145 CommittedNode(
int node,
int path) : node(node), path(path) {}
3153 struct TailHeadIndices {
3160 bool operator<(
const IndexArc& other)
const {
return index < other.index; }
3165 void CopyNewPathAtEndOfNodes(
int path);
3168 void IncrementalCommit();
3174 const int num_nodes_;
3175 const int num_paths_;
3176 std::vector<PathStartEnd> path_start_end_;
3203 std::vector<CommittedNode> committed_nodes_;
3204 std::vector<int> committed_index_;
3205 const int num_nodes_threshold_;
3206 std::vector<ChainBounds> chains_;
3207 std::vector<PathBounds> paths_;
3211 std::vector<std::pair<int, int>> changed_arcs_;
3212 std::vector<int> changed_paths_;
3213 std::vector<bool> path_has_changed_;
3217 std::vector<TailHeadIndices> tail_head_indices_;
3218 std::vector<IndexArc> arcs_by_tail_index_;
3219 std::vector<IndexArc> arcs_by_head_index_;
3220 std::vector<int> next_arc_;
3234 return current_node_ != other.current_node_;
3240 explicit Iterator(
const CommittedNode* node) : current_node_(node) {}
3241 const CommittedNode* current_node_;
3246 Chain(
const CommittedNode* begin_node,
const CommittedNode* end_node)
3247 : begin_(begin_node), end_(end_node) {}
3250 int First()
const {
return begin_->node; }
3251 int Last()
const {
return (end_ - 1)->node; }
3256 const CommittedNode*
const begin_;
3257 const CommittedNode*
const end_;
3270 return {first_node_ + current_chain_->begin_index,
3271 first_node_ + current_chain_->end_index};
3274 return current_chain_ != other.current_chain_;
3280 Iterator(
const ChainBounds* chain,
const CommittedNode*
const first_node)
3281 : current_chain_(chain), first_node_(first_node) {}
3282 const ChainBounds* current_chain_;
3283 const CommittedNode*
const first_node_;
3289 const ChainBounds*
const end_chain,
3290 const CommittedNode*
const first_node)
3291 : begin_(begin_chain), end_(end_chain), first_node_(first_node) {}
3297 const ChainBounds*
const begin_;
3298 const ChainBounds*
const end_;
3299 const CommittedNode*
const first_node_;
3310 if (current_node_ == end_node_) {
3314 const ChainBounds
bounds = *current_chain_;
3315 current_node_ = first_node_ +
bounds.begin_index;
3316 end_node_ = first_node_ +
bounds.end_index;
3322 return current_chain_ != other.current_chain_;
3328 Iterator(
const ChainBounds* current_chain,
3329 const CommittedNode*
const first_node)
3330 : current_node_(first_node + current_chain->begin_index),
3331 end_node_(first_node + current_chain->end_index),
3332 current_chain_(current_chain),
3333 first_node_(first_node) {}
3334 const CommittedNode* current_node_;
3335 const CommittedNode* end_node_;
3336 const ChainBounds* current_chain_;
3337 const CommittedNode*
const first_node_;
3342 NodeRange(
const ChainBounds* begin_chain,
const ChainBounds* end_chain,
3343 const CommittedNode* first_node)
3344 : begin_chain_(begin_chain),
3345 end_chain_(end_chain),
3346 first_node_(first_node) {}
3353 const ChainBounds* begin_chain_;
3354 const ChainBounds* end_chain_;
3355 const CommittedNode*
const first_node_;
3380 std::vector<Interval> path_capacity,
3381 std::vector<int> path_class,
3382 std::vector<std::vector<Interval>>
demand,
3383 std::vector<Interval> node_capacity);
3399 Interval GetMinMaxPartialDemandSum(
int first_node_index,
3400 int last_node_index)
const;
3406 bool SubpathOnlyHasTrivialNodes(
int first_node_index,
3407 int last_node_index)
const;
3413 void IncrementalCommit();
3416 void AppendPathDemandsToSums(
int path);
3422 void UpdateRMQStructure(
int begin_index,
int end_index);
3425 const std::vector<Interval> path_capacity_;
3426 const std::vector<int> path_class_;
3427 const std::vector<std::vector<Interval>> demand_;
3428 const std::vector<Interval> node_capacity_;
3434 std::vector<int> index_;
3444 std::vector<std::vector<Interval>> partial_demand_sums_rmq_;
3447 const int maximum_partial_demand_layer_size_;
3452 std::vector<int> previous_nontrivial_index_;
3461 std::unique_ptr<PathState> path_state,
3462 const std::vector<IntVar*>& nexts);
3472 Solver* solver, std::unique_ptr<UnaryDimensionChecker> checker);
3474 #endif // !defined(SWIG)
3478 #endif // OR_TOOLS_CONSTRAINT_SOLVER_CONSTRAINT_SOLVERI_H_
void BeginVisitModel(const std::string &solver_name) override
Header/footers.
void Switch(Solver *const solver)
virtual Constraint * FindVarConstantConstraint(IntVar *const var, int64 value, VarConstantConstraintType type) const =0
Var Constant Constraints.
bool AreAllPositive(const std::vector< T > &values)
VarArrayConstantExpressionType
int64 MinVarArray(const std::vector< IntVar * > &vars)
bool IsSet(int64 index) const
Returns whether the 'index' bit is set.
@ VAR_CONSTANT_LESS_OR_EQUAL
bool Contains(int64 v) const override
int next_base_to_increment_
virtual void OutputLine(const std::string &line)
IntVar * IsLessOrEqual(int64 constant) override
virtual void InsertVarConstantConstraint(Constraint *const ct, IntVar *const var, int64 value, VarConstantConstraintType type)=0
virtual void SetStartRange(IntervalVar *const var, int64 new_min, int64 new_max)=0
int64 Min() const override
IntVarLocalSearchHandler()
int64 StartNode(int i) const
Returns the start node of the ith base node.
virtual void EndFiltering(const LocalSearchFilter *filter, bool reject)=0
int BaseSiblingAlternative(int i) const
Returns the alternative for the sibling of the ith base node.
std::string DebugString() const override
Solver::DemonPriority priority() const override
virtual void SetDurationRange(IntervalVar *const var, int64 new_min, int64 new_max)=0
~SymmetryBreaker() override
bool MakeActive(int64 node, int64 destination)
Insert the inactive node after destination.
virtual void RankFirst(SequenceVar *const var, int index)=0
SequenceVar modifiers.
int64 GetFirstOne() const
Gets the index of the first bit set starting from 0.
void ClearAndResize(IntegerType size)
virtual void InsertVoidConstraint(Constraint *const ct, VoidConstraintType type)=0
std::vector< int64 > ToInt64Vector(const std::vector< int > &input)
void EndInitialPropagation() override
bool AreAllBooleans(const std::vector< IntVar * > &vars)
This class is a reversible growing array.
const int number_of_nexts_
~UnsortedNullableRevBitset()
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.
virtual IntExpr * FindExprConstantExpression(IntExpr *const expr, int64 value, ExprConstantExpressionType type) const =0
Expr Constant Expressions.
void PushIfNotTop(Solver *const s, T val)
Pushes the var on top if is not a duplicate of the current top object.
SimpleRevFIFO< Demon * > delayed_bound_demons_
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...
virtual void EndFilterNeighbor(const LocalSearchOperator *op, bool neighbor_found)=0
int64 Value(int index) const
virtual void EndConstraintInitialPropagation(Constraint *const constraint)=0
void SetIntervalArrayArgument(const std::string &arg_name, const std::vector< IntervalVar * > &vars)
int64 GetFirstBit(int start) const
Gets the index of the first bit set starting from start.
void RevertChanges(bool incremental)
void Restore(Solver *const solver, const T &value_index)
virtual void EndMakeNextNeighbor(const LocalSearchOperator *op, bool neighbor_found, const Assignment *delta, const Assignment *deltadelta)=0
void RankFirst(Solver *const solver, int elt)
@ VAR_ARRAY_CONSTANT_ARRAY_SCAL_PROD
bool IsIncreasingContiguous(const std::vector< T > &values)
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.
const RevIntSet< int > & active_words() const
Returns the set of active word indices.
bool HasIntegerVariableArrayArgument(const std::string &arg_name) const
DelayedCallMethod2(T *const ct, void(T::*method)(P, Q), const std::string &name, P param1, Q param2)
This iterator is not stable with respect to deletion.
void SetInverseValue(int64 index, int64 value)
virtual void EndNestedConstraintInitialPropagation(Constraint *const parent, Constraint *const nested)=0
virtual void EndDemonRun(Demon *const demon)=0
int64 GetSynchronizedObjectiveValue() const
void WhenDomain(Demon *d) override
SequenceVarLocalSearchHandler(SequenceVarLocalSearchOperator *op)
void EndVisitConstraint(const std::string &type_name, const Constraint *const constraint) override
int64 InverseValue(int64 index) const
std::string DebugString() const override
@ EXPR_CONSTANT_IS_LESS_OR_EQUAL
RevIntSet(int capacity)
Capacity is the fixed size of the set (it cannot grow).
@ VAR_CONSTANT_ARRAY_EXPRESSION_MAX
virtual IntExpr * FindVarConstantArrayExpression(IntVar *const var, const std::vector< int64 > &values, VarConstantArrayExpressionType type) const =0
Var Constant Array Expressions.
Low-priority demon proxy to a method on the constraint with two arguments.
const bool ignore_path_vars_
int NumFirstRanked() const
@ EXPR_EXPR_EXPRESSION_MAX
IntVarLocalSearchHandler(const IntVarLocalSearchHandler &other)
std::string DebugString() const override
NodeRange Nodes(int path) const
void Set(IntegerType index)
virtual void OnStart()
Called by Start() after synchronizing the operator with the current assignment.
void ResetPosition()
Reset the position of the operator to its position when Start() was last called; this can be used to ...
virtual void InsertVarConstantConstantExpression(IntExpr *const expression, IntVar *const var, int64 value1, int64 value2, VarConstantConstantExpressionType type)=0
std::string BaseName() const override
@ VAR_CONSTANT_CONSTANT_BETWEEN
virtual void BeginFilterNeighbor(const LocalSearchOperator *op)=0
virtual bool MakeNextNeighbor(Assignment *delta, Assignment *deltadelta)=0
void Run(Solver *const s) override
UnsortedNullableRevBitset(int bit_size)
Size is the number of bits to store in the bitset.
std::string DebugString() const override
This class represents a reversible bitset.
bool AreAllOnes(const std::vector< T > &values)
void SetSequenceArrayArgument(const std::string &arg_name, const std::vector< SequenceVar * > &vars)
void AddVars(const std::vector< V * > &vars)
friend class IntVarLocalSearchHandler
void SetIntervalArgument(const std::string &arg_name, IntervalVar *const var)
void VisitIntegerArrayArgument(const std::string &arg_name, const std::vector< int64 > &values) override
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 void SetStartMin(IntervalVar *const var, int64 new_min)=0
IntervalVar modifiers.
virtual void SetDurationMin(IntervalVar *const var, int64 new_min)=0
int64 BaseSiblingAlternativeNode(int i) const
Returns the alternative node for the sibling of the ith base node.
This is the base class for building an Lns operator.
@ EXPR_EXPR_CONSTANT_CONDITIONAL
BaseLns(const std::vector< IntVar * > &vars)
virtual bool InitPosition() const
Returns true if the operator needs to restart its initial position at each call to Start()
SequenceVarLocalSearchHandler(const SequenceVarLocalSearchHandler &other)
bool IsVarSynced(int index) const
bool SwapActiveAndInactive(int64 active, int64 inactive)
Replaces active by inactive in the current path, making active inactive.
virtual void BeginNestedConstraintInitialPropagation(Constraint *const parent, Constraint *const nested)=0
virtual void BeginDemonRun(Demon *const demon)=0
virtual void InsertExprExprExpression(IntExpr *const expression, IntExpr *const var1, IntExpr *const var2, ExprExprExpressionType type)=0
virtual void EndOperatorStart()=0
bool MakeOneNeighbor() override
This method should not be overridden. Override NextFragment() instead.
@ VAR_ARRAY_EXPRESSION_MAX
IntVarLocalSearchOperator(const std::vector< IntVar * > &vars, bool keep_inverse_values=false)
void SetToOne(Solver *const solver, int64 pos)
Sets the 'pos' bit.
@ EXPR_CONSTANT_EXPRESSION_MAX
Solver::DemonPriority priority() const override
DelayedCallMethod1(T *const ct, void(T::*method)(P), const std::string &name, P param1)
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...
~LocalSearchMonitor() override
The base class of all search logs that periodically outputs information when the search is running.
void VisitSequenceVariable(const SequenceVar *const variable) override
bool AreAllBoundTo(const std::vector< IntVar * > &vars, int64 value)
Returns true if all variables are assigned to 'value'.
int64 GetActiveAlternativeSibling(int node) const
Returns the active node in the alternative set of the sibling of the given node.
@ VAR_CONSTANT_ARRAY_ELEMENT
void SetIntegerVariableArrayArgument(const std::string &arg_name, const std::vector< IntVar * > &vars)
Reversible Immutable MultiMap class.
PropagationMonitor(Solver *const solver)
~PropagationMonitor() 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)
virtual void SetMin(IntExpr *const expr, int64 new_min)=0
IntExpr modifiers.
LocalSearchFilter * filter
int Start(int path) const
void Synchronize(const Assignment *assignment, const Assignment *delta)
Synchronizes all filters to assignment.
bool IsInverseValue(int64 index) const
void VisitIntegerArgument(const std::string &arg_name, int64 value) override
Integer arguments.
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...
SmallRevBitSet(int64 size)
SequenceVarLocalSearchOperator(const std::vector< SequenceVar * > &vars)
virtual void InsertVarArrayExpression(IntExpr *const expression, const std::vector< IntVar * > &vars, VarArrayExpressionType type)=0
SharedBoundsManager * bounds
int64 OldNext(int64 node) const
Base class of the local search operators dedicated to path modifications (a path is a set of nodes li...
virtual Constraint * FindVoidConstraint(VoidConstraintType type) const =0
Void constraints.
void PushArgumentHolder()
The vehicle routing library lets one model and solve generic vehicle routing problems ranging from th...
CallMethod1(T *const ct, void(T::*method)(P), const std::string &name, P param1)
VarConstantArrayExpressionType
virtual bool IsIncremental() const
void Clear(Solver *const solver)
bool IsInactive(int64 node) const
Returns true if node is inactive.
int64 PosIntDivUp(int64 e, int64 v)
const T & LastValue() const
Returns the last value in the FIFO.
@ EXPR_EXPR_CONSTANT_EXPRESSION_MAX
bool AreAllGreaterOrEqual(const std::vector< T > &values, const T &value)
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 InsertExprExprConstantExpression(IntExpr *const expression, IntExpr *const var1, IntExpr *const var2, int64 constant, ExprExprConstantExpressionType type)=0
static const int64 kint64min
bool AtSolution() override
std::string DebugString() const
~SequenceVarLocalSearchOperator() override
const std::string & TypeName() const
Type of the argument.
virtual void RegisterDemon(Demon *const demon)=0
@ VAR_CONSTANT_CONSTANT_CONSTRAINT_MAX
bool SetMin(int64 new_min)
void VisitIntegerVariableArrayArgument(const std::string &arg_name, const std::vector< IntVar * > &arguments) override
Demon proxy to a method on the constraint with one argument.
std::vector< int64 > start_to_path_
int64 Value() const override
~DelayedCallMethod0() override
void Insert(Solver *const solver, const T &elt)
bool Bound() const override
void AddIntegerVariableEqualValueClause(IntVar *const var, int64 value)
void AppendToFragment(int index)
void BeginFail() override
friend class RevBitMatrix
~VarLocalSearchOperator() override
void Run(Solver *const s) override
T RemovedElement(int i) const
void SetToOne(Solver *const solver, int64 index)
Sets the 'index' bit.
int ActiveWordSize() const
This method returns the number of non null 64 bit words in the bitset representation.
void RefuteDecision(Decision *const decision) override
Base operator class for operators manipulating variables.
~LocalSearchOperator() override
int64 Path(int64 node) const
Returns the index of the path to which node belongs in the current delta.
const Val & Value(int64 index) const
Returns the value in the current assignment of the variable of given index.
~IntVarLocalSearchOperator() override
~ArrayWithOffset() override
virtual void BeginConstraintInitialPropagation(Constraint *const constraint)=0
Propagation events.
bool SkipUnchanged(int index) const override
const_iterator end() const
Filter manager: when a move is made, filters are executed to decide whether the solution is feasible ...
@ EXPR_CONSTANT_IS_GREATER_OR_EQUAL
friend class SymmetryManager
virtual bool HoldsDelta() const
GurobiMPCallbackContext * context
VarConstantConstantExpressionType
virtual IntExpr * FindExprExprExpression(IntExpr *const var1, IntExpr *const var2, ExprExprExpressionType type) const =0
Expr Expr Expressions.
void VisitIntervalArrayArgument(const std::string &arg_name, const std::vector< IntervalVar * > &arguments) override
void NoMoreSolutions() override
Specialization of LocalSearchOperator built from an array of IntVars which specifies the scope of the...
bool ValueFromAssignment(const Assignment &assignment, SequenceVar *var, int64 index, std::vector< int > *value)
void RankLast(Solver *const solver, int elt)
void BeginVisitIntegerExpression(const std::string &type_name, const IntExpr *const expr) override
void SetToZero(Solver *const solver, int64 pos)
Erases the 'pos' bit.
void SetToZero(Solver *const solver, int64 index)
Erases the 'index' bit.
bool ApplyChanges(Assignment *delta, Assignment *deltadelta) const
virtual void SetValue(IntVar *const var, int64 value)=0
std::vector< int > assignment_indices_
int BaseAlternative(int i) const
Returns the alternative for the ith base node.
virtual void InitFragments()
void MarkChange(int64 index)
OnStart() should really be protected, but then SWIG doesn't see it.
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 void OnSynchronize(const Assignment *delta)
int64 bit_size() const
Returns the number of bits given in the constructor of the bitset.
LocalSearchFilter * MakeUnaryDimensionFilter(Solver *solver, std::unique_ptr< UnaryDimensionChecker > checker)
Demon * MakeDelayedConstraintDemon0(Solver *const s, T *const ct, void(T::*method)(), const std::string &name)
virtual void BeginAcceptNeighbor(const LocalSearchOperator *op)=0
The base class for all local search operators.
virtual void RemoveValues(IntVar *const var, const std::vector< int64 > &values)=0
void AddVars(const std::vector< IntVar * > &vars)
Add variables to "track" to the filter.
bool IsArrayConstant(const std::vector< T > &values, const T &value)
SparseBitset delta_changes_
VarConstantConstantConstraintType
bool IsIncreasing(const std::vector< T > &values)
void WhenBound(Demon *d) override
DelayedCallMethod0(T *const ct, void(T::*method)(), const std::string &name)
void Run(Solver *const s) override
void BeginInitialPropagation() override
VarLocalSearchOperator(Handler var_handler)
Solver::DemonPriority priority() const override
int64 GetFirstBit(int row, int start) const
Returns the first bit in the row 'row' which position is >= 'start'.
virtual const LocalSearchOperator * Self() const
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.
ExprConstantExpressionType
void SetLastValue(const T &v)
Sets the last value in the FIFO.
virtual void RestoreValue()=0
int64 GetActiveInAlternativeSet(int alternative_index) const
Returns the active node in the given alternative set.
SearchLog(Solver *const s, OptimizeVar *const obj, IntVar *const var, double scaling_factor, double offset, std::function< std::string()> display_callback, int period)
void SetBackwardSequence(int64 index, const std::vector< int > &value)
virtual Constraint * FindExprExprConstraint(IntExpr *const expr1, IntExpr *const expr2, ExprExprConstraintType type) const =0
Expr Expr Constraints.
int64 BaseNode(int i) const
Returns the ith base node of the operator.
~DelayedCallMethod2() override
void RemoveValue(int64 v) override
std::string DebugString() const override
const std::vector< int64 > & path_starts() const
Returns the vector of path start nodes.
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 ...
bool IsSet(int64 row, int64 column) const
Returns whether the 'column' bit in the 'row' row is set.
void AddToAssignment(SequenceVar *var, const std::vector< int > &value, bool active, std::vector< int > *assignment_indices, int64 index, Assignment *assignment) const
int64 FindIntegerArgumentWithDefault(const std::string &arg_name, int64 def) const
Getters.
void Init(Solver *const solver, const std::vector< uint64 > &mask)
This methods overwrites the active bitset with the mask.
SequenceVarLocalSearchOperator()
ChainRange Chains(int path) const
ExprExprConstantExpressionType
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...
@ EXPR_EXPR_IS_LESS_OR_EQUAL
Implements a complete cache for model elements: expressions and constraints.
bool RevSubtract(Solver *const solver, const std::vector< uint64 > &mask)
This method subtracts the mask from the active bitset.
Chain(const CommittedNode *begin_node, const CommittedNode *end_node)
@ VAR_CONSTANT_CONSTRAINT_MAX
void ChangeNext(int node, int new_next)
void Run(Solver *const s) override
bool AreAllLessOrEqual(const std::vector< T > &values, const T &value)
virtual void SetRange(IntExpr *const expr, int64 new_min, int64 new_max)=0
void SetMin(int64 m) override
int PathClass(int i) const
Returns the class of the path of the ith base node.
void Synchronize(const Assignment *assignment, const Assignment *delta) override
This method should not be overridden.
void SetIntegerArrayArgument(const std::string &arg_name, const std::vector< int64 > &values)
std::string DebugString() const override
virtual bool MakeNeighbor()=0
@ VAR_CONSTANT_GREATER_OR_EQUAL
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 ...
virtual void SetStartMax(IntervalVar *const var, int64 new_max)=0
virtual void InsertVarArrayConstantExpression(IntExpr *const expression, const std::vector< IntVar * > &var, int64 value, VarArrayConstantExpressionType type)=0
Demon proxy to a method on the constraint with two arguments.
virtual void SetMin(IntVar *const var, int64 new_min)=0
IntVar modifiers.
@ EXPR_CONSTANT_IS_NOT_EQUAL
RevPartialSequence(const std::vector< int > &items)
void BeginVisitConstraint(const std::string &type_name, const Constraint *const constraint) override
int64 Max() const override
uint64 Size() const override
virtual int64 ModifyValue(int64 index, int64 value)=0
bool IsCardinalityOne() const
Does it contains only one bit set?
virtual IntVar * CastToVar()
@ EXPR_EXPR_GREATER_OR_EQUAL
int64 word_size() const
Returns the number of 64 bit words used to store the bitset.
void VisitIntervalVariable(const IntervalVar *const variable, const std::string &operation, int64 value, IntervalVar *const delegate) override
LocalSearchFilter * MakePathStateFilter(Solver *solver, std::unique_ptr< PathState > path_state, const std::vector< IntVar * > &nexts)
virtual bool RestartAtPathStartOnSynchronize()
When the operator is being synchronized with a new solution (when Start() is called),...
VarLocalSearchOperator< SequenceVar, std::vector< int >, SequenceVarLocalSearchHandler > SequenceVarLocalSearchOperatorTemplate
virtual bool NextFragment()=0
void EndVisitIntegerExpression(const std::string &type_name, const IntExpr *const expr) override
virtual bool SkipUnchanged(int index) const
bool ContainsKey(const K &key) const
Returns true if the multi-map contains at least one instance of 'key'.
virtual void Start(const Assignment *assignment)=0
virtual T Evaluate(int64 index) const
int AddAlternativeSet(const std::vector< int64 > &alternative_set)
Handling node alternatives.
ChangeValue(const std::vector< IntVar * > &vars)
Low-priority demon proxy to a method on the constraint with no arguments.
std::vector< std::vector< int > > backward_values_
void SetNext(int64 from, int64 to, int64 path)
Sets 'to' to be the node after 'from' on the given path.
virtual void SetPerformed(IntervalVar *const var, bool value)=0
virtual bool HasFragments() const
Demon * MakeConstraintDemon1(Solver *const s, T *const ct, void(T::*method)(P), const std::string &name, P param1)
virtual void RankLast(SequenceVar *const var, int index)=0
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 InsertVarArrayConstantArrayExpression(IntExpr *const expression, const std::vector< IntVar * > &var, const std::vector< int64 > &values, VarArrayConstantArrayExpressionType type)=0
RevIntSet(int capacity, int *shared_positions, int shared_positions_size)
Capacity is the fixed size of the set (it cannot grow).
@ EXPR_CONSTANT_DIFFERENCE
const std::vector< IntegerType > & PositionsSetAtLeastOnce() const
virtual void PushContext(const std::string &context)=0
int GetSiblingAlternativeIndex(int node) const
Returns the index of the alternative set of the sibling of node.
IntVarLocalSearchOperator()
void ExitSearch() override
void RemoveInterval(int64 l, int64 u) override
std::string DebugString() const override
bool operator!=(Iterator other) const
BaseIntExpr(Solver *const s)
std::function< int64(const Model &)> Value(IntegerVariable v)
virtual void BeginFiltering(const LocalSearchFilter *filter)=0
SequenceVarLocalSearchHandler()
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 ...
void AddToAssignment(IntVar *var, int64 value, bool active, std::vector< int > *assignment_indices, int64 index, Assignment *assignment) const
virtual void Commit(const Assignment *delta, const Assignment *deltadelta)
Dual of Relax(), lets the filter know that the delta was accepted.
void SetIntegerArgument(const std::string &arg_name, int64 value)
Setters.
void Remove(Solver *const solver, const T &value_index)
ArgumentHolder * Top() const
const int & operator[](int index) const
virtual void InsertExprExprConstraint(Constraint *const ct, IntExpr *const expr1, IntExpr *const expr2, ExprExprConstraintType type)=0
@ EXPR_EXPR_CONSTRAINT_MAX
~IntVarLocalSearchFilter() override
uint64 Hash1(uint64 value)
Hash functions.
virtual void EndProcessingIntegerVariable(IntVar *const var)=0
void AddIntegerVariableLessOrEqualValueClause(IntVar *const var, int64 value)
void Push(Solver *const s, T val)
const T * const_iterator
Iterators on the indices.
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...
LocalSearchMonitor(Solver *const solver)
void Run(Solver *const s) override
std::string DebugString() const override
bool Activated(int64 index) const
A reversible switch that can switch once from false to true.
bool HoldsDelta() const override
ChainRange(const ChainBounds *const begin_chain, const ChainBounds *const end_chain, const CommittedNode *const first_node)
bool AreAllStrictlyNegative(const std::vector< T > &values)
bool HasIntegerExpressionArgument(const std::string &arg_name) const
Checks if arguments exist.
bool MakeChainInactive(int64 before_chain, int64 chain_end)
Makes the nodes on the chain starting after before_chain and ending at chain_end inactive.
IntVar * Var(int index) const
const_iterator begin() const
SimpleRevFIFO< Demon * > bound_demons_
VarConstantConstraintType
int64 Cardinality() const
Returns the number of bits set to one.
bool SetMax(int64 new_max)
void RevInsert(Solver *const solver, int64 index, T value)
virtual void InsertExprConstantExpression(IntExpr *const expression, IntExpr *const var, int64 value, ExprConstantExpressionType type)=0
This class represents a small reversible bitset (size <= 64).
V * Var(int64 index) const
Returns the variable of given index.
void WhenRange(Demon *d) override
virtual void SetMax(IntExpr *const expr, int64 new_max)=0
void SetToZero(Solver *const solver, int64 row, int64 column)
Erases the 'column' bit in the 'row' row.
bool AreAllStrictlyPositive(const std::vector< T > &values)
A symmetry breaker is an object that will visit a decision and create the 'symmetrical' decision in r...
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 SetEndMin(IntervalVar *const var, int64 new_min)=0
bool MakeOneNeighbor() override
This method should not be overridden. Override ModifyValue() instead.
void Activate(int64 index)
virtual void StartProcessingIntegerVariable(IntVar *const var)=0
const std::vector< std::pair< int, int > > & ChangedArcs() const
virtual void BeginOperatorStart()=0
Local search operator events.
int64 OldPath(int64 node) const
const IntTupleSet & FindIntegerMatrixArgumentOrDie(const std::string &arg_name) const
void SetSequenceArgument(const std::string &arg_name, SequenceVar *const var)
void EnterSearch() override
int64 Prev(int64 node) const
Returns the node before node in the current delta.
void AcceptUncheckedNeighbor() override
bool AreAllBound(const std::vector< IntVar * > &vars)
int NumLastRanked() const
CallMethod2(T *const ct, void(T::*method)(P, Q), const std::string &name, P param1, Q param2)
int VarType() const override
@ VAR_ARRAY_CONSTANT_ARRAY_EXPRESSION_MAX
bool IsArrayInRange(const std::vector< IntVar * > &vars, T range_min, T range_max)
void SetIntegerExpressionArgument(const std::string &arg_name, IntExpr *const expr)
virtual void RemoveInterval(IntVar *const var, int64 imin, int64 imax)=0
Argument Holder: useful when visiting a model.
void VisitSequenceArgument(const std::string &arg_name, SequenceVar *const argument) override
Visit sequence argument.
Local Search Filters are used for fast neighbor pruning.
Demon * MakeConstraintDemon3(Solver *const s, T *const ct, void(T::*method)(P, Q, R), const std::string &name, P param1, Q param2, R param3)
std::string DebugString() const override
@ VAR_ARRAY_CONSTANT_INDEX
virtual void SetNextBaseToIncrement(int64 base_index)
Set the next base to increment on next iteration.
static int input(yyscan_t yyscanner)
This is a special class to represent a 'residual' set of T.
void OnRevertChanges(int64 index, int64 value)
void SetToOne(Solver *const solver, int64 row, int64 column)
Sets the 'column' bit in the 'row' row.
virtual void SetEndRange(IntervalVar *const var, int64 new_min, int64 new_max)=0
virtual bool ConsiderAlternatives(int64 base_index) const
Indicates if alternatives should be considered when iterating over base nodes.
bool ValueFromAssignment(const Assignment &assignment, IntVar *var, int64 index, int64 *value)
This class represent a reversible FIFO structure.
void ClearAll(Solver *const solver)
Cleans all bits.
void ApplyDecision(Decision *const decision) override
LocalSearchFilterManager(std::vector< FilterEvent > filter_events)
bool HasFragments() const override
Matrix version of the RevBitSet class.
bool IsCardinalityZero() const
Is bitset null?
virtual IntExpr * FindVarConstantConstantExpression(IntVar *const var, int64 value1, int64 value2, VarConstantConstantExpressionType type) const =0
Var Constant Constant Expressions.
LocalSearchVariable AddVariable(int64 initial_min, int64 initial_max)
virtual void SetValues(IntVar *const var, const std::vector< int64 > &values)=0
CallMethod3(T *const ct, void(T::*method)(P, Q, R), const std::string &name, P param1, Q param2, R param3)
IntExpr * FindIntegerExpressionArgumentOrDie(const std::string &arg_name) const
This class represents a reversible bitset.
PathState(int num_nodes, std::vector< int > path_start, std::vector< int > path_end)
@ VAR_CONSTANT_NON_EQUALITY
virtual void InsertVarConstantConstantConstraint(Constraint *const ct, IntVar *const var, int64 value1, int64 value2, VarConstantConstantConstraintType type)=0
void Install() override
Install itself on the solver.
virtual void SetDurationMax(IntervalVar *const var, int64 new_max)=0
IntVar * IsGreaterOrEqual(int64 constant) override
void SetRange(int64 mi, int64 ma) override
int64 FindIntegerArgumentOrDie(const std::string &arg_name) const
bool IsPathStart(int64 node) const
Returns true if node is the first node on the path.
virtual void EndAcceptNeighbor(const LocalSearchOperator *op, bool neighbor_found)=0
const std::vector< int > & ChangedPaths() const
ModelCache(Solver *const solver)
void SetIntegerMatrixArgument(const std::string &arg_name, const IntTupleSet &values)
bool Empty() const
This method returns true if the active bitset is null.
void VisitIntegerExpressionArgument(const std::string &arg_name, IntExpr *const argument) override
Variables.
void Run(Solver *const s) override
@ VAR_CONSTANT_CONSTANT_SEMI_CONTINUOUS
void CopyBucket(const Bitset64< IndexType > &other, IndexType i)
static const int kUnboundBooleanVarValue
int64 GetActiveAlternativeNode(int node) const
Returns the active node in the alternative set of the given node.
RevImmutableMultiMap(Solver *const solver, int initial_size)
int64 Cardinality() const
Returns the number of bits set to one.
ArrayWithOffset(int64 index_min, int64 index_max)
void VisitIntervalArgument(const std::string &arg_name, IntervalVar *const argument) override
Visit interval argument.
virtual void PopContext()=0
const std::vector< int > & Sequence(int64 index) const
Returns the value in the current assignment of the variable of given index.
bool RevAnd(Solver *const solver, const std::vector< uint64 > &mask)
This method ANDs the mask with the active bitset.
virtual IntExpr * FindExprExpression(IntExpr *const expr, ExprExpressionType type) const =0
Expr Expressions.
void Resize(IndexType size)
virtual IntExpr * FindExprExprConstantExpression(IntExpr *const var1, IntExpr *const var2, int64 constant, ExprExprConstantExpressionType type) const =0
Expr Expr Constant Expressions.
static constexpr int kNoInserted
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.
IntVar * IsDifferent(int64 constant) override
void OnRevertChanges(int64 index, const std::vector< int > &value)
std::vector< Val > values_
FilterEventType event_type
void VisitIntegerVariable(const IntVar *const variable, IntExpr *const delegate) override
void SetMax(int64 m) override
std::string DebugString() const override
virtual void SetRange(IntVar *const var, int64 new_min, int64 new_max)=0
int64 PosIntDivDown(int64 e, int64 v)
Defines operators which change the value of variables; each neighbor corresponds to one modified vari...
void ClearAll(Solver *const solver)
Cleans all bits.
virtual void Revert()
Cancels the changes made by the last Relax()/Accept() calls.
void Install() override
Install itself on the solver.
Demon proxy to a method on the constraint with three arguments.
int64 Next(int64 node) const
Returns the node after node in the current delta.
@ EXPR_EXPR_LESS_OR_EQUAL
CallMethod0(T *const ct, void(T::*method)(), const std::string &name)
--— RevPartialSequence --—
bool operator!=(Iterator other) const
void Start(const Assignment *assignment) override
This method should not be overridden.
const std::vector< IntVar * > & FindIntegerVariableArrayArgumentOrDie(const std::string &arg_name) const
IntVarLocalSearchFilter(const std::vector< IntVar * > &vars)
virtual void InsertExprExpression(IntExpr *const expression, IntExpr *const expr, ExprExpressionType type)=0
virtual IntExpr * FindVarArrayConstantExpression(const std::vector< IntVar * > &vars, int64 value, VarArrayConstantExpressionType type) const =0
Var Array Constant Expressions.
void SetOldInverseValue(int64 index, int64 value)
void SetForwardSequence(int64 index, const std::vector< int > &value)
RevGrowingArray(int64 block_size)
IntVarIterator * MakeDomainIterator(bool reversible) const override
bool MakeOneNeighbor() override
This method should not be overridden. Override MakeNeighbor() instead.
const std::vector< int > & OldSequence(int64 index) const
int64 OldInverseValue(int64 index) const
virtual IntExpr * FindVarArrayConstantArrayExpression(const std::vector< IntVar * > &vars, const std::vector< int64 > &values, VarArrayConstantArrayExpressionType type) const =0
Var Array Constant Array Expressions.
bool IsCardinalityOne() const
Does it contains only one bit set?
const T * Last() const
Returns the last item of the FIFO.
void SetValue(int64 index, const Val &value)
Demon * MakeConstraintDemon0(Solver *const s, T *const ct, void(T::*method)(), const std::string &name)
virtual int64 GetAcceptedObjectiveValue() const
Objective value from the last time Accept() was called and returned true.
Low-priority demon proxy to a method on the constraint with one argument.
virtual void RemoveValue(IntVar *const var, int64 value)=0
void SynchronizeOnAssignment(const Assignment *assignment)
void Deactivate(int64 index)
int64 MaxVarArray(const std::vector< IntVar * > &vars)
std::vector< Val > old_values_
virtual int64 GetSynchronizedObjectiveValue() const
Objective value from last time Synchronize() was called.
void FillValues(const std::vector< IntVar * > &vars, std::vector< int64 > *const values)
bool ReverseChain(int64 before_chain, int64 after_chain, int64 *chain_last)
Reverses the chain starting after before_chain and ending before after_chain.
Iterator(const SimpleRevFIFO< T > *l)
bool IsCardinalityZero() const
Is bitset null?
bool StateIsValid() const
Demon * MakeDelayedConstraintDemon2(Solver *const s, T *const ct, void(T::*method)(P, Q), const std::string &name, P param1, Q param2)
void SetContentFromBitsetOfSameSize(const Bitset64< OtherIndexType > &other)
void VisitIntegerMatrixArgument(const std::string &arg_name, const IntTupleSet &values) override
This is the base class for all expressions that are not variables.
virtual IntExpr * FindVarArrayExpression(const std::vector< IntVar * > &vars, VarArrayExpressionType type) const =0
Var Array Expressions.
std::string DebugString() const override
void EndVisitModel(const std::string &solver_name) override
virtual void OnNodeInitialization()
Called by OnStart() after initializing node information.
void SetValue(int64 index, T value)
std::string DebugString() const override
~DelayedCallMethod1() override
const Val & OldValue(int64 index) const
int64 BaseAlternativeNode(int i) const
Returns the alternative node for the ith base node.
virtual void RankNotFirst(SequenceVar *const var, int index)=0
virtual void BeginMakeNextNeighbor(const LocalSearchOperator *op)=0
virtual bool IsIncremental() const
std::vector< Val > prev_values_
Demon proxy to a method on the constraint with no arguments.
RevPartialSequence(int size)
BooleanVar(Solver *const s, const std::string &name="")
void Insert(const K &key, const V &value)
Inserts (key, value) in the multi-map.
virtual Constraint * FindVarConstantConstantConstraint(IntVar *const var, int64 value1, int64 value2, VarConstantConstantConstraintType type) const =0
Var Constant Constant Constraints.
IntVar * IsEqual(int64 constant) override
bool IsArrayBoolean(const std::vector< T > &values)
void Run(Solver *const s) override
bool FindIndex(IntVar *const var, int64 *index) const
int number_of_nexts() const
Number of next variables.
void SetTypeName(const std::string &type_name)
std::string DebugString() const override
@ VAR_ARRAY_CONSTANT_EXPRESSION_MAX
void AddIntegerVariableGreaterOrEqualValueClause(IntVar *const var, int64 value)
Demon * MakeDelayedConstraintDemon1(Solver *const s, T *const ct, void(T::*method)(P), const std::string &name, P param1)
const std::vector< int64 > & FindIntegerArrayArgumentOrDie(const std::string &arg_name) const
int64 OldPrev(int64 node) const
bool operator!=(Iterator other) const
virtual void SetEndMax(IntervalVar *const var, int64 new_max)=0
void VisitSequenceArrayArgument(const std::string &arg_name, const std::vector< SequenceVar * > &arguments) override
static const int64 kint64max
virtual void SetMax(IntVar *const var, int64 new_max)=0
NodeRange(const ChainBounds *begin_chain, const ChainBounds *end_chain, const CommittedNode *first_node)
bool IsRanked(int elt) const
IntVarLocalSearchHandler(IntVarLocalSearchOperator *op)
@ VAR_CONSTANT_CONSTANT_EXPRESSION_MAX
bool AreAllNegative(const std::vector< T > &values)
std::string ParameterDebugString(P param)
int64 GetAcceptedObjectiveValue() const
virtual void RankNotLast(SequenceVar *const var, int index)=0
VarArrayConstantArrayExpressionType
virtual void InsertVarConstantArrayExpression(IntExpr *const expression, IntVar *const var, const std::vector< int64 > &values, VarConstantArrayExpressionType type)=0
IntVarIterator * MakeHoleIterator(bool reversible) const override