22#include "absl/container/flat_hash_map.h"
23#include "absl/strings/str_format.h"
24#include "absl/strings/str_join.h"
25#include "absl/strings/string_view.h"
45 min_ = std::numeric_limits<int64_t>::min();
46 max_ = std::numeric_limits<int64_t>::max();
56 SetRange(element.min_, element.max_);
67 min_ = int_var_assignment_proto.
min();
68 max_ = int_var_assignment_proto.
max();
69 if (int_var_assignment_proto.
active()) {
77 if (var_ != element.var_) {
88 return min_ == element.min_ && max_ == element.max_;
93 int_var_assignment_proto->
set_var_id(var_->name());
94 int_var_assignment_proto->
set_min(min_);
95 int_var_assignment_proto->
set_max(max_);
102 return absl::StrFormat(
"(%d)", min_);
104 return absl::StrFormat(
"(%d..%d)", min_, max_);
119 start_min_ = std::numeric_limits<int64_t>::min();
120 start_max_ = std::numeric_limits<int64_t>::max();
121 duration_min_ = std::numeric_limits<int64_t>::min();
122 duration_max_ = std::numeric_limits<int64_t>::max();
123 end_min_ = std::numeric_limits<int64_t>::min();
124 end_max_ = std::numeric_limits<int64_t>::max();
131 element->
Copy(*
this);
149 performed_min_ =
static_cast<int64_t
>(var_->MustBePerformed());
150 performed_max_ =
static_cast<int64_t
>(var_->MayBePerformed());
151 if (performed_max_ != 0LL) {
152 start_min_ = var_->StartMin();
153 start_max_ = var_->StartMax();
154 duration_min_ = var_->DurationMin();
155 duration_max_ = var_->DurationMax();
156 end_min_ = var_->EndMin();
157 end_max_ = var_->EndMax();
162 if (performed_max_ == performed_min_) {
163 var_->SetPerformed(performed_min_);
165 if (performed_max_ != 0LL) {
166 var_->SetStartRange(start_min_, start_max_);
167 var_->SetDurationRange(duration_min_, duration_max_);
168 var_->SetEndRange(end_min_, end_max_);
174 start_min_ = interval_var_assignment_proto.
start_min();
175 start_max_ = interval_var_assignment_proto.
start_max();
176 duration_min_ = interval_var_assignment_proto.
duration_min();
177 duration_max_ = interval_var_assignment_proto.
duration_max();
178 end_min_ = interval_var_assignment_proto.
end_min();
179 end_max_ = interval_var_assignment_proto.
end_max();
180 performed_min_ = interval_var_assignment_proto.
performed_min();
181 performed_max_ = interval_var_assignment_proto.
performed_max();
182 if (interval_var_assignment_proto.
active()) {
191 interval_var_assignment_proto->
set_var_id(var_->name());
196 interval_var_assignment_proto->
set_end_min(end_min_);
197 interval_var_assignment_proto->
set_end_max(end_max_);
206 absl::StrAppendFormat(&out,
"(start = %d", start_min_);
207 if (start_max_ != start_min_) {
208 absl::StrAppendFormat(&out,
"..%d", start_max_);
210 absl::StrAppendFormat(&out,
", duration = %d", duration_min_);
211 if (duration_max_ != duration_min_) {
212 absl::StrAppendFormat(&out,
"..%d", duration_max_);
214 absl::StrAppendFormat(&out,
", status = %d", performed_min_);
215 if (performed_max_ != performed_min_) {
216 absl::StrAppendFormat(&out,
"..%d", performed_max_);
226 if (var_ != element.var_) {
237 return start_min_ == element.start_min_ && start_max_ == element.start_max_ &&
238 duration_min_ == element.duration_min_ &&
239 duration_max_ == element.duration_max_ &&
240 end_min_ == element.end_min_ && end_max_ == element.end_max_ &&
241 performed_min_ == element.performed_min_ &&
242 performed_max_ == element.performed_max_ && var_ == element.var_;
253 forward_sequence_.clear();
254 backward_sequence_.clear();
255 unperformed_.clear();
260 element->
Copy(*
this);
265 forward_sequence_ = element.forward_sequence_;
266 backward_sequence_ = element.backward_sequence_;
267 unperformed_ = element.unperformed_;
277 var_->
FillSequence(&forward_sequence_, &backward_sequence_, &unperformed_);
281 var_->RankSequence(forward_sequence_, backward_sequence_, unperformed_);
286 for (
const int32_t forward_sequence :
288 forward_sequence_.push_back(forward_sequence);
290 for (
const int32_t backward_sequence :
292 backward_sequence_.push_back(backward_sequence);
294 for (
const int32_t unperformed :
296 unperformed_.push_back(unperformed);
298 if (sequence_var_assignment_proto.
active()) {
303 DCHECK(CheckClassInvariants());
308 sequence_var_assignment_proto->
set_var_id(var_->name());
310 for (
const int forward_sequence : forward_sequence_) {
313 for (
const int backward_sequence : backward_sequence_) {
316 for (
const int unperformed : unperformed_) {
323 return absl::StrFormat(
"[forward %s, backward %s, unperformed [%s]]",
324 absl::StrJoin(forward_sequence_,
" -> "),
325 absl::StrJoin(backward_sequence_,
" -> "),
326 absl::StrJoin(unperformed_,
", "));
333 if (var_ != element.var_) {
344 return forward_sequence_ == element.forward_sequence_ &&
345 backward_sequence_ == element.backward_sequence_ &&
346 unperformed_ == element.unperformed_;
350 return forward_sequence_;
354 return backward_sequence_;
362 const std::vector<int>& backward_sequence,
363 const std::vector<int>& unperformed) {
364 forward_sequence_ = forward_sequence;
365 backward_sequence_ = backward_sequence;
366 unperformed_ = unperformed;
367 DCHECK(CheckClassInvariants());
371 const std::vector<int>& forward_sequence) {
372 forward_sequence_ = forward_sequence;
376 const std::vector<int>& backward_sequence) {
377 backward_sequence_ = backward_sequence;
381 unperformed_ = unperformed;
384bool SequenceVarElement::CheckClassInvariants() {
385 absl::flat_hash_set<int> visited;
386 for (
const int forward_sequence : forward_sequence_) {
387 if (visited.contains(forward_sequence)) {
390 visited.insert(forward_sequence);
392 for (
const int backward_sequence : backward_sequence_) {
393 if (visited.contains(backward_sequence)) {
396 visited.insert(backward_sequence);
398 for (
const int unperformed : unperformed_) {
399 if (visited.contains(unperformed)) {
402 visited.insert(unperformed);
411 int_var_container_(copy->int_var_container_),
412 interval_var_container_(copy->interval_var_container_),
413 sequence_var_container_(copy->sequence_var_container_),
414 objective_elements_(copy->objective_elements_) {}
420 objective_elements_.clear();
421 int_var_container_.Clear();
422 interval_var_container_.Clear();
423 sequence_var_container_.Clear();
427 int_var_container_.Store();
428 interval_var_container_.Store();
429 sequence_var_container_.Store();
430 for (
IntVarElement& objective_element : objective_elements_) {
431 objective_element.Store();
437 int_var_container_.Restore();
438 interval_var_container_.Restore();
439 sequence_var_container_.Restore();
445template <
class V,
class E>
447 absl::flat_hash_map<std::string, E*>* id_to_element_map) {
448 CHECK(id_to_element_map !=
nullptr);
449 id_to_element_map->clear();
450 for (
int i = 0; i < container->
Size(); ++i) {
452 const V*
const var = element->Var();
453 const std::string& name = var->name();
455 LOG(INFO) <<
"Cannot save/load variables with empty name"
456 <<
"; variable will be ignored";
457 }
else if (id_to_element_map->contains(name)) {
458 LOG(INFO) <<
"Cannot save/load variables with duplicate names: " << name
459 <<
"; variable will be ignored";
461 (*id_to_element_map)[name] = element;
466template <
class E,
class P>
467void LoadElement(
const absl::flat_hash_map<std::string, E*>& id_to_element_map,
469 absl::string_view var_id = proto.var_id();
470 CHECK(!var_id.empty());
471 E* element =
nullptr;
473 element->LoadFromProto(proto);
475 LOG(INFO) <<
"Variable " << var_id
476 <<
" not in assignment; skipping variable";
485 LOG(INFO) <<
"Cannot open " << filename;
492 CHECK(
file !=
nullptr);
496 LOG(INFO) <<
"No assignment found in " <<
file->filename();
499 Load(assignment_proto);
500 return reader.
Close();
503template <
class Var,
class Element,
class Proto,
class Container>
505 Container*
const container,
508 bool fast_load = (container->Size() == (assignment_proto.*GetSize)());
509 for (
int i = 0; fast_load && i < (assignment_proto.*GetSize)(); ++i) {
510 Element*
const element = container->MutableElement(i);
511 const Proto& proto = (assignment_proto.*GetElem)(i);
512 if (element->Var()->name() == proto.var_id()) {
513 element->LoadFromProto(proto);
519 absl::flat_hash_map<std::string, Element*> id_to_element_map;
520 IdToElementMap<Var, Element>(container, &id_to_element_map);
521 for (
int i = 0; i < (assignment_proto.*GetSize)(); ++i) {
522 LoadElement<Element, Proto>(id_to_element_map,
523 (assignment_proto.*GetElem)(i));
530 assignment_proto, &int_var_container_,
543 absl::string_view objective_id = objective.
var_id();
544 DCHECK(!objective_id.empty());
547 const int64_t obj_min = objective.
min();
548 const int64_t obj_max = objective.
max();
562 LOG(INFO) <<
"Cannot open " << filename;
569 CHECK(
file !=
nullptr);
571 Save(&assignment_proto);
576template <
class Var,
class Element,
class Proto,
class Container>
579 for (
const Element& element : container.elements()) {
580 const Var*
const var = element.Var();
581 const std::string& name = var->name();
583 Proto*
const var_assignment_proto = (assignment_proto->*Add)();
584 element.WriteToProto(var_assignment_proto);
590 assignment_proto->
Clear();
592 assignment_proto, int_var_container_,
600 for (
int i = 0; i < objective_elements_.size(); ++i) {
612template <
class Container,
class Element>
614 for (
const Element& element : container.elements()) {
615 if (element.Var() !=
nullptr) {
616 absl::StrAppendFormat(out,
"%s %s | ", element.Var()->name(),
617 element.DebugString());
623 std::string out =
"Assignment(";
626 interval_var_container_, &out);
628 sequence_var_container_, &out);
629 std::vector<std::string> objective_str;
630 for (
const IntVarElement& objective_element : objective_elements_) {
631 if (objective_element.Activated()) {
632 objective_str.push_back(objective_element.DebugString());
635 absl::StrAppendFormat(&out,
"%s)", absl::StrJoin(objective_str,
", "));
640 return int_var_container_.Add(var);
644 for (
IntVar*
const var : vars) {
650 return int_var_container_.FastAdd(var);
654 return int_var_container_.Element(var).
Min();
658 return int_var_container_.Element(var).Max();
662 return int_var_container_.Element(var).Value();
666 return int_var_container_.Element(var).Bound();
670 int_var_container_.MutableElement(var)->SetMin(m);
674 int_var_container_.MutableElement(var)->SetMax(m);
678 int_var_container_.MutableElement(var)->SetRange(l, u);
682 int_var_container_.MutableElement(var)->SetValue(value);
688 return interval_var_container_.Add(var);
698 return interval_var_container_.FastAdd(var);
702 return interval_var_container_.Element(var).StartMin();
706 return interval_var_container_.Element(var).StartMax();
710 return interval_var_container_.Element(var).StartValue();
714 return interval_var_container_.Element(var).DurationMin();
718 return interval_var_container_.Element(var).DurationMax();
722 return interval_var_container_.Element(var).DurationValue();
726 return interval_var_container_.Element(var).EndMin();
730 return interval_var_container_.Element(var).EndMax();
734 return interval_var_container_.Element(var).EndValue();
738 return interval_var_container_.Element(var).PerformedMin();
742 return interval_var_container_.Element(var).PerformedMax();
746 return interval_var_container_.Element(var).PerformedValue();
750 interval_var_container_.MutableElement(var)->SetStartMin(m);
754 interval_var_container_.MutableElement(var)->SetStartMax(m);
759 interval_var_container_.MutableElement(var)->SetStartRange(mi, ma);
763 interval_var_container_.MutableElement(var)->SetStartValue(value);
767 interval_var_container_.MutableElement(var)->SetDurationMin(m);
771 interval_var_container_.MutableElement(var)->SetDurationMax(m);
776 interval_var_container_.MutableElement(var)->SetDurationRange(mi, ma);
780 interval_var_container_.MutableElement(var)->SetDurationValue(value);
784 interval_var_container_.MutableElement(var)->SetEndMin(m);
788 interval_var_container_.MutableElement(var)->SetEndMax(m);
793 interval_var_container_.MutableElement(var)->SetEndRange(mi, ma);
797 interval_var_container_.MutableElement(var)->SetEndValue(value);
801 interval_var_container_.MutableElement(var)->SetPerformedMin(m);
805 interval_var_container_.MutableElement(var)->SetPerformedMax(m);
810 interval_var_container_.MutableElement(var)->SetPerformedRange(mi, ma);
815 interval_var_container_.MutableElement(var)->SetPerformedValue(value);
821 return sequence_var_container_.Add(var);
831 return sequence_var_container_.FastAdd(var);
836 return sequence_var_container_.Element(var).ForwardSequence();
841 return sequence_var_container_.Element(var).BackwardSequence();
846 return sequence_var_container_.Element(var).Unperformed();
850 const std::vector<int>& forward_sequence,
851 const std::vector<int>& backward_sequence,
852 const std::vector<int>& unperformed) {
853 sequence_var_container_.MutableElement(var)->SetSequence(
854 forward_sequence, backward_sequence, unperformed);
858 const std::vector<int>& forward_sequence) {
859 sequence_var_container_.MutableElement(var)->SetForwardSequence(
864 const SequenceVar*
const var,
const std::vector<int>& backward_sequence) {
865 sequence_var_container_.MutableElement(var)->SetBackwardSequence(
870 const std::vector<int>& unperformed) {
871 sequence_var_container_.MutableElement(var)->SetUnperformed(unperformed);
875 int_var_container_.MutableElement(var)->Activate();
879 int_var_container_.MutableElement(var)->Deactivate();
883 return int_var_container_.Element(var).Activated();
887 interval_var_container_.MutableElement(var)->Activate();
891 interval_var_container_.MutableElement(var)->Deactivate();
895 return interval_var_container_.Element(var).Activated();
899 sequence_var_container_.MutableElement(var)->Activate();
903 sequence_var_container_.MutableElement(var)->Deactivate();
907 return sequence_var_container_.Element(var).Activated();
911 return int_var_container_.Contains(var);
915 return interval_var_container_.Contains(var);
919 return sequence_var_container_.Contains(var);
923 int_var_container_.CopyIntersection(assignment->int_var_container_);
924 interval_var_container_.CopyIntersection(assignment->interval_var_container_);
925 sequence_var_container_.CopyIntersection(assignment->sequence_var_container_);
926 for (
int i = 0; i < objective_elements_.size(); i++) {
927 if (i >= assignment->objective_elements_.size() ||
931 objective_elements_[i].Var() !=
932 assignment->objective_elements_[i].Var()) {
935 objective_elements_[i] = assignment->objective_elements_[i];
941 int_var_container_.Copy(assignment->int_var_container_);
942 interval_var_container_.Copy(assignment->interval_var_container_);
943 sequence_var_container_.Copy(assignment->sequence_var_container_);
944 objective_elements_ = assignment->objective_elements_;
948 const std::vector<IntVar*>& target_vars,
950 const std::vector<IntVar*>& source_vars) {
951 const int vars_size = target_vars.size();
952 CHECK_EQ(source_vars.size(), vars_size);
953 CHECK(target_assignment !=
nullptr);
954 CHECK(source_assignment !=
nullptr);
956 target_assignment->
Clear();
957 const Solver*
const target_solver = target_assignment->
solver();
958 const Solver*
const source_solver = source_assignment->
solver();
959 for (
int index = 0; index < vars_size; index++) {
960 IntVar* target_var = target_vars[index];
961 CHECK_EQ(target_var->
solver(), target_solver);
962 IntVar* source_var = source_vars[index];
963 CHECK_EQ(source_var->
solver(), source_solver);
964 target_assignment->
Add(target_var)
979 explicit RestoreAssignment(
Assignment* assignment)
980 : assignment_(assignment) {}
982 ~RestoreAssignment()
override {}
984 Decision*
Next(Solver*
const )
override {
985 assignment_->Restore();
989 std::string DebugString()
const override {
return "RestoreAssignment"; }
992 Assignment*
const assignment_;
997 explicit StoreAssignment(Assignment* assignment) : assignment_(assignment) {}
999 ~StoreAssignment()
override {}
1001 Decision*
Next(Solver*
const )
override {
1002 assignment_->Store();
1006 std::string DebugString()
const override {
return "StoreAssignment"; }
1009 Assignment*
const assignment_;
1014 return RevAlloc(
new RestoreAssignment(assignment));
1018 return RevAlloc(
new StoreAssignment(assignment));
E * MutableElement(const V *const var)
int objective_size() const
repeated .operations_research.IntVarAssignment objective = 3;
::operations_research::SequenceVarAssignment *PROTOBUF_NONNULL add_sequence_var_assignment()
const ::operations_research::SequenceVarAssignment & sequence_var_assignment(int index) const
ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL
int interval_var_assignment_size() const
repeated .operations_research.IntervalVarAssignment interval_var_assignment = 2;
const ::operations_research::IntVarAssignment & objective(int index) const
::operations_research::IntervalVarAssignment *PROTOBUF_NONNULL add_interval_var_assignment()
const ::operations_research::IntervalVarAssignment & interval_var_assignment(int index) const
int int_var_assignment_size() const
repeated .operations_research.IntVarAssignment int_var_assignment = 1;
::operations_research::IntVarAssignment *PROTOBUF_NONNULL add_int_var_assignment()
int sequence_var_assignment_size() const
repeated .operations_research.SequenceVarAssignment sequence_var_assignment = 6;
::operations_research::IntVarAssignment *PROTOBUF_NONNULL add_objective()
const ::operations_research::IntVarAssignment & int_var_assignment(int index) const
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
void set_max(::int64_t value)
const ::std::string & var_id() const
void set_active(bool value)
void set_var_id(Arg_ &&arg, Args_... args)
void set_min(::int64_t value)
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 set_end_max(::int64_t value)
::int64_t start_min() const
::int64_t duration_max() const
::int64_t performed_max() const
void set_duration_max(::int64_t value)
void set_end_min(::int64_t value)
::int64_t duration_min() const
void set_var_id(Arg_ &&arg, Args_... args)
::int64_t start_max() const
void set_active(bool value)
void set_start_min(::int64_t value)
void set_performed_max(::int64_t value)
void set_duration_min(::int64_t value)
void set_performed_min(::int64_t value)
void set_start_max(::int64_t value)
::int64_t performed_min() const
::int64_t end_min() const
::int64_t end_max() const
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 set_active(bool value)
::int32_t forward_sequence(int index) const
void add_forward_sequence(::int32_t value)
::int32_t backward_sequence(int index) const
void set_var_id(Arg_ &&arg, Args_... args)
void add_backward_sequence(::int32_t value)
void add_unperformed(::int32_t value)
::int32_t unperformed(int index) const
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 file_name, 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)())