19 #include "absl/container/flat_hash_map.h"
20 #include "absl/strings/str_format.h"
21 #include "absl/strings/str_join.h"
37 IntVarElement::IntVarElement() { Reset(
nullptr); }
39 IntVarElement::IntVarElement(IntVar*
const var) { Reset(
var); }
41 void IntVarElement::Reset(IntVar*
const var) {
47 IntVarElement* IntVarElement::Clone() {
48 IntVarElement* element =
new IntVarElement;
53 void IntVarElement::Copy(
const IntVarElement& element) {
54 SetRange(element.min_, element.max_);
56 if (element.Activated()) {
63 void IntVarElement::LoadFromProto(
64 const IntVarAssignment& int_var_assignment_proto) {
65 min_ = int_var_assignment_proto.min();
66 max_ = int_var_assignment_proto.max();
67 if (int_var_assignment_proto.active()) {
75 if (var_ != element.var_) {
78 if (Activated() != element.Activated()) {
81 if (!Activated() && !element.Activated()) {
86 return min_ == element.min_ && max_ == element.max_;
89 void IntVarElement::WriteToProto(
90 IntVarAssignment* int_var_assignment_proto)
const {
91 int_var_assignment_proto->set_var_id(var_->name());
92 int_var_assignment_proto->set_min(min_);
93 int_var_assignment_proto->set_max(max_);
94 int_var_assignment_proto->set_active(Activated());
97 std::string IntVarElement::DebugString()
const {
100 return absl::StrFormat(
"(%d)", min_);
102 return absl::StrFormat(
"(%d..%d)", min_, max_);
111 IntervalVarElement::IntervalVarElement() { Reset(
nullptr); }
113 IntervalVarElement::IntervalVarElement(IntervalVar*
const var) { Reset(
var); }
115 void IntervalVarElement::Reset(IntervalVar*
const var) {
127 IntervalVarElement* IntervalVarElement::Clone() {
128 IntervalVarElement* element =
new IntervalVarElement;
129 element->Copy(*
this);
133 void IntervalVarElement::Copy(
const IntervalVarElement& element) {
134 SetStartRange(element.start_min_, element.start_max_);
135 SetDurationRange(element.duration_min_, element.duration_max_);
136 SetEndRange(element.end_min_, element.end_max_);
137 SetPerformedRange(element.performed_min_, element.performed_max_);
139 if (element.Activated()) {
146 void IntervalVarElement::Store() {
147 performed_min_ =
static_cast<int64>(var_->MustBePerformed());
148 performed_max_ =
static_cast<int64>(var_->MayBePerformed());
149 if (performed_max_ != 0LL) {
150 start_min_ = var_->StartMin();
151 start_max_ = var_->StartMax();
152 duration_min_ = var_->DurationMin();
153 duration_max_ = var_->DurationMax();
154 end_min_ = var_->EndMin();
155 end_max_ = var_->EndMax();
159 void IntervalVarElement::Restore() {
160 if (performed_max_ == performed_min_) {
161 var_->SetPerformed(performed_min_);
163 if (performed_max_ != 0LL) {
164 var_->SetStartRange(start_min_, start_max_);
165 var_->SetDurationRange(duration_min_, duration_max_);
166 var_->SetEndRange(end_min_, end_max_);
170 void IntervalVarElement::LoadFromProto(
171 const IntervalVarAssignment& interval_var_assignment_proto) {
172 start_min_ = interval_var_assignment_proto.start_min();
173 start_max_ = interval_var_assignment_proto.start_max();
174 duration_min_ = interval_var_assignment_proto.duration_min();
175 duration_max_ = interval_var_assignment_proto.duration_max();
176 end_min_ = interval_var_assignment_proto.end_min();
177 end_max_ = interval_var_assignment_proto.end_max();
178 performed_min_ = interval_var_assignment_proto.performed_min();
179 performed_max_ = interval_var_assignment_proto.performed_max();
180 if (interval_var_assignment_proto.active()) {
187 void IntervalVarElement::WriteToProto(
188 IntervalVarAssignment* interval_var_assignment_proto)
const {
189 interval_var_assignment_proto->set_var_id(var_->name());
190 interval_var_assignment_proto->set_start_min(start_min_);
191 interval_var_assignment_proto->set_start_max(start_max_);
192 interval_var_assignment_proto->set_duration_min(duration_min_);
193 interval_var_assignment_proto->set_duration_max(duration_max_);
194 interval_var_assignment_proto->set_end_min(end_min_);
195 interval_var_assignment_proto->set_end_max(end_max_);
196 interval_var_assignment_proto->set_performed_min(performed_min_);
197 interval_var_assignment_proto->set_performed_max(performed_max_);
198 interval_var_assignment_proto->set_active(Activated());
201 std::string IntervalVarElement::DebugString()
const {
204 absl::StrAppendFormat(&out,
"(start = %d", start_min_);
205 if (start_max_ != start_min_) {
206 absl::StrAppendFormat(&out,
"..%d", start_max_);
208 absl::StrAppendFormat(&out,
", duration = %d", duration_min_);
209 if (duration_max_ != duration_min_) {
210 absl::StrAppendFormat(&out,
"..%d", duration_max_);
212 absl::StrAppendFormat(&out,
", status = %d", performed_min_);
213 if (performed_max_ != performed_min_) {
214 absl::StrAppendFormat(&out,
"..%d", performed_max_);
224 if (var_ != element.var_) {
227 if (Activated() != element.Activated()) {
230 if (!Activated() && !element.Activated()) {
235 return start_min_ == element.start_min_ && start_max_ == element.start_max_ &&
236 duration_min_ == element.duration_min_ &&
237 duration_max_ == element.duration_max_ &&
238 end_min_ == element.end_min_ && end_max_ == element.end_max_ &&
239 performed_min_ == element.performed_min_ &&
240 performed_max_ == element.performed_max_ && var_ == element.var_;
245 SequenceVarElement::SequenceVarElement() { Reset(
nullptr); }
247 SequenceVarElement::SequenceVarElement(SequenceVar*
const var) { Reset(
var); }
249 void SequenceVarElement::Reset(SequenceVar*
const var) {
251 forward_sequence_.clear();
252 backward_sequence_.clear();
253 unperformed_.clear();
256 SequenceVarElement* SequenceVarElement::Clone() {
257 SequenceVarElement*
const element =
new SequenceVarElement;
258 element->Copy(*
this);
262 void SequenceVarElement::Copy(
const SequenceVarElement& element) {
263 forward_sequence_ = element.forward_sequence_;
264 backward_sequence_ = element.backward_sequence_;
265 unperformed_ = element.unperformed_;
267 if (element.Activated()) {
274 void SequenceVarElement::Store() {
275 var_->FillSequence(&forward_sequence_, &backward_sequence_, &unperformed_);
278 void SequenceVarElement::Restore() {
279 var_->RankSequence(forward_sequence_, backward_sequence_, unperformed_);
282 void SequenceVarElement::LoadFromProto(
283 const SequenceVarAssignment& sequence_var_assignment_proto) {
284 for (
const int32 forward_sequence :
285 sequence_var_assignment_proto.forward_sequence()) {
286 forward_sequence_.push_back(forward_sequence);
288 for (
const int32 backward_sequence :
289 sequence_var_assignment_proto.backward_sequence()) {
290 backward_sequence_.push_back(backward_sequence);
292 for (
const int32 unperformed : sequence_var_assignment_proto.unperformed()) {
293 unperformed_.push_back(unperformed);
295 if (sequence_var_assignment_proto.active()) {
300 DCHECK(CheckClassInvariants());
303 void SequenceVarElement::WriteToProto(
304 SequenceVarAssignment* sequence_var_assignment_proto)
const {
305 sequence_var_assignment_proto->set_var_id(var_->name());
306 sequence_var_assignment_proto->set_active(Activated());
307 for (
const int forward_sequence : forward_sequence_) {
308 sequence_var_assignment_proto->add_forward_sequence(forward_sequence);
310 for (
const int backward_sequence : backward_sequence_) {
311 sequence_var_assignment_proto->add_backward_sequence(backward_sequence);
313 for (
const int unperformed : unperformed_) {
314 sequence_var_assignment_proto->add_unperformed(unperformed);
318 std::string SequenceVarElement::DebugString()
const {
320 return absl::StrFormat(
"[forward %s, backward %s, unperformed [%s]]",
321 absl::StrJoin(forward_sequence_,
" -> "),
322 absl::StrJoin(backward_sequence_,
" -> "),
323 absl::StrJoin(unperformed_,
", "));
330 if (var_ != element.var_) {
333 if (Activated() != element.Activated()) {
336 if (!Activated() && !element.Activated()) {
341 return forward_sequence_ == element.forward_sequence_ &&
342 backward_sequence_ == element.backward_sequence_ &&
343 unperformed_ == element.unperformed_;
346 const std::vector<int>& SequenceVarElement::ForwardSequence()
const {
347 return forward_sequence_;
350 const std::vector<int>& SequenceVarElement::BackwardSequence()
const {
351 return backward_sequence_;
354 const std::vector<int>& SequenceVarElement::Unperformed()
const {
358 void SequenceVarElement::SetSequence(
const std::vector<int>& forward_sequence,
359 const std::vector<int>& backward_sequence,
360 const std::vector<int>& unperformed) {
361 forward_sequence_ = forward_sequence;
362 backward_sequence_ = backward_sequence;
363 unperformed_ = unperformed;
364 DCHECK(CheckClassInvariants());
367 void SequenceVarElement::SetForwardSequence(
368 const std::vector<int>& forward_sequence) {
369 forward_sequence_ = forward_sequence;
372 void SequenceVarElement::SetBackwardSequence(
373 const std::vector<int>& backward_sequence) {
374 backward_sequence_ = backward_sequence;
377 void SequenceVarElement::SetUnperformed(
const std::vector<int>& unperformed) {
378 unperformed_ = unperformed;
381 bool SequenceVarElement::CheckClassInvariants() {
382 absl::flat_hash_set<int> visited;
383 for (
const int forward_sequence : forward_sequence_) {
387 visited.insert(forward_sequence);
389 for (
const int backward_sequence : backward_sequence_) {
393 visited.insert(backward_sequence);
395 for (
const int unperformed : unperformed_) {
399 visited.insert(unperformed);
406 Assignment::Assignment(
const Assignment*
const copy)
407 : PropagationBaseObject(copy->solver()),
408 int_var_container_(copy->int_var_container_),
409 interval_var_container_(copy->interval_var_container_),
410 sequence_var_container_(copy->sequence_var_container_),
411 objective_element_(copy->objective_element_) {}
413 Assignment::Assignment(Solver*
const s)
414 : PropagationBaseObject(s), objective_element_(nullptr) {}
416 Assignment::~Assignment() {}
418 void Assignment::Clear() {
419 objective_element_.Reset(
nullptr);
420 int_var_container_.Clear();
421 interval_var_container_.Clear();
422 sequence_var_container_.Clear();
425 void Assignment::Store() {
426 int_var_container_.Store();
427 interval_var_container_.Store();
428 sequence_var_container_.Store();
429 if (HasObjective()) {
430 objective_element_.Store();
434 void Assignment::Restore() {
436 int_var_container_.Restore();
437 interval_var_container_.Restore();
438 sequence_var_container_.Restore();
444 template <
class V,
class E>
445 void IdToElementMap(AssignmentContainer<V, E>* container,
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) {
450 E*
const element = container->MutableElement(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";
457 LOG(INFO) <<
"Cannot save/load variables with duplicate names: " <<
name
458 <<
"; variable will be ignored";
460 (*id_to_element_map)[
name] = element;
465 template <
class E,
class P>
466 void 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";
481 bool Assignment::Load(
const std::string& filename) {
484 LOG(INFO) <<
"Cannot open " << filename;
491 CHECK(
file !=
nullptr);
492 AssignmentProto assignment_proto;
494 if (!reader.ReadProtocolMessage(&assignment_proto)) {
495 LOG(INFO) <<
"No assignment found in " <<
file->filename();
498 Load(assignment_proto);
499 return reader.Close();
502 template <
class Var,
class Element,
class Proto,
class Container>
503 void 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));
527 void Assignment::Load(
const AssignmentProto& assignment_proto) {
528 RealLoad<IntVar, IntVarElement, IntVarAssignment, IntContainer>(
529 assignment_proto, &int_var_container_,
530 &AssignmentProto::int_var_assignment_size,
531 &AssignmentProto::int_var_assignment);
532 RealLoad<IntervalVar, IntervalVarElement, IntervalVarAssignment,
533 IntervalContainer>(assignment_proto, &interval_var_container_,
534 &AssignmentProto::interval_var_assignment_size,
535 &AssignmentProto::interval_var_assignment);
536 RealLoad<SequenceVar, SequenceVarElement, SequenceVarAssignment,
537 SequenceContainer>(assignment_proto, &sequence_var_container_,
538 &AssignmentProto::sequence_var_assignment_size,
539 &AssignmentProto::sequence_var_assignment);
540 if (assignment_proto.has_objective()) {
541 const IntVarAssignment& objective = assignment_proto.objective();
542 const std::string objective_id = objective.var_id();
543 CHECK(!objective_id.empty());
544 if (HasObjective() && objective_id == Objective()->
name()) {
545 const int64 obj_min = objective.min();
546 const int64 obj_max = objective.max();
547 SetObjectiveRange(obj_min, obj_max);
548 if (objective.active()) {
551 DeactivateObjective();
557 bool Assignment::Save(
const std::string& filename)
const {
560 LOG(INFO) <<
"Cannot open " << filename;
566 bool Assignment::Save(
File*
file)
const {
567 CHECK(
file !=
nullptr);
568 AssignmentProto assignment_proto;
569 Save(&assignment_proto);
571 return writer.WriteProtocolMessage(assignment_proto) && writer.Close();
574 template <
class Var,
class Element,
class Proto,
class Container>
575 void RealSave(AssignmentProto*
const assignment_proto,
576 const Container& container, Proto* (AssignmentProto::*Add)()) {
577 for (
const Element& element : container.elements()) {
578 const Var*
const var = element.Var();
579 const std::string&
name =
var->name();
581 Proto*
const var_assignment_proto = (assignment_proto->*Add)();
582 element.WriteToProto(var_assignment_proto);
587 void Assignment::Save(AssignmentProto*
const assignment_proto)
const {
588 assignment_proto->Clear();
589 RealSave<IntVar, IntVarElement, IntVarAssignment, IntContainer>(
590 assignment_proto, int_var_container_,
591 &AssignmentProto::add_int_var_assignment);
592 RealSave<IntervalVar, IntervalVarElement, IntervalVarAssignment,
593 IntervalContainer>(assignment_proto, interval_var_container_,
594 &AssignmentProto::add_interval_var_assignment);
595 RealSave<SequenceVar, SequenceVarElement, SequenceVarAssignment,
596 SequenceContainer>(assignment_proto, sequence_var_container_,
597 &AssignmentProto::add_sequence_var_assignment);
598 if (HasObjective()) {
599 const IntVar* objective = Objective();
600 const std::string&
name = objective->name();
602 IntVarAssignment* objective = assignment_proto->mutable_objective();
603 objective->set_var_id(
name);
604 const int64 obj_min = ObjectiveMin();
605 const int64 obj_max = ObjectiveMax();
606 objective->set_min(obj_min);
607 objective->set_max(obj_max);
608 objective->set_active(ActivatedObjective());
613 template <
class Container,
class Element>
615 for (
const Element& element : container.elements()) {
616 if (element.Var() !=
nullptr) {
617 absl::StrAppendFormat(out,
"%s %s | ", element.Var()->name(),
618 element.DebugString());
623 std::string Assignment::DebugString()
const {
624 std::string out =
"Assignment(";
625 RealDebugString<IntContainer, IntVarElement>(int_var_container_, &out);
626 RealDebugString<IntervalContainer, IntervalVarElement>(
627 interval_var_container_, &out);
628 RealDebugString<SequenceContainer, SequenceVarElement>(
629 sequence_var_container_, &out);
630 if (HasObjective() && objective_element_.Activated()) {
631 out += objective_element_.DebugString();
637 IntVarElement* Assignment::Add(IntVar*
const var) {
638 return int_var_container_.Add(
var);
641 void Assignment::Add(
const std::vector<IntVar*>& vars) {
642 for (IntVar*
const var : vars) {
647 IntVarElement* Assignment::FastAdd(IntVar*
const var) {
648 return int_var_container_.FastAdd(
var);
651 int64 Assignment::Min(
const IntVar*
const var)
const {
652 return int_var_container_.Element(
var).Min();
655 int64 Assignment::Max(
const IntVar*
const var)
const {
656 return int_var_container_.Element(
var).Max();
660 return int_var_container_.Element(
var).Value();
663 bool Assignment::Bound(
const IntVar*
const var)
const {
664 return int_var_container_.Element(
var).Bound();
667 void Assignment::SetMin(
const IntVar*
const var,
int64 m) {
668 int_var_container_.MutableElement(
var)->SetMin(m);
671 void Assignment::SetMax(
const IntVar*
const var,
int64 m) {
672 int_var_container_.MutableElement(
var)->SetMax(m);
675 void Assignment::SetRange(
const IntVar*
const var,
int64 l,
int64 u) {
676 int_var_container_.MutableElement(
var)->SetRange(l, u);
679 void Assignment::SetValue(
const IntVar*
const var,
int64 value) {
680 int_var_container_.MutableElement(
var)->SetValue(
value);
685 IntervalVarElement* Assignment::Add(IntervalVar*
const var) {
686 return interval_var_container_.Add(
var);
689 void Assignment::Add(
const std::vector<IntervalVar*>& vars) {
690 for (IntervalVar*
const var : vars) {
695 IntervalVarElement* Assignment::FastAdd(IntervalVar*
const var) {
696 return interval_var_container_.FastAdd(
var);
699 int64 Assignment::StartMin(
const IntervalVar*
const var)
const {
700 return interval_var_container_.Element(
var).StartMin();
703 int64 Assignment::StartMax(
const IntervalVar*
const var)
const {
704 return interval_var_container_.Element(
var).StartMax();
707 int64 Assignment::StartValue(
const IntervalVar*
const var)
const {
708 return interval_var_container_.Element(
var).StartValue();
711 int64 Assignment::DurationMin(
const IntervalVar*
const var)
const {
712 return interval_var_container_.Element(
var).DurationMin();
715 int64 Assignment::DurationMax(
const IntervalVar*
const var)
const {
716 return interval_var_container_.Element(
var).DurationMax();
719 int64 Assignment::DurationValue(
const IntervalVar*
const var)
const {
720 return interval_var_container_.Element(
var).DurationValue();
723 int64 Assignment::EndMin(
const IntervalVar*
const var)
const {
724 return interval_var_container_.Element(
var).EndMin();
727 int64 Assignment::EndMax(
const IntervalVar*
const var)
const {
728 return interval_var_container_.Element(
var).EndMax();
731 int64 Assignment::EndValue(
const IntervalVar*
const var)
const {
732 return interval_var_container_.Element(
var).EndValue();
735 int64 Assignment::PerformedMin(
const IntervalVar*
const var)
const {
736 return interval_var_container_.Element(
var).PerformedMin();
739 int64 Assignment::PerformedMax(
const IntervalVar*
const var)
const {
740 return interval_var_container_.Element(
var).PerformedMax();
743 int64 Assignment::PerformedValue(
const IntervalVar*
const var)
const {
744 return interval_var_container_.Element(
var).PerformedValue();
747 void Assignment::SetStartMin(
const IntervalVar*
const var,
int64 m) {
748 interval_var_container_.MutableElement(
var)->SetStartMin(m);
751 void Assignment::SetStartMax(
const IntervalVar*
const var,
int64 m) {
752 interval_var_container_.MutableElement(
var)->SetStartMax(m);
755 void Assignment::SetStartRange(
const IntervalVar*
const var,
int64 mi,
757 interval_var_container_.MutableElement(
var)->SetStartRange(mi, ma);
760 void Assignment::SetStartValue(
const IntervalVar*
const var,
int64 value) {
761 interval_var_container_.MutableElement(
var)->SetStartValue(
value);
764 void Assignment::SetDurationMin(
const IntervalVar*
const var,
int64 m) {
765 interval_var_container_.MutableElement(
var)->SetDurationMin(m);
768 void Assignment::SetDurationMax(
const IntervalVar*
const var,
int64 m) {
769 interval_var_container_.MutableElement(
var)->SetDurationMax(m);
772 void Assignment::SetDurationRange(
const IntervalVar*
const var,
int64 mi,
774 interval_var_container_.MutableElement(
var)->SetDurationRange(mi, ma);
777 void Assignment::SetDurationValue(
const IntervalVar*
const var,
int64 value) {
778 interval_var_container_.MutableElement(
var)->SetDurationValue(
value);
781 void Assignment::SetEndMin(
const IntervalVar*
const var,
int64 m) {
782 interval_var_container_.MutableElement(
var)->SetEndMin(m);
785 void Assignment::SetEndMax(
const IntervalVar*
const var,
int64 m) {
786 interval_var_container_.MutableElement(
var)->SetEndMax(m);
789 void Assignment::SetEndRange(
const IntervalVar*
const var,
int64 mi,
int64 ma) {
790 interval_var_container_.MutableElement(
var)->SetEndRange(mi, ma);
793 void Assignment::SetEndValue(
const IntervalVar*
const var,
int64 value) {
794 interval_var_container_.MutableElement(
var)->SetEndValue(
value);
797 void Assignment::SetPerformedMin(
const IntervalVar*
const var,
int64 m) {
798 interval_var_container_.MutableElement(
var)->SetPerformedMin(m);
801 void Assignment::SetPerformedMax(
const IntervalVar*
const var,
int64 m) {
802 interval_var_container_.MutableElement(
var)->SetPerformedMax(m);
805 void Assignment::SetPerformedRange(
const IntervalVar*
const var,
int64 mi,
807 interval_var_container_.MutableElement(
var)->SetPerformedRange(mi, ma);
810 void Assignment::SetPerformedValue(
const IntervalVar*
const var,
int64 value) {
811 interval_var_container_.MutableElement(
var)->SetPerformedValue(
value);
816 SequenceVarElement* Assignment::Add(SequenceVar*
const var) {
817 return sequence_var_container_.Add(
var);
820 void Assignment::Add(
const std::vector<SequenceVar*>& vars) {
821 for (SequenceVar*
const var : vars) {
826 SequenceVarElement* Assignment::FastAdd(SequenceVar*
const var) {
827 return sequence_var_container_.FastAdd(
var);
830 const std::vector<int>& Assignment::ForwardSequence(
831 const SequenceVar*
const var)
const {
832 return sequence_var_container_.Element(
var).ForwardSequence();
835 const std::vector<int>& Assignment::BackwardSequence(
836 const SequenceVar*
const var)
const {
837 return sequence_var_container_.Element(
var).BackwardSequence();
840 const std::vector<int>& Assignment::Unperformed(
841 const SequenceVar*
const var)
const {
842 return sequence_var_container_.Element(
var).Unperformed();
845 void Assignment::SetSequence(
const SequenceVar*
const var,
846 const std::vector<int>& forward_sequence,
847 const std::vector<int>& backward_sequence,
848 const std::vector<int>& unperformed) {
849 sequence_var_container_.MutableElement(
var)->SetSequence(
850 forward_sequence, backward_sequence, unperformed);
853 void Assignment::SetForwardSequence(
const SequenceVar*
const var,
854 const std::vector<int>& forward_sequence) {
855 sequence_var_container_.MutableElement(
var)->SetForwardSequence(
859 void Assignment::SetBackwardSequence(
860 const SequenceVar*
const var,
const std::vector<int>& backward_sequence) {
861 sequence_var_container_.MutableElement(
var)->SetBackwardSequence(
865 void Assignment::SetUnperformed(
const SequenceVar*
const var,
866 const std::vector<int>& unperformed) {
867 sequence_var_container_.MutableElement(
var)->SetUnperformed(unperformed);
872 void Assignment::AddObjective(IntVar*
const v) {
874 CHECK(!HasObjective());
875 objective_element_.Reset(v);
878 IntVar* Assignment::Objective()
const {
return objective_element_.Var(); }
880 int64 Assignment::ObjectiveMin()
const {
881 if (HasObjective()) {
882 return objective_element_.Min();
887 int64 Assignment::ObjectiveMax()
const {
888 if (HasObjective()) {
889 return objective_element_.Max();
894 int64 Assignment::ObjectiveValue()
const {
895 if (HasObjective()) {
896 return objective_element_.Value();
901 bool Assignment::ObjectiveBound()
const {
902 if (HasObjective()) {
903 return objective_element_.Bound();
908 void Assignment::SetObjectiveMin(
int64 m) {
909 if (HasObjective()) {
910 objective_element_.SetMin(m);
914 void Assignment::SetObjectiveMax(
int64 m) {
915 if (HasObjective()) {
916 objective_element_.SetMax(m);
920 void Assignment::SetObjectiveRange(
int64 l,
int64 u) {
921 if (HasObjective()) {
922 objective_element_.SetRange(l, u);
926 void Assignment::SetObjectiveValue(
int64 value) {
927 if (HasObjective()) {
928 objective_element_.SetValue(
value);
932 void Assignment::Activate(
const IntVar*
const var) {
933 int_var_container_.MutableElement(
var)->Activate();
936 void Assignment::Deactivate(
const IntVar*
const var) {
937 int_var_container_.MutableElement(
var)->Deactivate();
940 bool Assignment::Activated(
const IntVar*
const var)
const {
941 return int_var_container_.Element(
var).Activated();
944 void Assignment::Activate(
const IntervalVar*
const var) {
945 interval_var_container_.MutableElement(
var)->Activate();
948 void Assignment::Deactivate(
const IntervalVar*
const var) {
949 interval_var_container_.MutableElement(
var)->Deactivate();
952 bool Assignment::Activated(
const IntervalVar*
const var)
const {
953 return interval_var_container_.Element(
var).Activated();
956 void Assignment::Activate(
const SequenceVar*
const var) {
957 sequence_var_container_.MutableElement(
var)->Activate();
960 void Assignment::Deactivate(
const SequenceVar*
const var) {
961 sequence_var_container_.MutableElement(
var)->Deactivate();
964 bool Assignment::Activated(
const SequenceVar*
const var)
const {
965 return sequence_var_container_.Element(
var).Activated();
968 void Assignment::ActivateObjective() {
969 if (HasObjective()) {
970 objective_element_.Activate();
974 void Assignment::DeactivateObjective() {
975 if (HasObjective()) {
976 objective_element_.Deactivate();
980 bool Assignment::ActivatedObjective()
const {
981 if (HasObjective()) {
982 return objective_element_.Activated();
987 bool Assignment::Contains(
const IntVar*
const var)
const {
988 return int_var_container_.Contains(
var);
991 bool Assignment::Contains(
const IntervalVar*
const var)
const {
992 return interval_var_container_.Contains(
var);
995 bool Assignment::Contains(
const SequenceVar*
const var)
const {
996 return sequence_var_container_.Contains(
var);
999 void Assignment::CopyIntersection(
const Assignment* assignment) {
1000 int_var_container_.CopyIntersection(assignment->int_var_container_);
1001 interval_var_container_.CopyIntersection(assignment->interval_var_container_);
1002 sequence_var_container_.CopyIntersection(assignment->sequence_var_container_);
1003 if (objective_element_.Var() == assignment->objective_element_.Var()) {
1004 objective_element_ = assignment->objective_element_;
1008 void Assignment::Copy(
const Assignment* assignment) {
1010 int_var_container_.Copy(assignment->int_var_container_);
1011 interval_var_container_.Copy(assignment->interval_var_container_);
1012 sequence_var_container_.Copy(assignment->sequence_var_container_);
1013 objective_element_ = assignment->objective_element_;
1017 const std::vector<IntVar*>& target_vars,
1018 const Assignment* source_assignment,
1019 const std::vector<IntVar*>& source_vars) {
1020 const int vars_size = target_vars.size();
1021 CHECK_EQ(source_vars.size(), vars_size);
1022 CHECK(target_assignment !=
nullptr);
1024 target_assignment->Clear();
1025 const Solver*
const target_solver = target_assignment->solver();
1026 const Solver*
const source_solver = source_assignment->solver();
1028 IntVar* target_var = target_vars[
index];
1029 CHECK_EQ(target_var->solver(), target_solver);
1030 IntVar* source_var = source_vars[
index];
1031 CHECK_EQ(source_var->solver(), source_solver);
1032 target_assignment->Add(target_var)
1033 ->SetValue(source_assignment->Value(source_var));
1037 Assignment* Solver::MakeAssignment() {
return RevAlloc(
new Assignment(
this)); }
1039 Assignment* Solver::MakeAssignment(
const Assignment*
const a) {
1040 return RevAlloc(
new Assignment(
a));
1045 class RestoreAssignment :
public DecisionBuilder {
1047 explicit RestoreAssignment(Assignment* assignment)
1048 : assignment_(assignment) {}
1050 ~RestoreAssignment()
override {}
1052 Decision* Next(Solver*
const solver)
override {
1053 assignment_->Restore();
1057 std::string DebugString()
const override {
return "RestoreAssignment"; }
1060 Assignment*
const assignment_;
1065 explicit StoreAssignment(Assignment* assignment) : assignment_(assignment) {}
1069 Decision* Next(Solver*
const solver)
override {
1070 assignment_->Store();
1074 std::string DebugString()
const override {
return "StoreAssignment"; }
1077 Assignment*
const assignment_;
1081 DecisionBuilder* Solver::MakeRestoreAssignment(Assignment* assignment) {
1082 return RevAlloc(
new RestoreAssignment(assignment));
1085 DecisionBuilder* Solver::MakeStoreAssignment(Assignment* assignment) {
1089 std::ostream&
operator<<(std::ostream& out,
const Assignment& assignment) {
1090 return out << assignment.DebugString();