19 #include "absl/strings/str_cat.h" 20 #include "absl/strings/str_format.h" 29 #pragma warning(disable : 4351 4355 4804 4805) 45 void LinkVarExpr(Solver*
const s, IntExpr*
const expr, IntVar*
const var);
59 class MirrorIntervalVar :
public IntervalVar {
61 MirrorIntervalVar(Solver*
const s, IntervalVar*
const t)
62 : IntervalVar(s,
"Mirror<" + t->
name() +
">"), t_(t) {}
63 ~MirrorIntervalVar()
override {}
67 int64_t StartMin()
const override {
return -t_->EndMax(); }
68 int64_t StartMax()
const override {
return -t_->EndMin(); }
69 void SetStartMin(int64_t m)
override { t_->SetEndMax(-m); }
70 void SetStartMax(int64_t m)
override { t_->SetEndMin(-m); }
71 void SetStartRange(int64_t mi, int64_t ma)
override {
72 t_->SetEndRange(-ma, -mi);
74 int64_t OldStartMin()
const override {
return -t_->OldEndMax(); }
75 int64_t OldStartMax()
const override {
return -t_->OldEndMin(); }
76 void WhenStartRange(Demon*
const d)
override { t_->WhenEndRange(d); }
77 void WhenStartBound(Demon*
const d)
override { t_->WhenEndBound(d); }
80 int64_t DurationMin()
const override {
return t_->DurationMin(); }
81 int64_t DurationMax()
const override {
return t_->DurationMax(); }
82 void SetDurationMin(int64_t m)
override { t_->SetDurationMin(m); }
83 void SetDurationMax(int64_t m)
override { t_->SetDurationMax(m); }
84 void SetDurationRange(int64_t mi, int64_t ma)
override {
85 t_->SetDurationRange(mi, ma);
87 int64_t OldDurationMin()
const override {
return t_->OldDurationMin(); }
88 int64_t OldDurationMax()
const override {
return t_->OldDurationMax(); }
89 void WhenDurationRange(Demon*
const d)
override { t_->WhenDurationRange(d); }
90 void WhenDurationBound(Demon*
const d)
override { t_->WhenDurationBound(d); }
93 int64_t EndMin()
const override {
return -t_->StartMax(); }
94 int64_t EndMax()
const override {
return -t_->StartMin(); }
95 void SetEndMin(int64_t m)
override { t_->SetStartMax(-m); }
96 void SetEndMax(int64_t m)
override { t_->SetStartMin(-m); }
97 void SetEndRange(int64_t mi, int64_t ma)
override {
98 t_->SetStartRange(-ma, -mi);
100 int64_t OldEndMin()
const override {
return -t_->OldStartMax(); }
101 int64_t OldEndMax()
const override {
return -t_->OldStartMin(); }
102 void WhenEndRange(Demon*
const d)
override { t_->WhenStartRange(d); }
103 void WhenEndBound(Demon*
const d)
override { t_->WhenStartBound(d); }
107 bool MustBePerformed()
const override {
return t_->MustBePerformed(); }
108 bool MayBePerformed()
const override {
return t_->MayBePerformed(); }
109 void SetPerformed(
bool val)
override { t_->SetPerformed(val); }
110 bool WasPerformedBound()
const override {
return t_->WasPerformedBound(); }
111 void WhenPerformedBound(Demon*
const d)
override {
112 t_->WhenPerformedBound(d);
115 void Accept(ModelVisitor*
const visitor)
const override {
119 std::string DebugString()
const override {
120 return absl::StrFormat(
"MirrorInterval(%s)", t_->DebugString());
123 IntExpr* StartExpr()
override {
124 return solver()->MakeOpposite(t_->EndExpr());
126 IntExpr* DurationExpr()
override {
return t_->DurationExpr(); }
127 IntExpr* EndExpr()
override {
128 return solver()->MakeOpposite(t_->StartExpr());
130 IntExpr* PerformedExpr()
override {
return t_->PerformedExpr(); }
134 IntExpr* SafeStartExpr(int64_t unperformed_value)
override {
135 return solver()->MakeOpposite(t_->SafeEndExpr(-unperformed_value));
137 IntExpr* SafeDurationExpr(int64_t unperformed_value)
override {
138 return t_->SafeDurationExpr(unperformed_value);
140 IntExpr* SafeEndExpr(int64_t unperformed_value)
override {
141 return solver()->MakeOpposite(t_->SafeStartExpr(-unperformed_value));
145 IntervalVar*
const t_;
165 class AlwaysPerformedIntervalVarWrapper :
public IntervalVar {
167 explicit AlwaysPerformedIntervalVarWrapper(IntervalVar*
const t)
168 : IntervalVar(t->solver(),
169 absl::StrFormat(
"AlwaysPerformed<%s>", t->
name())),
171 start_expr_(nullptr),
172 duration_expr_(nullptr),
173 end_expr_(nullptr) {}
175 ~AlwaysPerformedIntervalVarWrapper()
override {}
176 int64_t StartMin()
const override {
177 return MayUnderlyingBePerformed() ? t_->StartMin() : kMinValidValue;
179 int64_t StartMax()
const override {
180 return MayUnderlyingBePerformed() ? t_->StartMax() : kMaxValidValue;
182 void SetStartMin(int64_t m)
override { t_->SetStartMin(m); }
183 void SetStartMax(int64_t m)
override { t_->SetStartMax(m); }
184 void SetStartRange(int64_t mi, int64_t ma)
override {
185 t_->SetStartRange(mi, ma);
187 int64_t OldStartMin()
const override {
188 return MayUnderlyingBePerformed() ? t_->OldStartMin() : kMinValidValue;
190 int64_t OldStartMax()
const override {
191 return MayUnderlyingBePerformed() ? t_->OldStartMax() : kMaxValidValue;
193 void WhenStartRange(Demon*
const d)
override { t_->WhenStartRange(d); }
194 void WhenStartBound(Demon*
const d)
override { t_->WhenStartBound(d); }
195 int64_t DurationMin()
const override {
196 return MayUnderlyingBePerformed() ? t_->DurationMin() : 0LL;
198 int64_t DurationMax()
const override {
199 return MayUnderlyingBePerformed() ? t_->DurationMax() : 0LL;
201 void SetDurationMin(int64_t m)
override { t_->SetDurationMin(m); }
202 void SetDurationMax(int64_t m)
override { t_->SetDurationMax(m); }
203 void SetDurationRange(int64_t mi, int64_t ma)
override {
204 t_->SetDurationRange(mi, ma);
206 int64_t OldDurationMin()
const override {
207 return MayUnderlyingBePerformed() ? t_->OldDurationMin() : 0LL;
209 int64_t OldDurationMax()
const override {
210 return MayUnderlyingBePerformed() ? t_->OldDurationMax() : 0LL;
212 void WhenDurationRange(Demon*
const d)
override { t_->WhenDurationRange(d); }
213 void WhenDurationBound(Demon*
const d)
override { t_->WhenDurationBound(d); }
214 int64_t EndMin()
const override {
215 return MayUnderlyingBePerformed() ? t_->EndMin() : kMinValidValue;
217 int64_t EndMax()
const override {
218 return MayUnderlyingBePerformed() ? t_->EndMax() : kMaxValidValue;
220 void SetEndMin(int64_t m)
override { t_->SetEndMin(m); }
221 void SetEndMax(int64_t m)
override { t_->SetEndMax(m); }
222 void SetEndRange(int64_t mi, int64_t ma)
override { t_->SetEndRange(mi, ma); }
223 int64_t OldEndMin()
const override {
224 return MayUnderlyingBePerformed() ? t_->OldEndMin() : kMinValidValue;
226 int64_t OldEndMax()
const override {
227 return MayUnderlyingBePerformed() ? t_->OldEndMax() : kMaxValidValue;
229 void WhenEndRange(Demon*
const d)
override { t_->WhenEndRange(d); }
230 void WhenEndBound(Demon*
const d)
override { t_->WhenEndBound(d); }
231 bool MustBePerformed()
const override {
return true; }
232 bool MayBePerformed()
const override {
return true; }
233 void SetPerformed(
bool val)
override {
242 bool WasPerformedBound()
const override {
return true; }
243 void WhenPerformedBound(Demon*
const d)
override {
244 t_->WhenPerformedBound(d);
246 IntExpr* StartExpr()
override {
247 if (start_expr_ ==
nullptr) {
248 solver()->SaveValue(reinterpret_cast<void**>(&start_expr_));
253 IntExpr* DurationExpr()
override {
254 if (duration_expr_ ==
nullptr) {
255 solver()->SaveValue(reinterpret_cast<void**>(&duration_expr_));
258 return duration_expr_;
260 IntExpr* EndExpr()
override {
261 if (end_expr_ ==
nullptr) {
262 solver()->SaveValue(reinterpret_cast<void**>(&end_expr_));
267 IntExpr* PerformedExpr()
override {
return solver()->MakeIntConst(1); }
268 IntExpr* SafeStartExpr(int64_t unperformed_value)
override {
271 IntExpr* SafeDurationExpr(int64_t unperformed_value)
override {
272 return DurationExpr();
274 IntExpr* SafeEndExpr(int64_t unperformed_value)
override {
return EndExpr(); }
277 IntervalVar*
const underlying()
const {
return t_; }
278 bool MayUnderlyingBePerformed()
const {
279 return underlying()->MayBePerformed();
283 IntervalVar*
const t_;
284 IntExpr* start_expr_;
285 IntExpr* duration_expr_;
303 class IntervalVarRelaxedMax :
public AlwaysPerformedIntervalVarWrapper {
305 explicit IntervalVarRelaxedMax(IntervalVar*
const t)
306 : AlwaysPerformedIntervalVarWrapper(t) {}
307 ~IntervalVarRelaxedMax()
override {}
308 int64_t StartMax()
const override {
310 return underlying()->MustBePerformed() ? underlying()->StartMax()
311 : (kMaxValidValue - DurationMin());
313 void SetStartMax(int64_t m)
override {
315 <<
"Calling SetStartMax on a IntervalVarRelaxedMax is not supported, " 316 <<
"as it seems there is no legitimate use case.";
318 int64_t EndMax()
const override {
319 return underlying()->MustBePerformed() ? underlying()->EndMax()
322 void SetEndMax(int64_t m)
override {
324 <<
"Calling SetEndMax on a IntervalVarRelaxedMax is not supported, " 325 <<
"as it seems there is no legitimate use case.";
328 void Accept(ModelVisitor*
const visitor)
const override {
333 std::string DebugString()
const override {
334 return absl::StrFormat(
"IntervalVarRelaxedMax(%s)",
335 underlying()->DebugString());
353 class IntervalVarRelaxedMin :
public AlwaysPerformedIntervalVarWrapper {
355 explicit IntervalVarRelaxedMin(IntervalVar*
const t)
356 : AlwaysPerformedIntervalVarWrapper(t) {}
357 ~IntervalVarRelaxedMin()
override {}
358 int64_t StartMin()
const override {
359 return underlying()->MustBePerformed() ? underlying()->StartMin()
362 void SetStartMin(int64_t m)
override {
364 <<
"Calling SetStartMin on a IntervalVarRelaxedMin is not supported, " 365 <<
"as it seems there is no legitimate use case.";
367 int64_t EndMin()
const override {
369 return underlying()->MustBePerformed() ? underlying()->EndMin()
370 : (kMinValidValue + DurationMin());
372 void SetEndMin(int64_t m)
override {
374 <<
"Calling SetEndMin on a IntervalVarRelaxedMin is not supported, " 375 <<
"as it seems there is no legitimate use case.";
378 void Accept(ModelVisitor*
const visitor)
const override {
383 std::string DebugString()
const override {
384 return absl::StrFormat(
"IntervalVarRelaxedMin(%s)",
385 underlying()->DebugString());
391 class BaseIntervalVar :
public IntervalVar {
393 class Handler :
public Demon {
395 explicit Handler(BaseIntervalVar*
const var) : var_(
var) {}
396 ~Handler()
override {}
397 void Run(Solver*
const s)
override { var_->Process(); }
401 std::string DebugString()
const override {
402 return absl::StrFormat(
"Handler(%s)", var_->DebugString());
406 BaseIntervalVar*
const var_;
409 BaseIntervalVar(Solver*
const s,
const std::string&
name)
410 : IntervalVar(s,
name),
413 cleaner_([this](Solver* s) { CleanInProcess(); }) {}
415 ~BaseIntervalVar()
override {}
417 virtual void Process() = 0;
419 virtual void Push() = 0;
423 std::string BaseName()
const override {
return "IntervalVar"; }
433 class RangeVar :
public IntExpr {
435 RangeVar(Solver*
const s, BaseIntervalVar*
var, int64_t mi, int64_t ma)
444 cast_var_(
nullptr) {}
446 ~RangeVar()
override {}
448 bool Bound()
const override {
return min_.Value() == max_.Value(); }
450 int64_t Min()
const override {
return min_.Value(); }
452 int64_t Max()
const override {
return max_.Value(); }
454 void SetMin(int64_t m)
override {
456 if (m <= min_.Value()) {
460 if (m > max_.Value()) {
461 var_->SetPerformed(
false);
464 if (var_->InProcess()) {
466 if (m > postponed_max_) {
467 var_->SetPerformed(
false);
469 if (m > postponed_min_) {
474 SyncPreviousBounds();
475 min_.SetValue(solver(), m);
480 int64_t OldMin()
const {
481 DCHECK(var_->InProcess());
482 return previous_min_;
485 void SetMax(int64_t m)
override {
486 if (m >= max_.Value()) {
489 if (m < min_.Value()) {
490 var_->SetPerformed(
false);
493 if (var_->InProcess()) {
495 if (m < postponed_min_) {
496 var_->SetPerformed(
false);
498 if (m < postponed_max_) {
503 SyncPreviousBounds();
504 max_.SetValue(solver(), m);
509 int64_t OldMax()
const {
return previous_min_; }
511 void SetRange(int64_t mi, int64_t ma)
override {
512 if (mi <= min_.Value() && ma >= max_.Value()) {
516 if (mi > max_.Value() || ma < min_.Value() || mi > ma) {
517 var_->SetPerformed(
false);
519 if (var_->InProcess()) {
520 if (mi > postponed_max_ || ma < postponed_min_) {
521 var_->SetPerformed(
false);
523 if (mi > postponed_min_) {
526 if (ma < postponed_max_) {
531 SyncPreviousBounds();
532 if (mi > min_.Value()) {
533 min_.SetValue(solver(), mi);
535 if (ma < max_.Value()) {
536 max_.SetValue(solver(), ma);
542 void WhenRange(Demon*
const demon)
override {
545 delayed_range_demons_.PushIfNotTop(solver(),
548 range_demons_.PushIfNotTop(solver(), solver()->
RegisterDemon(demon));
553 virtual void WhenBound(Demon*
const demon) {
556 delayed_bound_demons_.PushIfNotTop(solver(),
559 bound_demons_.PushIfNotTop(solver(), solver()->
RegisterDemon(demon));
564 void UpdatePostponedBounds() {
565 postponed_min_ = min_.Value();
566 postponed_max_ = max_.Value();
569 void ProcessDemons() {
571 ExecuteAll(bound_demons_);
572 EnqueueAll(delayed_bound_demons_);
574 if (min_.Value() != previous_min_ || max_.Value() != previous_max_) {
575 ExecuteAll(range_demons_);
576 EnqueueAll(delayed_range_demons_);
580 void UpdatePreviousBounds() {
581 previous_min_ = min_.Value();
582 previous_max_ = max_.Value();
586 void ApplyPostponedBounds(IntervalField which) {
587 if (min_.Value() < postponed_min_ || max_.Value() > postponed_max_) {
590 var_->SetStartRange(
std::max(postponed_min_, min_.Value()),
591 std::min(postponed_max_, max_.Value()));
594 var_->SetDurationRange(
std::max(postponed_min_, min_.Value()),
595 std::min(postponed_max_, max_.Value()));
598 var_->SetEndRange(
std::max(postponed_min_, min_.Value()),
599 std::min(postponed_max_, max_.Value()));
605 IntVar* Var()
override {
606 if (cast_var_ ==
nullptr) {
607 solver()->SaveValue(reinterpret_cast<void**>(&cast_var_));
608 cast_var_ = solver()->MakeIntVar(min_.Value(), max_.Value());
614 std::string DebugString()
const override {
615 std::string out = absl::StrCat(min_.Value());
617 absl::StrAppendFormat(&out,
" .. %d", max_.Value());
629 void SyncPreviousBounds() {
630 if (previous_min_ > min_.Value()) {
631 previous_min_ = min_.Value();
633 if (previous_max_ < max_.Value()) {
634 previous_max_ = max_.Value();
639 NumericalRev<int64_t> min_;
640 NumericalRev<int64_t> max_;
641 BaseIntervalVar*
const var_;
644 int64_t postponed_min_;
645 int64_t postponed_max_;
648 int64_t previous_min_;
649 int64_t previous_max_;
651 SimpleRevFIFO<Demon*> bound_demons_;
652 SimpleRevFIFO<Demon*> delayed_bound_demons_;
654 SimpleRevFIFO<Demon*> range_demons_;
655 SimpleRevFIFO<Demon*> delayed_range_demons_;
661 class PerformedVar :
public BooleanVar {
664 PerformedVar(Solver*
const s, BaseIntervalVar*
const var,
bool optional)
667 previous_value_(optional ? kUnboundBooleanVarValue : 1),
668 postponed_value_(optional ? kUnboundBooleanVarValue : 1) {
674 PerformedVar(Solver*
const s, BaseIntervalVar*
var)
675 : BooleanVar(s,
""), var_(
var), previous_value_(0), postponed_value_(0) {
679 ~PerformedVar()
override {}
681 void SetValue(int64_t v)
override {
682 if ((v & 0xfffffffffffffffe) != 0 ||
683 (value_ != kUnboundBooleanVarValue && v != value_)) {
686 if (var_->InProcess()) {
687 if (postponed_value_ != kUnboundBooleanVarValue &&
688 v != postponed_value_) {
691 postponed_value_ = v;
693 }
else if (value_ == kUnboundBooleanVarValue) {
694 previous_value_ = kUnboundBooleanVarValue;
696 value_ = static_cast<int>(v);
701 int64_t OldMin()
const override {
return previous_value_ == 1; }
703 int64_t OldMax()
const override {
return previous_value_ != 0; }
705 void RestoreValue()
override {
706 previous_value_ = kUnboundBooleanVarValue;
707 value_ = kUnboundBooleanVarValue;
708 postponed_value_ = kUnboundBooleanVarValue;
712 if (previous_value_ != value_) {
713 ExecuteAll(bound_demons_);
714 EnqueueAll(delayed_bound_demons_);
718 void UpdatePostponedValue() { postponed_value_ = value_; }
720 void UpdatePreviousValueAndApplyPostponedValue() {
721 previous_value_ = value_;
722 if (value_ != postponed_value_) {
723 DCHECK_NE(kUnboundBooleanVarValue, postponed_value_);
724 SetValue(postponed_value_);
728 std::string DebugString()
const override {
740 BaseIntervalVar*
const var_;
742 int postponed_value_;
747 class FixedDurationIntervalVar :
public BaseIntervalVar {
749 FixedDurationIntervalVar(Solver*
const s, int64_t
start_min,
750 int64_t
start_max, int64_t duration,
bool optional,
751 const std::string&
name);
753 FixedDurationIntervalVar(Solver*
const s,
const std::string&
name);
754 ~FixedDurationIntervalVar()
override {}
756 int64_t StartMin()
const override;
757 int64_t StartMax()
const override;
758 void SetStartMin(int64_t m)
override;
759 void SetStartMax(int64_t m)
override;
760 void SetStartRange(int64_t mi, int64_t ma)
override;
761 int64_t OldStartMin()
const override {
return start_.OldMin(); }
762 int64_t OldStartMax()
const override {
return start_.OldMax(); }
763 void WhenStartRange(Demon*
const d)
override {
764 if (performed_.Max() == 1) {
768 void WhenStartBound(Demon*
const d)
override {
769 if (performed_.Max() == 1) {
774 int64_t DurationMin()
const override;
775 int64_t DurationMax()
const override;
776 void SetDurationMin(int64_t m)
override;
777 void SetDurationMax(int64_t m)
override;
778 void SetDurationRange(int64_t mi, int64_t ma)
override;
779 int64_t OldDurationMin()
const override {
return duration_; }
780 int64_t OldDurationMax()
const override {
return duration_; }
781 void WhenDurationRange(Demon*
const d)
override {}
782 void WhenDurationBound(Demon*
const d)
override {}
784 int64_t EndMin()
const override;
785 int64_t EndMax()
const override;
786 void SetEndMin(int64_t m)
override;
787 void SetEndMax(int64_t m)
override;
788 void SetEndRange(int64_t mi, int64_t ma)
override;
789 int64_t OldEndMin()
const override {
790 return CapAdd(OldStartMin(), duration_);
792 int64_t OldEndMax()
const override {
793 return CapAdd(OldStartMax(), duration_);
795 void WhenEndRange(Demon*
const d)
override { WhenStartRange(d); }
796 void WhenEndBound(Demon*
const d)
override { WhenStartBound(d); }
798 bool MustBePerformed()
const override;
799 bool MayBePerformed()
const override;
800 void SetPerformed(
bool val)
override;
801 bool WasPerformedBound()
const override {
802 return performed_.OldMin() == performed_.OldMax();
804 void WhenPerformedBound(Demon*
const d)
override { performed_.WhenBound(d); }
805 void Process()
override;
806 std::string DebugString()
const override;
808 void Accept(ModelVisitor*
const visitor)
const override {
809 visitor->VisitIntervalVariable(
this,
"", 0, NullInterval());
812 IntExpr* StartExpr()
override {
return &start_; }
813 IntExpr* DurationExpr()
override {
return solver()->MakeIntConst(duration_); }
814 IntExpr* EndExpr()
override {
815 return solver()->MakeSum(StartExpr(), duration_);
817 IntExpr* PerformedExpr()
override {
return &performed_; }
818 IntExpr* SafeStartExpr(int64_t unperformed_value)
override {
821 IntExpr* SafeDurationExpr(int64_t unperformed_value)
override {
824 IntExpr* SafeEndExpr(int64_t unperformed_value)
override {
828 void Push()
override;
833 PerformedVar performed_;
836 FixedDurationIntervalVar::FixedDurationIntervalVar(
838 bool optional,
const std::string&
name)
839 : BaseIntervalVar(s,
name),
842 performed_(s, this, optional) {}
844 FixedDurationIntervalVar::FixedDurationIntervalVar(Solver*
const s,
845 const std::string&
name)
846 : BaseIntervalVar(s,
name),
847 start_(s, this, 0, 0),
849 performed_(s, this) {}
851 void FixedDurationIntervalVar::Process() {
854 start_.UpdatePostponedBounds();
855 performed_.UpdatePostponedValue();
857 if (performed_.Max() == 1) {
858 start_.ProcessDemons();
860 performed_.Process();
861 reset_action_on_fail();
863 start_.UpdatePreviousBounds();
864 start_.ApplyPostponedBounds(START);
865 performed_.UpdatePreviousValueAndApplyPostponedValue();
868 int64_t FixedDurationIntervalVar::StartMin()
const {
873 int64_t FixedDurationIntervalVar::StartMax()
const {
878 void FixedDurationIntervalVar::SetStartMin(int64_t m) {
879 if (performed_.Max() == 1) {
884 void FixedDurationIntervalVar::SetStartMax(int64_t m) {
885 if (performed_.Max() == 1) {
890 void FixedDurationIntervalVar::SetStartRange(int64_t mi, int64_t ma) {
891 if (performed_.Max() == 1) {
892 start_.SetRange(mi, ma);
896 int64_t FixedDurationIntervalVar::DurationMin()
const {
901 int64_t FixedDurationIntervalVar::DurationMax()
const {
906 void FixedDurationIntervalVar::SetDurationMin(int64_t m) {
912 void FixedDurationIntervalVar::SetDurationMax(int64_t m) {
918 void FixedDurationIntervalVar::SetDurationRange(int64_t mi, int64_t ma) {
919 if (mi > duration_ || ma < duration_ || mi > ma) {
924 int64_t FixedDurationIntervalVar::EndMin()
const {
926 return start_.Min() + duration_;
929 int64_t FixedDurationIntervalVar::EndMax()
const {
931 return CapAdd(start_.Max(), duration_);
934 void FixedDurationIntervalVar::SetEndMin(int64_t m) {
935 SetStartMin(
CapSub(m, duration_));
938 void FixedDurationIntervalVar::SetEndMax(int64_t m) {
939 SetStartMax(
CapSub(m, duration_));
942 void FixedDurationIntervalVar::SetEndRange(int64_t mi, int64_t ma) {
943 SetStartRange(
CapSub(mi, duration_),
CapSub(ma, duration_));
946 bool FixedDurationIntervalVar::MustBePerformed()
const {
947 return (performed_.Min() == 1);
950 bool FixedDurationIntervalVar::MayBePerformed()
const {
951 return (performed_.Max() == 1);
954 void FixedDurationIntervalVar::SetPerformed(
bool val) {
955 performed_.SetValue(val);
958 void FixedDurationIntervalVar::Push() {
964 std::string FixedDurationIntervalVar::DebugString()
const {
965 const std::string& var_name =
name();
966 if (performed_.Max() == 0) {
967 if (!var_name.empty()) {
968 return absl::StrFormat(
"%s(performed = false)", var_name);
970 return "IntervalVar(performed = false)";
974 if (!var_name.empty()) {
975 out = var_name +
"(start = ";
977 out =
"IntervalVar(start = ";
979 absl::StrAppendFormat(&out,
"%s, duration = %d, performed = %s)",
980 start_.DebugString(), duration_,
981 performed_.DebugString());
988 class FixedDurationPerformedIntervalVar :
public BaseIntervalVar {
990 FixedDurationPerformedIntervalVar(Solver*
const s, int64_t
start_min,
992 const std::string&
name);
994 FixedDurationPerformedIntervalVar(Solver*
const s,
const std::string&
name);
995 ~FixedDurationPerformedIntervalVar()
override {}
997 int64_t StartMin()
const override;
998 int64_t StartMax()
const override;
999 void SetStartMin(int64_t m)
override;
1000 void SetStartMax(int64_t m)
override;
1001 void SetStartRange(int64_t mi, int64_t ma)
override;
1002 int64_t OldStartMin()
const override {
return start_.OldMin(); }
1003 int64_t OldStartMax()
const override {
return start_.OldMax(); }
1004 void WhenStartRange(Demon*
const d)
override { start_.WhenRange(d); }
1005 void WhenStartBound(Demon*
const d)
override { start_.WhenBound(d); }
1007 int64_t DurationMin()
const override;
1008 int64_t DurationMax()
const override;
1009 void SetDurationMin(int64_t m)
override;
1010 void SetDurationMax(int64_t m)
override;
1011 void SetDurationRange(int64_t mi, int64_t ma)
override;
1012 int64_t OldDurationMin()
const override {
return duration_; }
1013 int64_t OldDurationMax()
const override {
return duration_; }
1014 void WhenDurationRange(Demon*
const d)
override {}
1015 void WhenDurationBound(Demon*
const d)
override {}
1017 int64_t EndMin()
const override;
1018 int64_t EndMax()
const override;
1019 void SetEndMin(int64_t m)
override;
1020 void SetEndMax(int64_t m)
override;
1021 void SetEndRange(int64_t mi, int64_t ma)
override;
1022 int64_t OldEndMin()
const override {
1023 return CapAdd(OldStartMin(), duration_);
1025 int64_t OldEndMax()
const override {
1026 return CapAdd(OldStartMax(), duration_);
1028 void WhenEndRange(Demon*
const d)
override { WhenStartRange(d); }
1029 void WhenEndBound(Demon*
const d)
override { WhenEndRange(d); }
1031 bool MustBePerformed()
const override;
1032 bool MayBePerformed()
const override;
1033 void SetPerformed(
bool val)
override;
1034 bool WasPerformedBound()
const override {
return true; }
1035 void WhenPerformedBound(Demon*
const d)
override {}
1036 void Process()
override;
1037 std::string DebugString()
const override;
1039 void Accept(ModelVisitor*
const visitor)
const override {
1040 visitor->VisitIntervalVariable(
this,
"", 0, NullInterval());
1043 IntExpr* StartExpr()
override {
return &start_; }
1044 IntExpr* DurationExpr()
override {
return solver()->MakeIntConst(duration_); }
1045 IntExpr* EndExpr()
override {
1046 return solver()->MakeSum(StartExpr(), duration_);
1048 IntExpr* PerformedExpr()
override {
return solver()->MakeIntConst(1); }
1049 IntExpr* SafeStartExpr(int64_t unperformed_value)
override {
1052 IntExpr* SafeDurationExpr(int64_t unperformed_value)
override {
1053 return DurationExpr();
1055 IntExpr* SafeEndExpr(int64_t unperformed_value)
override {
return EndExpr(); }
1058 void CheckOldPerformed() {}
1059 void Push()
override;
1065 FixedDurationPerformedIntervalVar::FixedDurationPerformedIntervalVar(
1067 const std::string&
name)
1068 : BaseIntervalVar(s,
name),
1070 duration_(duration) {}
1072 FixedDurationPerformedIntervalVar::FixedDurationPerformedIntervalVar(
1073 Solver*
const s,
const std::string&
name)
1074 : BaseIntervalVar(s,
name), start_(s, this, 0, 0), duration_(0) {}
1076 void FixedDurationPerformedIntervalVar::Process() {
1079 start_.UpdatePostponedBounds();
1081 start_.ProcessDemons();
1082 reset_action_on_fail();
1084 start_.UpdatePreviousBounds();
1085 start_.ApplyPostponedBounds(START);
1088 int64_t FixedDurationPerformedIntervalVar::StartMin()
const {
1089 return start_.Min();
1092 int64_t FixedDurationPerformedIntervalVar::StartMax()
const {
1093 return start_.Max();
1096 void FixedDurationPerformedIntervalVar::SetStartMin(int64_t m) {
1100 void FixedDurationPerformedIntervalVar::SetStartMax(int64_t m) {
1104 void FixedDurationPerformedIntervalVar::SetStartRange(int64_t mi, int64_t ma) {
1105 start_.SetRange(mi, ma);
1108 int64_t FixedDurationPerformedIntervalVar::DurationMin()
const {
1112 int64_t FixedDurationPerformedIntervalVar::DurationMax()
const {
1116 void FixedDurationPerformedIntervalVar::SetDurationMin(int64_t m) {
1117 if (m > duration_) {
1118 SetPerformed(
false);
1122 void FixedDurationPerformedIntervalVar::SetDurationMax(int64_t m) {
1123 if (m < duration_) {
1124 SetPerformed(
false);
1127 int64_t FixedDurationPerformedIntervalVar::EndMin()
const {
1128 return CapAdd(start_.Min(), duration_);
1131 int64_t FixedDurationPerformedIntervalVar::EndMax()
const {
1132 return CapAdd(start_.Max(), duration_);
1135 void FixedDurationPerformedIntervalVar::SetEndMin(int64_t m) {
1136 SetStartMin(
CapSub(m, duration_));
1139 void FixedDurationPerformedIntervalVar::SetEndMax(int64_t m) {
1140 SetStartMax(
CapSub(m, duration_));
1143 void FixedDurationPerformedIntervalVar::SetEndRange(int64_t mi, int64_t ma) {
1144 SetStartRange(
CapSub(mi, duration_),
CapSub(ma, duration_));
1147 void FixedDurationPerformedIntervalVar::SetDurationRange(int64_t mi,
1149 if (mi > duration_ || ma < duration_ || mi > ma) {
1150 SetPerformed(
false);
1154 bool FixedDurationPerformedIntervalVar::MustBePerformed()
const {
return true; }
1156 bool FixedDurationPerformedIntervalVar::MayBePerformed()
const {
return true; }
1158 void FixedDurationPerformedIntervalVar::SetPerformed(
bool val) {
1164 void FixedDurationPerformedIntervalVar::Push() {
1170 std::string FixedDurationPerformedIntervalVar::DebugString()
const {
1172 const std::string& var_name =
name();
1173 if (!var_name.empty()) {
1174 out = var_name +
"(start = ";
1176 out =
"IntervalVar(start = ";
1178 absl::StrAppendFormat(&out,
"%s, duration = %d, performed = true)",
1179 start_.DebugString(), duration_);
1185 class StartVarPerformedIntervalVar :
public IntervalVar {
1187 StartVarPerformedIntervalVar(Solver*
const s, IntVar*
const var,
1188 int64_t duration,
const std::string&
name);
1189 ~StartVarPerformedIntervalVar()
override {}
1191 int64_t StartMin()
const override;
1192 int64_t StartMax()
const override;
1193 void SetStartMin(int64_t m)
override;
1194 void SetStartMax(int64_t m)
override;
1195 void SetStartRange(int64_t mi, int64_t ma)
override;
1196 int64_t OldStartMin()
const override {
return start_var_->OldMin(); }
1197 int64_t OldStartMax()
const override {
return start_var_->OldMax(); }
1198 void WhenStartRange(Demon*
const d)
override { start_var_->WhenRange(d); }
1199 void WhenStartBound(Demon*
const d)
override { start_var_->WhenBound(d); }
1201 int64_t DurationMin()
const override;
1202 int64_t DurationMax()
const override;
1203 void SetDurationMin(int64_t m)
override;
1204 void SetDurationMax(int64_t m)
override;
1205 void SetDurationRange(int64_t mi, int64_t ma)
override;
1206 int64_t OldDurationMin()
const override {
return duration_; }
1207 int64_t OldDurationMax()
const override {
return duration_; }
1208 void WhenDurationRange(Demon*
const d)
override {}
1209 void WhenDurationBound(Demon*
const d)
override {}
1211 int64_t EndMin()
const override;
1212 int64_t EndMax()
const override;
1213 void SetEndMin(int64_t m)
override;
1214 void SetEndMax(int64_t m)
override;
1215 void SetEndRange(int64_t mi, int64_t ma)
override;
1216 int64_t OldEndMin()
const override {
1217 return CapAdd(OldStartMin(), duration_);
1219 int64_t OldEndMax()
const override {
1220 return CapAdd(OldStartMax(), duration_);
1222 void WhenEndRange(Demon*
const d)
override { start_var_->WhenRange(d); }
1223 void WhenEndBound(Demon*
const d)
override { start_var_->WhenBound(d); }
1225 bool MustBePerformed()
const override;
1226 bool MayBePerformed()
const override;
1227 void SetPerformed(
bool val)
override;
1228 bool WasPerformedBound()
const override {
return true; }
1229 void WhenPerformedBound(Demon*
const d)
override {}
1230 std::string DebugString()
const override;
1232 IntExpr* StartExpr()
override {
return start_var_; }
1233 IntExpr* DurationExpr()
override {
return solver()->MakeIntConst(duration_); }
1234 IntExpr* EndExpr()
override {
1235 return solver()->MakeSum(start_var_, duration_);
1237 IntExpr* PerformedExpr()
override {
return solver()->MakeIntConst(1); }
1238 IntExpr* SafeStartExpr(int64_t unperformed_value)
override {
1241 IntExpr* SafeDurationExpr(int64_t unperformed_value)
override {
1242 return DurationExpr();
1244 IntExpr* SafeEndExpr(int64_t unperformed_value)
override {
return EndExpr(); }
1246 void Accept(ModelVisitor*
const visitor)
const override {
1247 visitor->VisitIntervalVariable(
this,
"", 0, NullInterval());
1251 IntVar*
const start_var_;
1256 StartVarPerformedIntervalVar::StartVarPerformedIntervalVar(
1257 Solver*
const s, IntVar*
const var, int64_t duration,
1258 const std::string&
name)
1259 : IntervalVar(s,
name), start_var_(
var), duration_(duration) {}
1261 int64_t StartVarPerformedIntervalVar::StartMin()
const {
1262 return start_var_->Min();
1265 int64_t StartVarPerformedIntervalVar::StartMax()
const {
1266 return start_var_->Max();
1269 void StartVarPerformedIntervalVar::SetStartMin(int64_t m) {
1270 start_var_->SetMin(m);
1273 void StartVarPerformedIntervalVar::SetStartMax(int64_t m) {
1274 start_var_->SetMax(m);
1277 void StartVarPerformedIntervalVar::SetStartRange(int64_t mi, int64_t ma) {
1278 start_var_->SetRange(mi, ma);
1281 int64_t StartVarPerformedIntervalVar::DurationMin()
const {
return duration_; }
1283 int64_t StartVarPerformedIntervalVar::DurationMax()
const {
return duration_; }
1285 void StartVarPerformedIntervalVar::SetDurationMin(int64_t m) {
1286 if (m > duration_) {
1291 void StartVarPerformedIntervalVar::SetDurationMax(int64_t m) {
1292 if (m < duration_) {
1296 int64_t StartVarPerformedIntervalVar::EndMin()
const {
1297 return start_var_->Min() + duration_;
1300 int64_t StartVarPerformedIntervalVar::EndMax()
const {
1301 return start_var_->Max() + duration_;
1304 void StartVarPerformedIntervalVar::SetEndMin(int64_t m) {
1305 SetStartMin(
CapSub(m, duration_));
1308 void StartVarPerformedIntervalVar::SetEndMax(int64_t m) {
1309 SetStartMax(
CapSub(m, duration_));
1312 void StartVarPerformedIntervalVar::SetEndRange(int64_t mi, int64_t ma) {
1313 SetStartRange(
CapSub(mi, duration_),
CapSub(ma, duration_));
1316 void StartVarPerformedIntervalVar::SetDurationRange(int64_t mi, int64_t ma) {
1317 if (mi > duration_ || ma < duration_ || mi > ma) {
1322 bool StartVarPerformedIntervalVar::MustBePerformed()
const {
return true; }
1324 bool StartVarPerformedIntervalVar::MayBePerformed()
const {
return true; }
1326 void StartVarPerformedIntervalVar::SetPerformed(
bool val) {
1332 std::string StartVarPerformedIntervalVar::DebugString()
const {
1334 const std::string& var_name =
name();
1335 if (!var_name.empty()) {
1336 out = var_name +
"(start = ";
1338 out =
"IntervalVar(start = ";
1340 absl::StrAppendFormat(&out,
"%d", start_var_->Min());
1341 if (!start_var_->Bound()) {
1342 absl::StrAppendFormat(&out,
" .. %d", start_var_->Max());
1345 absl::StrAppendFormat(&out,
", duration = %d, performed = true)", duration_);
1351 class StartVarIntervalVar :
public BaseIntervalVar {
1353 StartVarIntervalVar(Solver*
const s, IntVar*
const start, int64_t duration,
1355 ~StartVarIntervalVar()
override {}
1357 int64_t StartMin()
const override;
1358 int64_t StartMax()
const override;
1359 void SetStartMin(int64_t m)
override;
1360 void SetStartMax(int64_t m)
override;
1361 void SetStartRange(int64_t mi, int64_t ma)
override;
1362 int64_t OldStartMin()
const override {
return start_->OldMin(); }
1363 int64_t OldStartMax()
const override {
return start_->OldMax(); }
1364 void WhenStartRange(Demon*
const d)
override {
1365 if (performed_->Max() == 1) {
1366 start_->WhenRange(d);
1369 void WhenStartBound(Demon*
const d)
override {
1370 if (performed_->Max() == 1) {
1371 start_->WhenBound(d);
1375 int64_t DurationMin()
const override;
1376 int64_t DurationMax()
const override;
1377 void SetDurationMin(int64_t m)
override;
1378 void SetDurationMax(int64_t m)
override;
1379 void SetDurationRange(int64_t mi, int64_t ma)
override;
1380 int64_t OldDurationMin()
const override {
return duration_; }
1381 int64_t OldDurationMax()
const override {
return duration_; }
1382 void WhenDurationRange(Demon*
const d)
override {}
1383 void WhenDurationBound(Demon*
const d)
override {}
1385 int64_t EndMin()
const override;
1386 int64_t EndMax()
const override;
1387 void SetEndMin(int64_t m)
override;
1388 void SetEndMax(int64_t m)
override;
1389 void SetEndRange(int64_t mi, int64_t ma)
override;
1390 int64_t OldEndMin()
const override {
1391 return CapAdd(OldStartMin(), duration_);
1393 int64_t OldEndMax()
const override {
1394 return CapAdd(OldStartMax(), duration_);
1396 void WhenEndRange(Demon*
const d)
override { WhenStartRange(d); }
1397 void WhenEndBound(Demon*
const d)
override { WhenStartBound(d); }
1399 bool MustBePerformed()
const override;
1400 bool MayBePerformed()
const override;
1401 void SetPerformed(
bool val)
override;
1402 bool WasPerformedBound()
const override {
1403 return performed_->OldMin() == performed_->OldMax();
1405 void WhenPerformedBound(Demon*
const d)
override { performed_->WhenBound(d); }
1406 std::string DebugString()
const override;
1408 void Accept(ModelVisitor*
const visitor)
const override {
1409 visitor->VisitIntervalVariable(
this,
"", 0, NullInterval());
1412 IntExpr* StartExpr()
override {
return start_; }
1413 IntExpr* DurationExpr()
override {
return solver()->MakeIntConst(duration_); }
1414 IntExpr* EndExpr()
override {
1415 return solver()->MakeSum(StartExpr(), duration_);
1417 IntExpr* PerformedExpr()
override {
return performed_; }
1418 IntExpr* SafeStartExpr(int64_t unperformed_value)
override {
1421 IntExpr* SafeDurationExpr(int64_t unperformed_value)
override {
1424 IntExpr* SafeEndExpr(int64_t unperformed_value)
override {
1428 void Process()
override {
LOG(
FATAL) <<
"Should not be here"; }
1430 void Push()
override {
LOG(
FATAL) <<
"Should not be here"; }
1432 int64_t StoredMin()
const {
return start_min_.Value(); }
1433 int64_t StoredMax()
const {
return start_max_.Value(); }
1436 IntVar*
const start_;
1438 IntVar*
const performed_;
1439 Rev<int64_t> start_min_;
1440 Rev<int64_t> start_max_;
1443 StartVarIntervalVar::StartVarIntervalVar(Solver*
const s, IntVar*
const start,
1446 const std::string&
name)
1447 : BaseIntervalVar(s,
name),
1449 duration_(duration),
1451 start_min_(start->Min()),
1452 start_max_(start->Max()) {}
1454 int64_t StartVarIntervalVar::StartMin()
const {
1456 return std::max(start_->Min(), start_min_.Value());
1459 int64_t StartVarIntervalVar::StartMax()
const {
1461 return std::min(start_->Max(), start_max_.Value());
1464 void StartVarIntervalVar::SetStartMin(int64_t m) {
1465 if (performed_->Min() == 1) {
1468 start_min_.SetValue(solver(),
std::max(m, start_min_.Value()));
1469 if (start_min_.Value() >
std::min(start_max_.Value(), start_->Max())) {
1470 performed_->SetValue(0);
1475 void StartVarIntervalVar::SetStartMax(int64_t m) {
1476 if (performed_->Min() == 1) {
1479 start_max_.SetValue(solver(),
std::min(m, start_max_.Value()));
1480 if (start_max_.Value() <
std::max(start_min_.Value(), start_->Min())) {
1481 performed_->SetValue(0);
1486 void StartVarIntervalVar::SetStartRange(int64_t mi, int64_t ma) {
1487 if (performed_->Min() == 1) {
1488 start_->SetRange(mi, ma);
1490 start_min_.SetValue(solver(),
std::max(mi, start_min_.Value()));
1491 start_max_.SetValue(solver(),
std::min(ma, start_max_.Value()));
1492 if (
std::max(start_min_.Value(), start_->Min()) >
1493 std::min(start_max_.Value(), start_->Max())) {
1494 performed_->SetValue(0);
1499 int64_t StartVarIntervalVar::DurationMin()
const {
1504 int64_t StartVarIntervalVar::DurationMax()
const {
1509 void StartVarIntervalVar::SetDurationMin(int64_t m) {
1510 if (m > duration_) {
1511 SetPerformed(
false);
1515 void StartVarIntervalVar::SetDurationMax(int64_t m) {
1516 if (m < duration_) {
1517 SetPerformed(
false);
1521 void StartVarIntervalVar::SetDurationRange(int64_t mi, int64_t ma) {
1522 if (mi > duration_ || ma < duration_ || mi > ma) {
1523 SetPerformed(
false);
1527 int64_t StartVarIntervalVar::EndMin()
const {
1529 return CapAdd(StartMin(), duration_);
1532 int64_t StartVarIntervalVar::EndMax()
const {
1534 return CapAdd(StartMax(), duration_);
1537 void StartVarIntervalVar::SetEndMin(int64_t m) {
1538 SetStartMin(
CapSub(m, duration_));
1541 void StartVarIntervalVar::SetEndMax(int64_t m) {
1542 SetStartMax(
CapSub(m, duration_));
1545 void StartVarIntervalVar::SetEndRange(int64_t mi, int64_t ma) {
1546 SetStartRange(
CapSub(mi, duration_),
CapSub(ma, duration_));
1549 bool StartVarIntervalVar::MustBePerformed()
const {
1550 return (performed_->Min() == 1);
1553 bool StartVarIntervalVar::MayBePerformed()
const {
1554 return (performed_->Max() == 1);
1557 void StartVarIntervalVar::SetPerformed(
bool val) {
1558 const bool was_bound = performed_->Bound();
1559 performed_->SetValue(val);
1560 if (val && !was_bound) {
1561 start_->SetRange(start_min_.Value(), start_max_.Value());
1565 std::string StartVarIntervalVar::DebugString()
const {
1566 const std::string& var_name =
name();
1567 if (performed_->Max() == 0) {
1568 if (!var_name.empty()) {
1569 return absl::StrFormat(
"%s(performed = false)", var_name);
1571 return "IntervalVar(performed = false)";
1575 if (!var_name.empty()) {
1576 out = var_name +
"(start = ";
1578 out =
"IntervalVar(start = ";
1580 absl::StrAppendFormat(&out,
"%s, duration = %d, performed = %s)",
1581 start_->DebugString(), duration_,
1582 performed_->DebugString());
1587 class LinkStartVarIntervalVar :
public Constraint {
1589 LinkStartVarIntervalVar(Solver*
const solver,
1590 StartVarIntervalVar*
const interval,
1591 IntVar*
const start, IntVar*
const performed)
1592 : Constraint(solver),
1597 ~LinkStartVarIntervalVar()
override {}
1599 void Post()
override {
1601 solver(),
this, &LinkStartVarIntervalVar::PerformedBound,
1603 performed_->WhenBound(demon);
1606 void InitialPropagate()
override {
1607 if (performed_->Bound()) {
1612 void PerformedBound() {
1613 if (performed_->Min() == 1) {
1614 start_->SetRange(interval_->StoredMin(), interval_->StoredMax());
1619 StartVarIntervalVar*
const interval_;
1620 IntVar*
const start_;
1621 IntVar*
const performed_;
1626 class FixedInterval :
public IntervalVar {
1628 FixedInterval(Solver*
const s, int64_t start, int64_t duration,
1629 const std::string&
name);
1630 ~FixedInterval()
override {}
1632 int64_t StartMin()
const override {
return start_; }
1633 int64_t StartMax()
const override {
return start_; }
1634 void SetStartMin(int64_t m)
override;
1635 void SetStartMax(int64_t m)
override;
1636 void SetStartRange(int64_t mi, int64_t ma)
override;
1637 int64_t OldStartMin()
const override {
return start_; }
1638 int64_t OldStartMax()
const override {
return start_; }
1639 void WhenStartRange(Demon*
const d)
override {}
1640 void WhenStartBound(Demon*
const d)
override {}
1642 int64_t DurationMin()
const override {
return duration_; }
1643 int64_t DurationMax()
const override {
return duration_; }
1644 void SetDurationMin(int64_t m)
override;
1645 void SetDurationMax(int64_t m)
override;
1646 void SetDurationRange(int64_t mi, int64_t ma)
override;
1647 int64_t OldDurationMin()
const override {
return duration_; }
1648 int64_t OldDurationMax()
const override {
return duration_; }
1649 void WhenDurationRange(Demon*
const d)
override {}
1650 void WhenDurationBound(Demon*
const d)
override {}
1652 int64_t EndMin()
const override {
return start_ + duration_; }
1653 int64_t EndMax()
const override {
return start_ + duration_; }
1654 void SetEndMin(int64_t m)
override;
1655 void SetEndMax(int64_t m)
override;
1656 void SetEndRange(int64_t mi, int64_t ma)
override;
1657 int64_t OldEndMin()
const override {
return start_ + duration_; }
1658 int64_t OldEndMax()
const override {
return start_ + duration_; }
1659 void WhenEndRange(Demon*
const d)
override {}
1660 void WhenEndBound(Demon*
const d)
override {}
1662 bool MustBePerformed()
const override {
return true; }
1663 bool MayBePerformed()
const override {
return true; }
1664 void SetPerformed(
bool val)
override;
1665 bool WasPerformedBound()
const override {
return true; }
1666 void WhenPerformedBound(Demon*
const d)
override {}
1667 std::string DebugString()
const override;
1669 void Accept(ModelVisitor*
const visitor)
const override {
1670 visitor->VisitIntervalVariable(
this,
"", 0, NullInterval());
1673 IntExpr* StartExpr()
override {
return solver()->MakeIntConst(start_); }
1674 IntExpr* DurationExpr()
override {
return solver()->MakeIntConst(duration_); }
1675 IntExpr* EndExpr()
override {
1676 return solver()->MakeIntConst(start_ + duration_);
1678 IntExpr* PerformedExpr()
override {
return solver()->MakeIntConst(1); }
1679 IntExpr* SafeStartExpr(int64_t unperformed_value)
override {
1682 IntExpr* SafeDurationExpr(int64_t unperformed_value)
override {
1683 return DurationExpr();
1685 IntExpr* SafeEndExpr(int64_t unperformed_value)
override {
return EndExpr(); }
1688 const int64_t start_;
1689 const int64_t duration_;
1692 FixedInterval::FixedInterval(Solver*
const s, int64_t start, int64_t duration,
1693 const std::string&
name)
1694 : IntervalVar(s,
name), start_(start), duration_(duration) {}
1696 void FixedInterval::SetStartMin(int64_t m) {
1702 void FixedInterval::SetStartMax(int64_t m) {
1708 void FixedInterval::SetStartRange(int64_t mi, int64_t ma) {
1709 if (mi > start_ || ma < start_) {
1714 void FixedInterval::SetDurationMin(int64_t m) {
1715 if (m > duration_) {
1720 void FixedInterval::SetDurationMax(int64_t m) {
1721 if (m < duration_) {
1726 void FixedInterval::SetEndMin(int64_t m) {
1727 if (m > start_ + duration_) {
1732 void FixedInterval::SetEndMax(int64_t m) {
1733 if (m < start_ + duration_) {
1738 void FixedInterval::SetEndRange(int64_t mi, int64_t ma) {
1739 if (mi > start_ + duration_ || ma < start_ + duration_) {
1744 void FixedInterval::SetDurationRange(int64_t mi, int64_t ma) {
1745 if (mi > duration_ || ma < duration_) {
1750 void FixedInterval::SetPerformed(
bool val) {
1756 std::string FixedInterval::DebugString()
const {
1758 const std::string& var_name =
name();
1759 if (!var_name.empty()) {
1760 out = var_name +
"(start = ";
1762 out =
"IntervalVar(start = ";
1764 absl::StrAppendFormat(&out,
"%d, duration = %d, performed = true)", start_,
1771 class VariableDurationIntervalVar :
public BaseIntervalVar {
1773 VariableDurationIntervalVar(Solver*
const s, int64_t
start_min,
1774 int64_t
start_max, int64_t duration_min,
1775 int64_t duration_max, int64_t
end_min,
1776 int64_t
end_max,
bool optional,
1777 const std::string&
name)
1778 : BaseIntervalVar(s,
name),
1785 performed_(s, this, optional) {}
1787 ~VariableDurationIntervalVar()
override {}
1789 int64_t StartMin()
const override {
1791 return start_.Min();
1794 int64_t StartMax()
const override {
1796 return start_.Max();
1799 void SetStartMin(int64_t m)
override {
1800 if (performed_.Max() == 1) {
1805 void SetStartMax(int64_t m)
override {
1806 if (performed_.Max() == 1) {
1811 void SetStartRange(int64_t mi, int64_t ma)
override {
1812 if (performed_.Max() == 1) {
1813 start_.SetRange(mi, ma);
1817 int64_t OldStartMin()
const override {
1820 return start_.OldMin();
1823 int64_t OldStartMax()
const override {
1826 return start_.OldMax();
1829 void WhenStartRange(Demon*
const d)
override {
1830 if (performed_.Max() == 1) {
1831 start_.WhenRange(d);
1835 void WhenStartBound(Demon*
const d)
override {
1836 if (performed_.Max() == 1) {
1837 start_.WhenBound(d);
1841 int64_t DurationMin()
const override {
1843 return duration_.Min();
1846 int64_t DurationMax()
const override {
1848 return duration_.Max();
1851 void SetDurationMin(int64_t m)
override {
1852 if (performed_.Max() == 1) {
1853 duration_.SetMin(m);
1857 void SetDurationMax(int64_t m)
override {
1858 if (performed_.Max() == 1) {
1859 duration_.SetMax(m);
1863 void SetDurationRange(int64_t mi, int64_t ma)
override {
1864 if (performed_.Max() == 1) {
1865 duration_.SetRange(mi, ma);
1869 int64_t OldDurationMin()
const override {
1872 return duration_.OldMin();
1875 int64_t OldDurationMax()
const override {
1878 return duration_.OldMax();
1881 void WhenDurationRange(Demon*
const d)
override {
1882 if (performed_.Max() == 1) {
1883 duration_.WhenRange(d);
1887 void WhenDurationBound(Demon*
const d)
override {
1888 if (performed_.Max() == 1) {
1889 duration_.WhenBound(d);
1893 int64_t EndMin()
const override {
1898 int64_t EndMax()
const override {
1903 void SetEndMin(int64_t m)
override {
1904 if (performed_.Max() == 1) {
1909 void SetEndMax(int64_t m)
override {
1910 if (performed_.Max() == 1) {
1915 void SetEndRange(int64_t mi, int64_t ma)
override {
1916 if (performed_.Max() == 1) {
1917 end_.SetRange(mi, ma);
1921 int64_t OldEndMin()
const override {
1924 return end_.OldMin();
1927 int64_t OldEndMax()
const override {
1930 return end_.OldMax();
1933 void WhenEndRange(Demon*
const d)
override {
1934 if (performed_.Max() == 1) {
1939 void WhenEndBound(Demon*
const d)
override {
1940 if (performed_.Max() == 1) {
1945 bool MustBePerformed()
const override {
return (performed_.Min() == 1); }
1947 bool MayBePerformed()
const override {
return (performed_.Max() == 1); }
1949 void SetPerformed(
bool val)
override { performed_.SetValue(val); }
1951 bool WasPerformedBound()
const override {
1953 return performed_.OldMin() == performed_.OldMax();
1956 void WhenPerformedBound(Demon*
const d)
override { performed_.WhenBound(d); }
1958 void Process()
override {
1961 start_.UpdatePostponedBounds();
1962 duration_.UpdatePostponedBounds();
1963 end_.UpdatePostponedBounds();
1964 performed_.UpdatePostponedValue();
1966 if (performed_.Max() == 1) {
1967 start_.ProcessDemons();
1968 duration_.ProcessDemons();
1969 end_.ProcessDemons();
1971 performed_.Process();
1972 reset_action_on_fail();
1975 start_.UpdatePreviousBounds();
1976 start_.ApplyPostponedBounds(START);
1977 duration_.UpdatePreviousBounds();
1978 duration_.ApplyPostponedBounds(DURATION);
1979 end_.UpdatePreviousBounds();
1980 end_.ApplyPostponedBounds(END);
1981 performed_.UpdatePreviousValueAndApplyPostponedValue();
1984 std::string DebugString()
const override {
1985 const std::string& var_name =
name();
1986 if (performed_.Max() != 1) {
1987 if (!var_name.empty()) {
1988 return absl::StrFormat(
"%s(performed = false)", var_name);
1990 return "IntervalVar(performed = false)";
1994 if (!var_name.empty()) {
1995 out = var_name +
"(start = ";
1997 out =
"IntervalVar(start = ";
2000 absl::StrAppendFormat(&out,
2001 "%s, duration = %s, end = %s, performed = %s)",
2002 start_.DebugString(), duration_.DebugString(),
2003 end_.DebugString(), performed_.DebugString());
2008 void Accept(ModelVisitor*
const visitor)
const override {
2009 visitor->VisitIntervalVariable(
this,
"", 0, NullInterval());
2012 IntExpr* StartExpr()
override {
return &start_; }
2013 IntExpr* DurationExpr()
override {
return &duration_; }
2014 IntExpr* EndExpr()
override {
return &end_; }
2015 IntExpr* PerformedExpr()
override {
return &performed_; }
2016 IntExpr* SafeStartExpr(int64_t unperformed_value)
override {
2019 IntExpr* SafeDurationExpr(int64_t unperformed_value)
override {
2022 IntExpr* SafeEndExpr(int64_t unperformed_value)
override {
2027 void Push()
override {
2029 if (performed_.Max() == 1) {
2033 start_.SetRange(
CapSub(end_.Min(), duration_.Max()),
2034 CapSub(end_.Max(), duration_.Min()));
2035 duration_.SetRange(
CapSub(end_.Min(), start_.Max()),
2036 CapSub(end_.Max(), start_.Min()));
2037 end_.SetRange(
CapAdd(start_.Min(), duration_.Min()),
2038 CapAdd(start_.Max(), duration_.Max()));
2047 PerformedVar performed_;
2052 class FixedDurationSyncedIntervalVar :
public IntervalVar {
2054 FixedDurationSyncedIntervalVar(IntervalVar*
const t, int64_t duration,
2055 int64_t offset,
const std::string&
name)
2056 : IntervalVar(t->solver(),
name),
2058 duration_(duration),
2060 ~FixedDurationSyncedIntervalVar()
override {}
2061 int64_t DurationMin()
const override {
return duration_; }
2062 int64_t DurationMax()
const override {
return duration_; }
2063 void SetDurationMin(int64_t m)
override {
2064 if (m > duration_) {
2068 void SetDurationMax(int64_t m)
override {
2069 if (m < duration_) {
2073 void SetDurationRange(int64_t mi, int64_t ma)
override {
2074 if (mi > duration_ || ma < duration_ || mi > ma) {
2078 int64_t OldDurationMin()
const override {
return duration_; }
2079 int64_t OldDurationMax()
const override {
return duration_; }
2080 void WhenDurationRange(Demon*
const d)
override {}
2081 void WhenDurationBound(Demon*
const d)
override {}
2082 int64_t EndMin()
const override {
return CapAdd(StartMin(), duration_); }
2083 int64_t EndMax()
const override {
return CapAdd(StartMax(), duration_); }
2084 void SetEndMin(int64_t m)
override { SetStartMin(
CapSub(m, duration_)); }
2085 void SetEndMax(int64_t m)
override { SetStartMax(
CapSub(m, duration_)); }
2086 void SetEndRange(int64_t mi, int64_t ma)
override {
2087 SetStartRange(
CapSub(mi, duration_),
CapSub(ma, duration_));
2089 int64_t OldEndMin()
const override {
2090 return CapAdd(OldStartMin(), duration_);
2092 int64_t OldEndMax()
const override {
2093 return CapAdd(OldStartMax(), duration_);
2095 void WhenEndRange(Demon*
const d)
override { WhenStartRange(d); }
2096 void WhenEndBound(Demon*
const d)
override { WhenStartBound(d); }
2097 bool MustBePerformed()
const override {
return t_->MustBePerformed(); }
2098 bool MayBePerformed()
const override {
return t_->MayBePerformed(); }
2099 void SetPerformed(
bool val)
override { t_->SetPerformed(val); }
2100 bool WasPerformedBound()
const override {
return t_->WasPerformedBound(); }
2101 void WhenPerformedBound(Demon*
const d)
override {
2102 t_->WhenPerformedBound(d);
2106 IntervalVar*
const t_;
2107 const int64_t duration_;
2116 class FixedDurationIntervalVarStartSyncedOnStart
2117 :
public FixedDurationSyncedIntervalVar {
2119 FixedDurationIntervalVarStartSyncedOnStart(IntervalVar*
const t,
2120 int64_t duration, int64_t offset)
2121 : FixedDurationSyncedIntervalVar(
2122 t, duration, offset,
2124 "IntervalStartSyncedOnStart(%s, duration = %d, offset = %d)",
2125 t->
name(), duration, offset)) {}
2126 ~FixedDurationIntervalVarStartSyncedOnStart()
override {}
2127 int64_t StartMin()
const override {
return CapAdd(t_->StartMin(),
offset_); }
2128 int64_t StartMax()
const override {
return CapAdd(t_->StartMax(),
offset_); }
2129 void SetStartMin(int64_t m)
override { t_->SetStartMin(
CapSub(m,
offset_)); }
2130 void SetStartMax(int64_t m)
override { t_->SetStartMax(
CapSub(m,
offset_)); }
2131 void SetStartRange(int64_t mi, int64_t ma)
override {
2134 int64_t OldStartMin()
const override {
2137 int64_t OldStartMax()
const override {
2140 void WhenStartRange(Demon*
const d)
override { t_->WhenStartRange(d); }
2141 void WhenStartBound(Demon*
const d)
override { t_->WhenStartBound(d); }
2142 IntExpr* StartExpr()
override {
2143 return solver()->MakeSum(t_->StartExpr(),
offset_);
2145 IntExpr* DurationExpr()
override {
return solver()->MakeIntConst(duration_); }
2146 IntExpr* EndExpr()
override {
2147 return solver()->MakeSum(t_->StartExpr(),
offset_ + duration_);
2149 IntExpr* PerformedExpr()
override {
return t_->PerformedExpr(); }
2153 IntExpr* SafeStartExpr(int64_t unperformed_value)
override {
2156 IntExpr* SafeDurationExpr(int64_t unperformed_value)
override {
2159 IntExpr* SafeEndExpr(int64_t unperformed_value)
override {
2162 void Accept(ModelVisitor*
const visitor)
const override {
2163 visitor->VisitIntervalVariable(
2164 this, ModelVisitor::kStartSyncOnStartOperation,
offset_, t_);
2166 std::string DebugString()
const override {
2167 return absl::StrFormat(
2168 "IntervalStartSyncedOnStart(%s, duration = %d, offset = %d)",
2169 t_->DebugString(), duration_,
offset_);
2175 class FixedDurationIntervalVarStartSyncedOnEnd
2176 :
public FixedDurationSyncedIntervalVar {
2178 FixedDurationIntervalVarStartSyncedOnEnd(IntervalVar*
const t,
2179 int64_t duration, int64_t offset)
2180 : FixedDurationSyncedIntervalVar(
2181 t, duration, offset,
2183 "IntervalStartSyncedOnEnd(%s, duration = %d, offset = %d)",
2184 t->
name(), duration, offset)) {}
2185 ~FixedDurationIntervalVarStartSyncedOnEnd()
override {}
2186 int64_t StartMin()
const override {
return CapAdd(t_->EndMin(),
offset_); }
2187 int64_t StartMax()
const override {
return CapAdd(t_->EndMax(),
offset_); }
2188 void SetStartMin(int64_t m)
override { t_->SetEndMin(
CapSub(m,
offset_)); }
2189 void SetStartMax(int64_t m)
override { t_->SetEndMax(
CapSub(m,
offset_)); }
2190 void SetStartRange(int64_t mi, int64_t ma)
override {
2193 int64_t OldStartMin()
const override {
2196 int64_t OldStartMax()
const override {
2199 void WhenStartRange(Demon*
const d)
override { t_->WhenEndRange(d); }
2200 void WhenStartBound(Demon*
const d)
override { t_->WhenEndBound(d); }
2201 IntExpr* StartExpr()
override {
2202 return solver()->MakeSum(t_->EndExpr(),
offset_);
2204 IntExpr* DurationExpr()
override {
return solver()->MakeIntConst(duration_); }
2205 IntExpr* EndExpr()
override {
2206 return solver()->MakeSum(t_->EndExpr(),
offset_ + duration_);
2208 IntExpr* PerformedExpr()
override {
return t_->PerformedExpr(); }
2212 IntExpr* SafeStartExpr(int64_t unperformed_value)
override {
2215 IntExpr* SafeDurationExpr(int64_t unperformed_value)
override {
2218 IntExpr* SafeEndExpr(int64_t unperformed_value)
override {
2222 void Accept(ModelVisitor*
const visitor)
const override {
2223 visitor->VisitIntervalVariable(
this, ModelVisitor::kStartSyncOnEndOperation,
2226 std::string DebugString()
const override {
2227 return absl::StrFormat(
2228 "IntervalStartSyncedOnEnd(%s, duration = %d, offset = %d)",
2229 t_->DebugString(), duration_,
offset_);
2237 return RegisterIntervalVar(
2238 RevAlloc(
new MirrorIntervalVar(
this, interval_var)));
2243 return interval_var;
2245 return RegisterIntervalVar(
2246 RevAlloc(
new IntervalVarRelaxedMax(interval_var)));
2252 return interval_var;
2254 return RegisterIntervalVar(
2255 RevAlloc(
new IntervalVarRelaxedMin(interval_var)));
2259 void IntervalVar::WhenAnything(
Demon*
const d) {
2261 WhenDurationRange(d);
2263 WhenPerformedBound(d);
2266 IntervalVar* Solver::MakeFixedInterval(int64_t start, int64_t duration,
2267 const std::string&
name) {
2268 return RevAlloc(
new FixedInterval(
this, start, duration,
name));
2275 const std::string&
name) {
2278 }
else if (!optional) {
2279 return RegisterIntervalVar(RevAlloc(
new FixedDurationPerformedIntervalVar(
2282 return RegisterIntervalVar(RevAlloc(
new FixedDurationIntervalVar(
2286 void Solver::MakeFixedDurationIntervalVarArray(
2288 bool optional,
const std::string&
name, std::vector<IntervalVar*>* array) {
2290 CHECK(array !=
nullptr);
2292 for (
int i = 0; i < count; ++i) {
2293 const std::string var_name = absl::StrCat(
name, i);
2294 array->push_back(MakeFixedDurationIntervalVar(
2301 const std::string&
name) {
2302 CHECK(start_variable !=
nullptr);
2304 return RegisterIntervalVar(RevAlloc(
2305 new StartVarPerformedIntervalVar(
this, start_variable, duration,
name)));
2311 IntVar*
const start_variable, int64_t duration,
2312 IntVar*
const performed_variable,
const std::string&
name) {
2313 CHECK(start_variable !=
nullptr);
2314 CHECK(performed_variable !=
nullptr);
2316 if (!performed_variable->
Bound()) {
2317 StartVarIntervalVar*
const interval =
2318 reinterpret_cast<StartVarIntervalVar*>(
2319 RegisterIntervalVar(RevAlloc(
new StartVarIntervalVar(
2320 this, start_variable, duration, performed_variable,
name))));
2321 AddConstraint(RevAlloc(
new LinkStartVarIntervalVar(
2322 this,
interval, start_variable, performed_variable)));
2324 }
else if (performed_variable->
Min() == 1) {
2325 return RegisterIntervalVar(RevAlloc(
new StartVarPerformedIntervalVar(
2326 this, start_variable, duration,
name)));
2331 void Solver::MakeFixedDurationIntervalVarArray(
2332 const std::vector<IntVar*>& start_variables, int64_t duration,
2333 const std::string&
name, std::vector<IntervalVar*>* array) {
2334 CHECK(array !=
nullptr);
2336 for (
int i = 0; i < start_variables.size(); ++i) {
2337 const std::string var_name = absl::StrCat(
name, i);
2339 MakeFixedDurationIntervalVar(start_variables[i], duration, var_name));
2345 void Solver::MakeFixedDurationIntervalVarArray(
2346 const std::vector<IntVar*>& start_variables,
2347 const std::vector<int64_t>& durations,
const std::string&
name,
2348 std::vector<IntervalVar*>* array) {
2349 CHECK(array !=
nullptr);
2350 CHECK_EQ(start_variables.size(), durations.size());
2352 for (
int i = 0; i < start_variables.size(); ++i) {
2353 const std::string var_name = absl::StrCat(
name, i);
2354 array->push_back(MakeFixedDurationIntervalVar(start_variables[i],
2355 durations[i], var_name));
2359 void Solver::MakeFixedDurationIntervalVarArray(
2360 const std::vector<IntVar*>& start_variables,
2361 const std::vector<int>& durations,
const std::string&
name,
2362 std::vector<IntervalVar*>* array) {
2363 CHECK(array !=
nullptr);
2364 CHECK_EQ(start_variables.size(), durations.size());
2366 for (
int i = 0; i < start_variables.size(); ++i) {
2367 const std::string var_name = absl::StrCat(
name, i);
2368 array->push_back(MakeFixedDurationIntervalVar(start_variables[i],
2369 durations[i], var_name));
2373 void Solver::MakeFixedDurationIntervalVarArray(
2374 const std::vector<IntVar*>& start_variables,
2375 const std::vector<int>& durations,
2376 const std::vector<IntVar*>& performed_variables,
const std::string&
name,
2377 std::vector<IntervalVar*>* array) {
2378 CHECK(array !=
nullptr);
2380 for (
int i = 0; i < start_variables.size(); ++i) {
2381 const std::string var_name = absl::StrCat(
name, i);
2382 array->push_back(MakeFixedDurationIntervalVar(
2383 start_variables[i], durations[i], performed_variables[i], var_name));
2387 void Solver::MakeFixedDurationIntervalVarArray(
2388 const std::vector<IntVar*>& start_variables,
2389 const std::vector<int64_t>& durations,
2390 const std::vector<IntVar*>& performed_variables,
const std::string&
name,
2391 std::vector<IntervalVar*>* array) {
2392 CHECK(array !=
nullptr);
2394 for (
int i = 0; i < start_variables.size(); ++i) {
2395 const std::string var_name = absl::StrCat(
name, i);
2396 array->push_back(MakeFixedDurationIntervalVar(
2397 start_variables[i], durations[i], performed_variables[i], var_name));
2404 int64_t duration_min, int64_t duration_max,
2406 bool optional,
const std::string&
name) {
2407 return RegisterIntervalVar(RevAlloc(
new VariableDurationIntervalVar(
2412 void Solver::MakeIntervalVarArray(
int count, int64_t
start_min,
2413 int64_t
start_max, int64_t duration_min,
2414 int64_t duration_max, int64_t
end_min,
2415 int64_t
end_max,
bool optional,
2416 const std::string&
name,
2417 std::vector<IntervalVar*>*
const array) {
2419 CHECK(array !=
nullptr);
2421 for (
int i = 0; i < count; ++i) {
2422 const std::string var_name = absl::StrCat(
name, i);
2431 IntervalVar*
const interval_var, int64_t duration, int64_t offset) {
2432 return RegisterIntervalVar(
2433 RevAlloc(
new FixedDurationIntervalVarStartSyncedOnStart(
2434 interval_var, duration, offset)));
2438 IntervalVar*
const interval_var, int64_t duration, int64_t offset) {
2439 return RegisterIntervalVar(
2440 RevAlloc(
new FixedDurationIntervalVarStartSyncedOnEnd(interval_var,
2441 duration, offset)));
2445 IntervalVar*
const interval_var, int64_t duration, int64_t offset) {
2446 return RegisterIntervalVar(
2447 RevAlloc(
new FixedDurationIntervalVarStartSyncedOnStart(
2448 interval_var, duration,
CapSub(offset, duration))));
2452 IntervalVar*
const interval_var, int64_t duration, int64_t offset) {
2453 return RegisterIntervalVar(
2454 RevAlloc(
new FixedDurationIntervalVarStartSyncedOnEnd(
2455 interval_var, duration,
CapSub(offset, duration))));
int64_t CapSub(int64_t x, int64_t y)
void LinkVarExpr(Solver *const s, IntExpr *const expr, IntVar *const var)
#define CHECK_GE(val1, val2)
IntExpr * BuildSafeEndExpr(IntervalVar *var, int64_t unperformed_value)
#define CHECK_GT(val1, val2)
void RegisterDemon(Solver *const solver, Demon *const demon, DemonProfiler *const monitor)
IntExpr * BuildStartExpr(IntervalVar *var)
A Demon is the base element of a propagation queue.
virtual int64_t Min() const =0
virtual bool Bound() const
Returns true if the min and the max of the expression are equal.
Interval variables are often used in scheduling.
Demon * MakeConstraintDemon0(Solver *const s, T *const ct, void(T::*method)(), const std::string &name)
static const int64_t kMinValidValue
The smallest acceptable value to be returned by StartMin()
VAR_PRIORITY is between DELAYED_PRIORITY and NORMAL_PRIORITY.
int64_t CapAdd(int64_t x, int64_t y)
#define DCHECK_NE(val1, val2)
IntExpr * BuildSafeDurationExpr(IntervalVar *var, int64_t unperformed_value)
static const int64_t kMaxValidValue
The largest acceptable value to be returned by EndMax()
std::function< void(Solver *)> Action
The class IntVar is a subset of IntExpr.
#define CHECK_EQ(val1, val2)
IntExpr * BuildEndExpr(IntervalVar *var)
IntExpr * BuildSafeStartExpr(IntervalVar *var, int64_t unperformed_value)
#define DCHECK(condition)
#define DCHECK_EQ(val1, val2)
static const char kMirrorOperation[]
Operations.
void InternalSaveBooleanVarValue(Solver *const solver, IntVar *const var)
DemonPriority
This enum represents the three possible priorities for a demon in the Solver queue.
static const char kRelaxedMaxOperation[]
Collection of objects used to extend the Constraint Solver library.
virtual bool MustBePerformed() const =0
These methods query, set, and watch the performed status of the interval var.
IntExpr * BuildDurationExpr(IntervalVar *var)
DELAYED_PRIORITY is the lowest priority: Demons will be processed after VAR_PRIORITY and NORMAL_PRIOR...
static const char kRelaxedMinOperation[]
#define DISALLOW_COPY_AND_ASSIGN(TypeName)