22#include "absl/container/flat_hash_map.h"
23#include "absl/strings/str_format.h"
24#include "absl/strings/str_join.h"
29#include "ortools/constraint_solver/assignment.pb.h"
44 min_ = std::numeric_limits<int64_t>::min();
45 max_ = std::numeric_limits<int64_t>::max();
55 SetRange(element.min_, element.max_);
65 const IntVarAssignment& int_var_assignment_proto) {
66 min_ = int_var_assignment_proto.min();
67 max_ = int_var_assignment_proto.max();
68 if (int_var_assignment_proto.active()) {
76 if (var_ != element.var_) {
87 return min_ == element.min_ && max_ == element.max_;
91 IntVarAssignment* int_var_assignment_proto)
const {
92 int_var_assignment_proto->set_var_id(var_->name());
93 int_var_assignment_proto->set_min(min_);
94 int_var_assignment_proto->set_max(max_);
95 int_var_assignment_proto->set_active(
Activated());
101 return absl::StrFormat(
"(%d)", min_);
103 return absl::StrFormat(
"(%d..%d)", min_, max_);
118 start_min_ = std::numeric_limits<int64_t>::min();
119 start_max_ = std::numeric_limits<int64_t>::max();
120 duration_min_ = std::numeric_limits<int64_t>::min();
121 duration_max_ = std::numeric_limits<int64_t>::max();
122 end_min_ = std::numeric_limits<int64_t>::min();
123 end_max_ = std::numeric_limits<int64_t>::max();
130 element->
Copy(*
this);
148 performed_min_ =
static_cast<int64_t
>(var_->MustBePerformed());
149 performed_max_ =
static_cast<int64_t
>(var_->MayBePerformed());
150 if (performed_max_ != 0LL) {
151 start_min_ = var_->StartMin();
152 start_max_ = var_->StartMax();
153 duration_min_ = var_->DurationMin();
154 duration_max_ = var_->DurationMax();
155 end_min_ = var_->EndMin();
156 end_max_ = var_->EndMax();
161 if (performed_max_ == performed_min_) {
162 var_->SetPerformed(performed_min_);
164 if (performed_max_ != 0LL) {
165 var_->SetStartRange(start_min_, start_max_);
166 var_->SetDurationRange(duration_min_, duration_max_);
167 var_->SetEndRange(end_min_, end_max_);
172 const IntervalVarAssignment& interval_var_assignment_proto) {
173 start_min_ = interval_var_assignment_proto.start_min();
174 start_max_ = interval_var_assignment_proto.start_max();
175 duration_min_ = interval_var_assignment_proto.duration_min();
176 duration_max_ = interval_var_assignment_proto.duration_max();
177 end_min_ = interval_var_assignment_proto.end_min();
178 end_max_ = interval_var_assignment_proto.end_max();
179 performed_min_ = interval_var_assignment_proto.performed_min();
180 performed_max_ = interval_var_assignment_proto.performed_max();
181 if (interval_var_assignment_proto.active()) {
189 IntervalVarAssignment* interval_var_assignment_proto)
const {
190 interval_var_assignment_proto->set_var_id(var_->name());
191 interval_var_assignment_proto->set_start_min(start_min_);
192 interval_var_assignment_proto->set_start_max(start_max_);
193 interval_var_assignment_proto->set_duration_min(duration_min_);
194 interval_var_assignment_proto->set_duration_max(duration_max_);
195 interval_var_assignment_proto->set_end_min(end_min_);
196 interval_var_assignment_proto->set_end_max(end_max_);
197 interval_var_assignment_proto->set_performed_min(performed_min_);
198 interval_var_assignment_proto->set_performed_max(performed_max_);
199 interval_var_assignment_proto->set_active(
Activated());
205 absl::StrAppendFormat(&out,
"(start = %d", start_min_);
206 if (start_max_ != start_min_) {
207 absl::StrAppendFormat(&out,
"..%d", start_max_);
209 absl::StrAppendFormat(&out,
", duration = %d", duration_min_);
210 if (duration_max_ != duration_min_) {
211 absl::StrAppendFormat(&out,
"..%d", duration_max_);
213 absl::StrAppendFormat(&out,
", status = %d", performed_min_);
214 if (performed_max_ != performed_min_) {
215 absl::StrAppendFormat(&out,
"..%d", performed_max_);
225 if (var_ != element.var_) {
236 return start_min_ == element.start_min_ && start_max_ == element.start_max_ &&
237 duration_min_ == element.duration_min_ &&
238 duration_max_ == element.duration_max_ &&
239 end_min_ == element.end_min_ && end_max_ == element.end_max_ &&
240 performed_min_ == element.performed_min_ &&
241 performed_max_ == element.performed_max_ && var_ == element.var_;
252 forward_sequence_.clear();
253 backward_sequence_.clear();
254 unperformed_.clear();
259 element->
Copy(*
this);
264 forward_sequence_ = element.forward_sequence_;
265 backward_sequence_ = element.backward_sequence_;
266 unperformed_ = element.unperformed_;
276 var_->
FillSequence(&forward_sequence_, &backward_sequence_, &unperformed_);
280 var_->RankSequence(forward_sequence_, backward_sequence_, unperformed_);
284 const SequenceVarAssignment& sequence_var_assignment_proto) {
285 for (
const int32_t forward_sequence :
286 sequence_var_assignment_proto.forward_sequence()) {
287 forward_sequence_.push_back(forward_sequence);
289 for (
const int32_t backward_sequence :
290 sequence_var_assignment_proto.backward_sequence()) {
291 backward_sequence_.push_back(backward_sequence);
293 for (
const int32_t unperformed :
294 sequence_var_assignment_proto.unperformed()) {
295 unperformed_.push_back(unperformed);
297 if (sequence_var_assignment_proto.active()) {
302 DCHECK(CheckClassInvariants());
306 SequenceVarAssignment* sequence_var_assignment_proto)
const {
307 sequence_var_assignment_proto->set_var_id(var_->name());
308 sequence_var_assignment_proto->set_active(
Activated());
309 for (
const int forward_sequence : forward_sequence_) {
310 sequence_var_assignment_proto->add_forward_sequence(forward_sequence);
312 for (
const int backward_sequence : backward_sequence_) {
313 sequence_var_assignment_proto->add_backward_sequence(backward_sequence);
315 for (
const int unperformed : unperformed_) {
316 sequence_var_assignment_proto->add_unperformed(unperformed);
322 return absl::StrFormat(
"[forward %s, backward %s, unperformed [%s]]",
323 absl::StrJoin(forward_sequence_,
" -> "),
324 absl::StrJoin(backward_sequence_,
" -> "),
325 absl::StrJoin(unperformed_,
", "));
332 if (var_ != element.var_) {
343 return forward_sequence_ == element.forward_sequence_ &&
344 backward_sequence_ == element.backward_sequence_ &&
345 unperformed_ == element.unperformed_;
349 return forward_sequence_;
353 return backward_sequence_;
361 const std::vector<int>& backward_sequence,
362 const std::vector<int>& unperformed) {
363 forward_sequence_ = forward_sequence;
364 backward_sequence_ = backward_sequence;
365 unperformed_ = unperformed;
366 DCHECK(CheckClassInvariants());
370 const std::vector<int>& forward_sequence) {
371 forward_sequence_ = forward_sequence;
375 const std::vector<int>& backward_sequence) {
376 backward_sequence_ = backward_sequence;
380 unperformed_ = unperformed;
383bool SequenceVarElement::CheckClassInvariants() {
384 absl::flat_hash_set<int> visited;
385 for (
const int forward_sequence : forward_sequence_) {
386 if (visited.contains(forward_sequence)) {
389 visited.insert(forward_sequence);
391 for (
const int backward_sequence : backward_sequence_) {
392 if (visited.contains(backward_sequence)) {
395 visited.insert(backward_sequence);
397 for (
const int unperformed : unperformed_) {
398 if (visited.contains(unperformed)) {
401 visited.insert(unperformed);
410 int_var_container_(copy->int_var_container_),
411 interval_var_container_(copy->interval_var_container_),
412 sequence_var_container_(copy->sequence_var_container_),
413 objective_elements_(copy->objective_elements_) {}
419 objective_elements_.clear();
420 int_var_container_.Clear();
421 interval_var_container_.Clear();
422 sequence_var_container_.Clear();
426 int_var_container_.Store();
427 interval_var_container_.Store();
428 sequence_var_container_.Store();
429 for (
IntVarElement& objective_element : objective_elements_) {
430 objective_element.Store();
436 int_var_container_.Restore();
437 interval_var_container_.Restore();
438 sequence_var_container_.Restore();
444template <
class V,
class E>
446 absl::flat_hash_map<std::string, E*>* id_to_element_map) {
447 CHECK(id_to_element_map !=
nullptr);
448 id_to_element_map->clear();
449 for (
int i = 0; i < container->
Size(); ++i) {
451 const V*
const var = element->Var();
452 const std::string& name = var->name();
454 LOG(INFO) <<
"Cannot save/load variables with empty name"
455 <<
"; variable will be ignored";
456 }
else if (id_to_element_map->contains(name)) {
457 LOG(INFO) <<
"Cannot save/load variables with duplicate names: " << name
458 <<
"; variable will be ignored";
460 (*id_to_element_map)[name] = element;
465template <
class E,
class P>
466void LoadElement(
const absl::flat_hash_map<std::string, E*>& id_to_element_map,
468 const std::string& var_id = proto.var_id();
469 CHECK(!var_id.empty());
470 E* element =
nullptr;
472 element->LoadFromProto(proto);
474 LOG(INFO) <<
"Variable " << var_id
475 <<
" not in assignment; skipping variable";
484 LOG(INFO) <<
"Cannot open " << filename;
491 CHECK(
file !=
nullptr);
492 AssignmentProto assignment_proto;
495 LOG(INFO) <<
"No assignment found in " <<
file->filename();
498 Load(assignment_proto);
499 return reader.
Close();
502template <
class Var,
class Element,
class Proto,
class Container>
503void RealLoad(
const AssignmentProto& assignment_proto,
504 Container*
const container,
505 int (AssignmentProto::*GetSize)()
const,
506 const Proto& (AssignmentProto::*GetElem)(
int)
const) {
507 bool fast_load = (container->Size() == (assignment_proto.*GetSize)());
508 for (
int i = 0; fast_load && i < (assignment_proto.*GetSize)(); ++i) {
509 Element*
const element = container->MutableElement(i);
510 const Proto& proto = (assignment_proto.*GetElem)(i);
511 if (element->Var()->name() == proto.var_id()) {
512 element->LoadFromProto(proto);
518 absl::flat_hash_map<std::string, Element*> id_to_element_map;
519 IdToElementMap<Var, Element>(container, &id_to_element_map);
520 for (
int i = 0; i < (assignment_proto.*GetSize)(); ++i) {
521 LoadElement<Element, Proto>(id_to_element_map,
522 (assignment_proto.*GetElem)(i));
529 assignment_proto, &int_var_container_,
530 &AssignmentProto::int_var_assignment_size,
531 &AssignmentProto::int_var_assignment);
534 &AssignmentProto::interval_var_assignment_size,
535 &AssignmentProto::interval_var_assignment);
538 &AssignmentProto::sequence_var_assignment_size,
539 &AssignmentProto::sequence_var_assignment);
540 for (
int i = 0; i < assignment_proto.objective_size(); ++i) {
541 const IntVarAssignment& objective = assignment_proto.objective(i);
542 const std::string& objective_id = objective.var_id();
543 DCHECK(!objective_id.empty());
546 const int64_t obj_min = objective.min();
547 const int64_t obj_max = objective.max();
549 if (objective.active()) {
561 LOG(INFO) <<
"Cannot open " << filename;
568 CHECK(
file !=
nullptr);
569 AssignmentProto assignment_proto;
570 Save(&assignment_proto);
575template <
class Var,
class Element,
class Proto,
class Container>
576void RealSave(AssignmentProto*
const assignment_proto,
577 const Container& container, Proto* (AssignmentProto::*Add)()) {
578 for (
const Element& element : container.elements()) {
579 const Var*
const var = element.Var();
580 const std::string& name = var->name();
582 Proto*
const var_assignment_proto = (assignment_proto->*Add)();
583 element.WriteToProto(var_assignment_proto);
589 assignment_proto->Clear();
591 assignment_proto, int_var_container_,
592 &AssignmentProto::add_int_var_assignment);
595 &AssignmentProto::add_interval_var_assignment);
598 &AssignmentProto::add_sequence_var_assignment);
599 for (
int i = 0; i < objective_elements_.size(); ++i) {
602 IntVarAssignment* objective = assignment_proto->add_objective();
603 objective->set_var_id(
name);
611template <
class Container,
class Element>
613 for (
const Element& element : container.elements()) {
614 if (element.Var() !=
nullptr) {
615 absl::StrAppendFormat(out,
"%s %s | ", element.Var()->name(),
616 element.DebugString());
622 std::string out =
"Assignment(";
625 interval_var_container_, &out);
627 sequence_var_container_, &out);
628 std::vector<std::string> objective_str;
629 for (
const IntVarElement& objective_element : objective_elements_) {
630 if (objective_element.Activated()) {
631 objective_str.push_back(objective_element.DebugString());
634 absl::StrAppendFormat(&out,
"%s)", absl::StrJoin(objective_str,
", "));
639 return int_var_container_.Add(var);
643 for (
IntVar*
const var : vars) {
649 return int_var_container_.FastAdd(var);
653 return int_var_container_.Element(var).
Min();
657 return int_var_container_.Element(var).Max();
661 return int_var_container_.Element(var).Value();
665 return int_var_container_.Element(var).Bound();
669 int_var_container_.MutableElement(var)->SetMin(m);
673 int_var_container_.MutableElement(var)->SetMax(m);
677 int_var_container_.MutableElement(var)->SetRange(l, u);
681 int_var_container_.MutableElement(var)->SetValue(value);
687 return interval_var_container_.Add(var);
697 return interval_var_container_.FastAdd(var);
701 return interval_var_container_.Element(var).StartMin();
705 return interval_var_container_.Element(var).StartMax();
709 return interval_var_container_.Element(var).StartValue();
713 return interval_var_container_.Element(var).DurationMin();
717 return interval_var_container_.Element(var).DurationMax();
721 return interval_var_container_.Element(var).DurationValue();
725 return interval_var_container_.Element(var).EndMin();
729 return interval_var_container_.Element(var).EndMax();
733 return interval_var_container_.Element(var).EndValue();
737 return interval_var_container_.Element(var).PerformedMin();
741 return interval_var_container_.Element(var).PerformedMax();
745 return interval_var_container_.Element(var).PerformedValue();
749 interval_var_container_.MutableElement(var)->SetStartMin(m);
753 interval_var_container_.MutableElement(var)->SetStartMax(m);
758 interval_var_container_.MutableElement(var)->SetStartRange(mi, ma);
762 interval_var_container_.MutableElement(var)->SetStartValue(value);
766 interval_var_container_.MutableElement(var)->SetDurationMin(m);
770 interval_var_container_.MutableElement(var)->SetDurationMax(m);
775 interval_var_container_.MutableElement(var)->SetDurationRange(mi, ma);
779 interval_var_container_.MutableElement(var)->SetDurationValue(value);
783 interval_var_container_.MutableElement(var)->SetEndMin(m);
787 interval_var_container_.MutableElement(var)->SetEndMax(m);
792 interval_var_container_.MutableElement(var)->SetEndRange(mi, ma);
796 interval_var_container_.MutableElement(var)->SetEndValue(value);
800 interval_var_container_.MutableElement(var)->SetPerformedMin(m);
804 interval_var_container_.MutableElement(var)->SetPerformedMax(m);
809 interval_var_container_.MutableElement(var)->SetPerformedRange(mi, ma);
814 interval_var_container_.MutableElement(var)->SetPerformedValue(value);
820 return sequence_var_container_.Add(var);
830 return sequence_var_container_.FastAdd(var);
835 return sequence_var_container_.Element(var).ForwardSequence();
840 return sequence_var_container_.Element(var).BackwardSequence();
845 return sequence_var_container_.Element(var).Unperformed();
849 const std::vector<int>& forward_sequence,
850 const std::vector<int>& backward_sequence,
851 const std::vector<int>& unperformed) {
852 sequence_var_container_.MutableElement(var)->SetSequence(
853 forward_sequence, backward_sequence, unperformed);
857 const std::vector<int>& forward_sequence) {
858 sequence_var_container_.MutableElement(var)->SetForwardSequence(
863 const SequenceVar*
const var,
const std::vector<int>& backward_sequence) {
864 sequence_var_container_.MutableElement(var)->SetBackwardSequence(
869 const std::vector<int>& unperformed) {
870 sequence_var_container_.MutableElement(var)->SetUnperformed(unperformed);
874 int_var_container_.MutableElement(var)->Activate();
878 int_var_container_.MutableElement(var)->Deactivate();
882 return int_var_container_.Element(var).Activated();
886 interval_var_container_.MutableElement(var)->Activate();
890 interval_var_container_.MutableElement(var)->Deactivate();
894 return interval_var_container_.Element(var).Activated();
898 sequence_var_container_.MutableElement(var)->Activate();
902 sequence_var_container_.MutableElement(var)->Deactivate();
906 return sequence_var_container_.Element(var).Activated();
910 return int_var_container_.Contains(var);
914 return interval_var_container_.Contains(var);
918 return sequence_var_container_.Contains(var);
922 int_var_container_.CopyIntersection(assignment->int_var_container_);
923 interval_var_container_.CopyIntersection(assignment->interval_var_container_);
924 sequence_var_container_.CopyIntersection(assignment->sequence_var_container_);
925 for (
int i = 0; i < objective_elements_.size(); i++) {
926 if (i >= assignment->objective_elements_.size() ||
930 objective_elements_[i].Var() !=
931 assignment->objective_elements_[i].Var()) {
934 objective_elements_[i] = assignment->objective_elements_[i];
940 int_var_container_.Copy(assignment->int_var_container_);
941 interval_var_container_.Copy(assignment->interval_var_container_);
942 sequence_var_container_.Copy(assignment->sequence_var_container_);
943 objective_elements_ = assignment->objective_elements_;
947 const std::vector<IntVar*>& target_vars,
949 const std::vector<IntVar*>& source_vars) {
950 const int vars_size = target_vars.size();
951 CHECK_EQ(source_vars.size(), vars_size);
952 CHECK(target_assignment !=
nullptr);
953 CHECK(source_assignment !=
nullptr);
955 target_assignment->
Clear();
956 const Solver*
const target_solver = target_assignment->
solver();
957 const Solver*
const source_solver = source_assignment->
solver();
958 for (
int index = 0; index < vars_size; index++) {
959 IntVar* target_var = target_vars[index];
960 CHECK_EQ(target_var->
solver(), target_solver);
961 IntVar* source_var = source_vars[index];
962 CHECK_EQ(source_var->
solver(), source_solver);
963 target_assignment->
Add(target_var)
978 explicit RestoreAssignment(
Assignment* assignment)
979 : assignment_(assignment) {}
981 ~RestoreAssignment()
override {}
983 Decision*
Next(Solver*
const )
override {
984 assignment_->Restore();
988 std::string DebugString()
const override {
return "RestoreAssignment"; }
991 Assignment*
const assignment_;
996 explicit StoreAssignment(Assignment* assignment) : assignment_(assignment) {}
998 ~StoreAssignment()
override {}
1000 Decision*
Next(Solver*
const )
override {
1001 assignment_->Store();
1005 std::string DebugString()
const override {
return "StoreAssignment"; }
1008 Assignment*
const assignment_;
1013 return RevAlloc(
new RestoreAssignment(assignment));
1017 return RevAlloc(
new StoreAssignment(assignment));
E * MutableElement(const V *const var)
void Activate(const IntVar *var)
Assignment(Solver *solver)
void SetPerformedRange(const IntervalVar *var, int64_t mi, int64_t ma)
AssignmentContainer< SequenceVar, SequenceVarElement > SequenceContainer
int64_t Value(const IntVar *var) const
void SetStartMax(const IntervalVar *var, int64_t m)
void SetMax(const IntVar *var, int64_t m)
void SetForwardSequence(const SequenceVar *var, const std::vector< int > &forward_sequence)
int64_t EndMin(const IntervalVar *var) const
bool Activated(const IntVar *var) const
int64_t DurationMax(const IntervalVar *var) const
int64_t PerformedMin(const IntervalVar *var) const
int64_t Max(const IntVar *var) const
void SetBackwardSequence(const SequenceVar *var, const std::vector< int > &backward_sequence)
int64_t Min(const IntVar *var) const
void SetEndValue(const IntervalVar *var, int64_t value)
bool Contains(const IntVar *var) const
void SetValue(const IntVar *var, int64_t value)
void SetEndMin(const IntervalVar *var, int64_t m)
bool Load(const std::string &filename)
int64_t EndValue(const IntervalVar *var) const
void SetMin(const IntVar *var, int64_t m)
void DeactivateObjectiveFromIndex(int index)
const std::vector< int > & Unperformed(const SequenceVar *var) const
void SetPerformedValue(const IntervalVar *var, int64_t value)
int64_t PerformedValue(const IntervalVar *var) const
int64_t StartValue(const IntervalVar *var) const
IntVarElement * Add(IntVar *var)
void SetPerformedMax(const IntervalVar *var, int64_t m)
void ActivateObjectiveFromIndex(int index)
int64_t ObjectiveMinFromIndex(int index) const
std::string DebugString() const override
int64_t EndMax(const IntervalVar *var) const
int64_t StartMin(const IntervalVar *var) const
IntVarElement * FastAdd(IntVar *var)
Adds without checking if variable has been previously added.
void Deactivate(const IntVar *var)
void Copy(const Assignment *assignment)
const std::vector< int > & ForwardSequence(const SequenceVar *var) const
void SetRange(const IntVar *var, int64_t l, int64_t u)
int64_t ObjectiveMaxFromIndex(int index) const
bool ActivatedObjectiveFromIndex(int index) const
int64_t DurationMin(const IntervalVar *var) const
bool Bound(const IntVar *var) const
int64_t DurationValue(const IntervalVar *var) const
AssignmentContainer< IntervalVar, IntervalVarElement > IntervalContainer
void SetSequence(const SequenceVar *var, const std::vector< int > &forward_sequence, const std::vector< int > &backward_sequence, const std::vector< int > &unperformed)
void SetStartMin(const IntervalVar *var, int64_t m)
void SetDurationMin(const IntervalVar *var, int64_t m)
void SetStartValue(const IntervalVar *var, int64_t value)
void SetDurationMax(const IntervalVar *var, int64_t m)
void SetEndMax(const IntervalVar *var, int64_t m)
void SetStartRange(const IntervalVar *var, int64_t mi, int64_t ma)
void SetDurationValue(const IntervalVar *var, int64_t value)
void CopyIntersection(const Assignment *assignment)
void SetEndRange(const IntervalVar *var, int64_t mi, int64_t ma)
void SetDurationRange(const IntervalVar *var, int64_t mi, int64_t ma)
bool HasObjectiveFromIndex(int index) const
int64_t StartMax(const IntervalVar *var) const
IntVar * ObjectiveFromIndex(int index) const
bool Save(const std::string &filename) const
Saves the assignment to a file.
const std::vector< int > & BackwardSequence(const SequenceVar *var) const
void SetPerformedMin(const IntervalVar *var, int64_t m)
void SetObjectiveRangeFromIndex(int index, int64_t l, int64_t u)
void SetUnperformed(const SequenceVar *var, const std::vector< int > &unperformed)
int64_t PerformedMax(const IntervalVar *var) const
bool operator==(const IntVarElement &element) const
void SetRange(int64_t l, int64_t u)
IntVarElement()
--------------— Solutions ---------------------—
std::string DebugString() const
void Copy(const IntVarElement &element)
void WriteToProto(IntVarAssignment *int_var_assignment_proto) const
void LoadFromProto(const IntVarAssignment &int_var_assignment_proto)
void SetDurationRange(int64_t mi, int64_t ma)
IntervalVarElement * Clone()
std::string DebugString() const
void WriteToProto(IntervalVarAssignment *interval_var_assignment_proto) const
void Reset(IntervalVar *var)
void Copy(const IntervalVarElement &element)
void SetEndRange(int64_t mi, int64_t ma)
IntervalVarElement()
--— IntervalVarElement --—
bool operator==(const IntervalVarElement &element) const
void SetStartRange(int64_t mi, int64_t ma)
void SetPerformedRange(int64_t mi, int64_t ma)
void LoadFromProto(const IntervalVarAssignment &interval_var_assignment_proto)
virtual std::string name() const
Object naming.
PropagationBaseObject(Solver *const s)
void Reset(SequenceVar *var)
void WriteToProto(SequenceVarAssignment *sequence_var_assignment_proto) const
bool operator==(const SequenceVarElement &element) const
std::string DebugString() const
SequenceVarElement * Clone()
SequenceVarElement()
--— SequenceVarElement --—
void SetUnperformed(const std::vector< int > &unperformed)
const std::vector< int > & ForwardSequence() const
void Copy(const SequenceVarElement &element)
void SetBackwardSequence(const std::vector< int > &backward_sequence)
const std::vector< int > & BackwardSequence() const
void SetSequence(const std::vector< int > &forward_sequence, const std::vector< int > &backward_sequence, const std::vector< int > &unperformed)
void SetForwardSequence(const std::vector< int > &forward_sequence)
void LoadFromProto(const SequenceVarAssignment &sequence_var_assignment_proto)
const std::vector< int > & Unperformed() const
void FillSequence(std::vector< int > *rank_first, std::vector< int > *rank_last, std::vector< int > *unperformed) const
For the time being, Solver is neither MT_SAFE nor MT_HOT.
DecisionBuilder * MakeRestoreAssignment(Assignment *assignment)
DecisionBuilder * MakeStoreAssignment(Assignment *assignment)
Assignment * MakeAssignment()
This method creates an empty assignment.
bool Close()
Closes the underlying file.
bool ReadProtocolMessage(P *const proto)
bool Close()
Closes the underlying file.
bool WriteProtocolMessage(const P &proto)
absl::Status Open(absl::string_view filename, absl::string_view mode, File **f, Options options)
As of 2016-01, these methods can only be used with flags = file::Defaults().
bool FindCopy(const Collection &collection, const Key &key, Value *const value)
void StoreAssignment(const VariablesAssignment &assignment, BooleanAssignment *output)
In SWIG mode, we don't want anything besides these top-level includes.
void RealLoad(const AssignmentProto &assignment_proto, Container *const container, int(AssignmentProto::*GetSize)() const, const Proto &(AssignmentProto::*GetElem)(int) const)
std::ostream & operator<<(std::ostream &out, const Assignment &assignment)
void RealDebugString(const Container &container, std::string *const out)
void SetAssignmentFromAssignment(Assignment *target_assignment, const std::vector< IntVar * > &target_vars, const Assignment *source_assignment, const std::vector< IntVar * > &source_vars)
NOLINT.
void RealSave(AssignmentProto *const assignment_proto, const Container &container, Proto *(AssignmentProto::*Add)())