20 #include "absl/strings/str_cat.h"
21 #include "absl/strings/str_format.h"
30 #pragma warning(disable : 4351 4355 4804 4805)
46 void LinkVarExpr(Solver*
const s, IntExpr*
const expr, IntVar*
const var);
55 enum IntervalField { START, DURATION, END };
57 IntervalVar* NullInterval() {
return nullptr; }
60 class MirrorIntervalVar :
public IntervalVar {
62 MirrorIntervalVar(Solver*
const s, IntervalVar*
const t)
63 : IntervalVar(s,
"Mirror<" + t->
name() +
">"), t_(t) {}
64 ~MirrorIntervalVar()
override {}
68 int64_t StartMin()
const override {
return -t_->EndMax(); }
69 int64_t StartMax()
const override {
return -t_->EndMin(); }
70 void SetStartMin(int64_t m)
override { t_->SetEndMax(-m); }
71 void SetStartMax(int64_t m)
override { t_->SetEndMin(-m); }
72 void SetStartRange(int64_t mi, int64_t ma)
override {
73 t_->SetEndRange(-ma, -mi);
75 int64_t OldStartMin()
const override {
return -t_->OldEndMax(); }
76 int64_t OldStartMax()
const override {
return -t_->OldEndMin(); }
77 void WhenStartRange(Demon*
const d)
override { t_->WhenEndRange(d); }
78 void WhenStartBound(Demon*
const d)
override { t_->WhenEndBound(d); }
81 int64_t DurationMin()
const override {
return t_->DurationMin(); }
82 int64_t DurationMax()
const override {
return t_->DurationMax(); }
83 void SetDurationMin(int64_t m)
override { t_->SetDurationMin(m); }
84 void SetDurationMax(int64_t m)
override { t_->SetDurationMax(m); }
85 void SetDurationRange(int64_t mi, int64_t ma)
override {
86 t_->SetDurationRange(mi, ma);
88 int64_t OldDurationMin()
const override {
return t_->OldDurationMin(); }
89 int64_t OldDurationMax()
const override {
return t_->OldDurationMax(); }
90 void WhenDurationRange(Demon*
const d)
override { t_->WhenDurationRange(d); }
91 void WhenDurationBound(Demon*
const d)
override { t_->WhenDurationBound(d); }
94 int64_t EndMin()
const override {
return -t_->StartMax(); }
95 int64_t EndMax()
const override {
return -t_->StartMin(); }
96 void SetEndMin(int64_t m)
override { t_->SetStartMax(-m); }
97 void SetEndMax(int64_t m)
override { t_->SetStartMin(-m); }
98 void SetEndRange(int64_t mi, int64_t ma)
override {
99 t_->SetStartRange(-ma, -mi);
101 int64_t OldEndMin()
const override {
return -t_->OldStartMax(); }
102 int64_t OldEndMax()
const override {
return -t_->OldStartMin(); }
103 void WhenEndRange(Demon*
const d)
override { t_->WhenStartRange(d); }
104 void WhenEndBound(Demon*
const d)
override { t_->WhenStartBound(d); }
108 bool MustBePerformed()
const override {
return t_->MustBePerformed(); }
109 bool MayBePerformed()
const override {
return t_->MayBePerformed(); }
110 void SetPerformed(
bool val)
override { t_->SetPerformed(val); }
111 bool WasPerformedBound()
const override {
return t_->WasPerformedBound(); }
112 void WhenPerformedBound(Demon*
const d)
override {
113 t_->WhenPerformedBound(d);
116 void Accept(ModelVisitor*
const visitor)
const override {
120 std::string DebugString()
const override {
121 return absl::StrFormat(
"MirrorInterval(%s)", t_->DebugString());
124 IntExpr* StartExpr()
override {
125 return solver()->MakeOpposite(t_->EndExpr());
127 IntExpr* DurationExpr()
override {
return t_->DurationExpr(); }
128 IntExpr* EndExpr()
override {
129 return solver()->MakeOpposite(t_->StartExpr());
131 IntExpr* PerformedExpr()
override {
return t_->PerformedExpr(); }
135 IntExpr* SafeStartExpr(int64_t unperformed_value)
override {
136 return solver()->MakeOpposite(t_->SafeEndExpr(-unperformed_value));
138 IntExpr* SafeDurationExpr(int64_t unperformed_value)
override {
139 return t_->SafeDurationExpr(unperformed_value);
141 IntExpr* SafeEndExpr(int64_t unperformed_value)
override {
142 return solver()->MakeOpposite(t_->SafeStartExpr(-unperformed_value));
146 IntervalVar*
const t_;
166 class AlwaysPerformedIntervalVarWrapper :
public IntervalVar {
168 explicit AlwaysPerformedIntervalVarWrapper(IntervalVar*
const t)
169 : IntervalVar(t->solver(),
170 absl::StrFormat(
"AlwaysPerformed<%s>", t->
name())),
172 start_expr_(nullptr),
173 duration_expr_(nullptr),
174 end_expr_(nullptr) {}
176 ~AlwaysPerformedIntervalVarWrapper()
override {}
177 int64_t StartMin()
const override {
178 return MayUnderlyingBePerformed() ? t_->StartMin() : kMinValidValue;
180 int64_t StartMax()
const override {
181 return MayUnderlyingBePerformed() ? t_->StartMax() : kMaxValidValue;
183 void SetStartMin(int64_t m)
override { t_->SetStartMin(m); }
184 void SetStartMax(int64_t m)
override { t_->SetStartMax(m); }
185 void SetStartRange(int64_t mi, int64_t ma)
override {
186 t_->SetStartRange(mi, ma);
188 int64_t OldStartMin()
const override {
189 return MayUnderlyingBePerformed() ? t_->OldStartMin() : kMinValidValue;
191 int64_t OldStartMax()
const override {
192 return MayUnderlyingBePerformed() ? t_->OldStartMax() : kMaxValidValue;
194 void WhenStartRange(Demon*
const d)
override { t_->WhenStartRange(d); }
195 void WhenStartBound(Demon*
const d)
override { t_->WhenStartBound(d); }
196 int64_t DurationMin()
const override {
197 return MayUnderlyingBePerformed() ? t_->DurationMin() : 0LL;
199 int64_t DurationMax()
const override {
200 return MayUnderlyingBePerformed() ? t_->DurationMax() : 0LL;
202 void SetDurationMin(int64_t m)
override { t_->SetDurationMin(m); }
203 void SetDurationMax(int64_t m)
override { t_->SetDurationMax(m); }
204 void SetDurationRange(int64_t mi, int64_t ma)
override {
205 t_->SetDurationRange(mi, ma);
207 int64_t OldDurationMin()
const override {
208 return MayUnderlyingBePerformed() ? t_->OldDurationMin() : 0LL;
210 int64_t OldDurationMax()
const override {
211 return MayUnderlyingBePerformed() ? t_->OldDurationMax() : 0LL;
213 void WhenDurationRange(Demon*
const d)
override { t_->WhenDurationRange(d); }
214 void WhenDurationBound(Demon*
const d)
override { t_->WhenDurationBound(d); }
215 int64_t EndMin()
const override {
216 return MayUnderlyingBePerformed() ? t_->EndMin() : kMinValidValue;
218 int64_t EndMax()
const override {
219 return MayUnderlyingBePerformed() ? t_->EndMax() : kMaxValidValue;
221 void SetEndMin(int64_t m)
override { t_->SetEndMin(m); }
222 void SetEndMax(int64_t m)
override { t_->SetEndMax(m); }
223 void SetEndRange(int64_t mi, int64_t ma)
override { t_->SetEndRange(mi, ma); }
224 int64_t OldEndMin()
const override {
225 return MayUnderlyingBePerformed() ? t_->OldEndMin() : kMinValidValue;
227 int64_t OldEndMax()
const override {
228 return MayUnderlyingBePerformed() ? t_->OldEndMax() : kMaxValidValue;
230 void WhenEndRange(Demon*
const d)
override { t_->WhenEndRange(d); }
231 void WhenEndBound(Demon*
const d)
override { t_->WhenEndBound(d); }
232 bool MustBePerformed()
const override {
return true; }
233 bool MayBePerformed()
const override {
return true; }
234 void SetPerformed(
bool val)
override {
243 bool WasPerformedBound()
const override {
return true; }
244 void WhenPerformedBound(Demon*
const d)
override {
245 t_->WhenPerformedBound(d);
247 IntExpr* StartExpr()
override {
248 if (start_expr_ ==
nullptr) {
249 solver()->SaveValue(
reinterpret_cast<void**
>(&start_expr_));
254 IntExpr* DurationExpr()
override {
255 if (duration_expr_ ==
nullptr) {
256 solver()->SaveValue(
reinterpret_cast<void**
>(&duration_expr_));
259 return duration_expr_;
261 IntExpr* EndExpr()
override {
262 if (end_expr_ ==
nullptr) {
263 solver()->SaveValue(
reinterpret_cast<void**
>(&end_expr_));
268 IntExpr* PerformedExpr()
override {
return solver()->MakeIntConst(1); }
269 IntExpr* SafeStartExpr(int64_t unperformed_value)
override {
272 IntExpr* SafeDurationExpr(int64_t unperformed_value)
override {
273 return DurationExpr();
275 IntExpr* SafeEndExpr(int64_t unperformed_value)
override {
return EndExpr(); }
278 IntervalVar*
const underlying()
const {
return t_; }
279 bool MayUnderlyingBePerformed()
const {
280 return underlying()->MayBePerformed();
284 IntervalVar*
const t_;
285 IntExpr* start_expr_;
286 IntExpr* duration_expr_;
304 class IntervalVarRelaxedMax :
public AlwaysPerformedIntervalVarWrapper {
306 explicit IntervalVarRelaxedMax(IntervalVar*
const t)
307 : AlwaysPerformedIntervalVarWrapper(t) {}
308 ~IntervalVarRelaxedMax()
override {}
309 int64_t StartMax()
const override {
311 return underlying()->MustBePerformed() ? underlying()->StartMax()
312 : (kMaxValidValue - DurationMin());
314 void SetStartMax(int64_t m)
override {
316 <<
"Calling SetStartMax on a IntervalVarRelaxedMax is not supported, "
317 <<
"as it seems there is no legitimate use case.";
319 int64_t EndMax()
const override {
320 return underlying()->MustBePerformed() ? underlying()->EndMax()
323 void SetEndMax(int64_t m)
override {
325 <<
"Calling SetEndMax on a IntervalVarRelaxedMax is not supported, "
326 <<
"as it seems there is no legitimate use case.";
329 void Accept(ModelVisitor*
const visitor)
const override {
334 std::string DebugString()
const override {
335 return absl::StrFormat(
"IntervalVarRelaxedMax(%s)",
336 underlying()->DebugString());
354 class IntervalVarRelaxedMin :
public AlwaysPerformedIntervalVarWrapper {
356 explicit IntervalVarRelaxedMin(IntervalVar*
const t)
357 : AlwaysPerformedIntervalVarWrapper(t) {}
358 ~IntervalVarRelaxedMin()
override {}
359 int64_t StartMin()
const override {
360 return underlying()->MustBePerformed() ? underlying()->StartMin()
363 void SetStartMin(int64_t m)
override {
365 <<
"Calling SetStartMin on a IntervalVarRelaxedMin is not supported, "
366 <<
"as it seems there is no legitimate use case.";
368 int64_t EndMin()
const override {
370 return underlying()->MustBePerformed() ? underlying()->EndMin()
371 : (kMinValidValue + DurationMin());
373 void SetEndMin(int64_t m)
override {
375 <<
"Calling SetEndMin on a IntervalVarRelaxedMin is not supported, "
376 <<
"as it seems there is no legitimate use case.";
379 void Accept(ModelVisitor*
const visitor)
const override {
384 std::string DebugString()
const override {
385 return absl::StrFormat(
"IntervalVarRelaxedMin(%s)",
386 underlying()->DebugString());
392 class BaseIntervalVar :
public IntervalVar {
394 class Handler :
public Demon {
396 explicit Handler(BaseIntervalVar*
const var) : var_(
var) {}
397 ~Handler()
override {}
398 void Run(Solver*
const s)
override { var_->Process(); }
402 std::string DebugString()
const override {
403 return absl::StrFormat(
"Handler(%s)", var_->DebugString());
407 BaseIntervalVar*
const var_;
410 BaseIntervalVar(Solver*
const s,
const std::string&
name)
411 : IntervalVar(s,
name),
414 cleaner_([this](Solver* s) { CleanInProcess(); }) {}
416 ~BaseIntervalVar()
override {}
418 virtual void Process() = 0;
420 virtual void Push() = 0;
424 std::string BaseName()
const override {
return "IntervalVar"; }
434 class RangeVar :
public IntExpr {
436 RangeVar(Solver*
const s, BaseIntervalVar*
var, int64_t mi, int64_t ma)
445 cast_var_(
nullptr) {}
447 ~RangeVar()
override {}
449 bool Bound()
const override {
return min_.Value() == max_.Value(); }
451 int64_t Min()
const override {
return min_.Value(); }
453 int64_t Max()
const override {
return max_.Value(); }
455 void SetMin(int64_t m)
override {
457 if (m <= min_.Value()) {
461 if (m > max_.Value()) {
462 var_->SetPerformed(
false);
465 if (var_->InProcess()) {
467 if (m > postponed_max_) {
468 var_->SetPerformed(
false);
470 if (m > postponed_min_) {
475 SyncPreviousBounds();
476 min_.SetValue(solver(), m);
481 int64_t OldMin()
const {
482 DCHECK(var_->InProcess());
483 return previous_min_;
486 void SetMax(int64_t m)
override {
487 if (m >= max_.Value()) {
490 if (m < min_.Value()) {
491 var_->SetPerformed(
false);
494 if (var_->InProcess()) {
496 if (m < postponed_min_) {
497 var_->SetPerformed(
false);
499 if (m < postponed_max_) {
504 SyncPreviousBounds();
505 max_.SetValue(solver(), m);
510 int64_t OldMax()
const {
return previous_min_; }
512 void SetRange(int64_t mi, int64_t ma)
override {
513 if (mi <= min_.Value() && ma >= max_.Value()) {
517 if (mi > max_.Value() || ma < min_.Value() || mi > ma) {
518 var_->SetPerformed(
false);
520 if (var_->InProcess()) {
521 if (mi > postponed_max_ || ma < postponed_min_) {
522 var_->SetPerformed(
false);
524 if (mi > postponed_min_) {
527 if (ma < postponed_max_) {
532 SyncPreviousBounds();
533 if (mi > min_.Value()) {
534 min_.SetValue(solver(), mi);
536 if (ma < max_.Value()) {
537 max_.SetValue(solver(), ma);
543 void WhenRange(Demon*
const demon)
override {
546 delayed_range_demons_.PushIfNotTop(solver(),
549 range_demons_.PushIfNotTop(solver(), solver()->
RegisterDemon(demon));
554 virtual void WhenBound(Demon*
const demon) {
557 delayed_bound_demons_.PushIfNotTop(solver(),
560 bound_demons_.PushIfNotTop(solver(), solver()->
RegisterDemon(demon));
565 void UpdatePostponedBounds() {
566 postponed_min_ = min_.Value();
567 postponed_max_ = max_.Value();
570 void ProcessDemons() {
572 ExecuteAll(bound_demons_);
573 EnqueueAll(delayed_bound_demons_);
575 if (min_.Value() != previous_min_ || max_.Value() != previous_max_) {
576 ExecuteAll(range_demons_);
577 EnqueueAll(delayed_range_demons_);
581 void UpdatePreviousBounds() {
582 previous_min_ = min_.Value();
583 previous_max_ = max_.Value();
587 void ApplyPostponedBounds(IntervalField which) {
588 if (min_.Value() < postponed_min_ || max_.Value() > postponed_max_) {
591 var_->SetStartRange(
std::max(postponed_min_, min_.Value()),
592 std::min(postponed_max_, max_.Value()));
595 var_->SetDurationRange(
std::max(postponed_min_, min_.Value()),
596 std::min(postponed_max_, max_.Value()));
599 var_->SetEndRange(
std::max(postponed_min_, min_.Value()),
600 std::min(postponed_max_, max_.Value()));
606 IntVar* Var()
override {
607 if (cast_var_ ==
nullptr) {
608 solver()->SaveValue(
reinterpret_cast<void**
>(&cast_var_));
609 cast_var_ = solver()->MakeIntVar(min_.Value(), max_.Value());
615 std::string DebugString()
const override {
616 std::string out = absl::StrCat(min_.Value());
618 absl::StrAppendFormat(&out,
" .. %d", max_.Value());
630 void SyncPreviousBounds() {
631 if (previous_min_ > min_.Value()) {
632 previous_min_ = min_.Value();
634 if (previous_max_ < max_.Value()) {
635 previous_max_ = max_.Value();
640 NumericalRev<int64_t> min_;
641 NumericalRev<int64_t> max_;
642 BaseIntervalVar*
const var_;
645 int64_t postponed_min_;
646 int64_t postponed_max_;
649 int64_t previous_min_;
650 int64_t previous_max_;
652 SimpleRevFIFO<Demon*> bound_demons_;
653 SimpleRevFIFO<Demon*> delayed_bound_demons_;
655 SimpleRevFIFO<Demon*> range_demons_;
656 SimpleRevFIFO<Demon*> delayed_range_demons_;
662 class PerformedVar :
public BooleanVar {
665 PerformedVar(Solver*
const s, BaseIntervalVar*
const var,
bool optional)
668 previous_value_(optional ? kUnboundBooleanVarValue : 1),
669 postponed_value_(optional ? kUnboundBooleanVarValue : 1) {
675 PerformedVar(Solver*
const s, BaseIntervalVar*
var)
676 : BooleanVar(s,
""), var_(
var), previous_value_(0), postponed_value_(0) {
680 ~PerformedVar()
override {}
682 void SetValue(int64_t v)
override {
683 if ((v & 0xfffffffffffffffe) != 0 ||
684 (value_ != kUnboundBooleanVarValue && v != value_)) {
687 if (var_->InProcess()) {
688 if (postponed_value_ != kUnboundBooleanVarValue &&
689 v != postponed_value_) {
692 postponed_value_ = v;
694 }
else if (value_ == kUnboundBooleanVarValue) {
695 previous_value_ = kUnboundBooleanVarValue;
697 value_ =
static_cast<int>(v);
702 int64_t OldMin()
const override {
return previous_value_ == 1; }
704 int64_t OldMax()
const override {
return previous_value_ != 0; }
706 void RestoreValue()
override {
707 previous_value_ = kUnboundBooleanVarValue;
708 value_ = kUnboundBooleanVarValue;
709 postponed_value_ = kUnboundBooleanVarValue;
713 if (previous_value_ != value_) {
714 ExecuteAll(bound_demons_);
715 EnqueueAll(delayed_bound_demons_);
719 void UpdatePostponedValue() { postponed_value_ = value_; }
721 void UpdatePreviousValueAndApplyPostponedValue() {
722 previous_value_ = value_;
723 if (value_ != postponed_value_) {
724 DCHECK_NE(kUnboundBooleanVarValue, postponed_value_);
725 SetValue(postponed_value_);
729 std::string DebugString()
const override {
741 BaseIntervalVar*
const var_;
743 int postponed_value_;
748 class FixedDurationIntervalVar :
public BaseIntervalVar {
750 FixedDurationIntervalVar(Solver*
const s, int64_t
start_min,
751 int64_t
start_max, int64_t duration,
bool optional,
752 const std::string&
name);
754 FixedDurationIntervalVar(Solver*
const s,
const std::string&
name);
755 ~FixedDurationIntervalVar()
override {}
757 int64_t StartMin()
const override;
758 int64_t StartMax()
const override;
759 void SetStartMin(int64_t m)
override;
760 void SetStartMax(int64_t m)
override;
761 void SetStartRange(int64_t mi, int64_t ma)
override;
762 int64_t OldStartMin()
const override {
return start_.OldMin(); }
763 int64_t OldStartMax()
const override {
return start_.OldMax(); }
764 void WhenStartRange(Demon*
const d)
override {
765 if (performed_.Max() == 1) {
769 void WhenStartBound(Demon*
const d)
override {
770 if (performed_.Max() == 1) {
775 int64_t DurationMin()
const override;
776 int64_t DurationMax()
const override;
777 void SetDurationMin(int64_t m)
override;
778 void SetDurationMax(int64_t m)
override;
779 void SetDurationRange(int64_t mi, int64_t ma)
override;
780 int64_t OldDurationMin()
const override {
return duration_; }
781 int64_t OldDurationMax()
const override {
return duration_; }
782 void WhenDurationRange(Demon*
const d)
override {}
783 void WhenDurationBound(Demon*
const d)
override {}
785 int64_t EndMin()
const override;
786 int64_t EndMax()
const override;
787 void SetEndMin(int64_t m)
override;
788 void SetEndMax(int64_t m)
override;
789 void SetEndRange(int64_t mi, int64_t ma)
override;
790 int64_t OldEndMin()
const override {
791 return CapAdd(OldStartMin(), duration_);
793 int64_t OldEndMax()
const override {
794 return CapAdd(OldStartMax(), duration_);
796 void WhenEndRange(Demon*
const d)
override { WhenStartRange(d); }
797 void WhenEndBound(Demon*
const d)
override { WhenStartBound(d); }
799 bool MustBePerformed()
const override;
800 bool MayBePerformed()
const override;
801 void SetPerformed(
bool val)
override;
802 bool WasPerformedBound()
const override {
803 return performed_.OldMin() == performed_.OldMax();
805 void WhenPerformedBound(Demon*
const d)
override { performed_.WhenBound(d); }
806 void Process()
override;
807 std::string DebugString()
const override;
809 void Accept(ModelVisitor*
const visitor)
const override {
810 visitor->VisitIntervalVariable(
this,
"", 0, NullInterval());
813 IntExpr* StartExpr()
override {
return &start_; }
814 IntExpr* DurationExpr()
override {
return solver()->MakeIntConst(duration_); }
815 IntExpr* EndExpr()
override {
816 return solver()->MakeSum(StartExpr(), duration_);
818 IntExpr* PerformedExpr()
override {
return &performed_; }
819 IntExpr* SafeStartExpr(int64_t unperformed_value)
override {
822 IntExpr* SafeDurationExpr(int64_t unperformed_value)
override {
825 IntExpr* SafeEndExpr(int64_t unperformed_value)
override {
829 void Push()
override;
834 PerformedVar performed_;
837 FixedDurationIntervalVar::FixedDurationIntervalVar(
839 bool optional,
const std::string&
name)
840 : BaseIntervalVar(s,
name),
843 performed_(s, this, optional) {}
845 FixedDurationIntervalVar::FixedDurationIntervalVar(Solver*
const s,
846 const std::string&
name)
847 : BaseIntervalVar(s,
name),
848 start_(s, this, 0, 0),
850 performed_(s, this) {}
852 void FixedDurationIntervalVar::Process() {
855 start_.UpdatePostponedBounds();
856 performed_.UpdatePostponedValue();
858 if (performed_.Max() == 1) {
859 start_.ProcessDemons();
861 performed_.Process();
862 reset_action_on_fail();
864 start_.UpdatePreviousBounds();
865 start_.ApplyPostponedBounds(START);
866 performed_.UpdatePreviousValueAndApplyPostponedValue();
869 int64_t FixedDurationIntervalVar::StartMin()
const {
870 CHECK_EQ(performed_.Max(), 1);
874 int64_t FixedDurationIntervalVar::StartMax()
const {
875 CHECK_EQ(performed_.Max(), 1);
879 void FixedDurationIntervalVar::SetStartMin(int64_t m) {
880 if (performed_.Max() == 1) {
885 void FixedDurationIntervalVar::SetStartMax(int64_t m) {
886 if (performed_.Max() == 1) {
891 void FixedDurationIntervalVar::SetStartRange(int64_t mi, int64_t ma) {
892 if (performed_.Max() == 1) {
893 start_.SetRange(mi, ma);
897 int64_t FixedDurationIntervalVar::DurationMin()
const {
898 CHECK_EQ(performed_.Max(), 1);
902 int64_t FixedDurationIntervalVar::DurationMax()
const {
903 CHECK_EQ(performed_.Max(), 1);
907 void FixedDurationIntervalVar::SetDurationMin(int64_t m) {
913 void FixedDurationIntervalVar::SetDurationMax(int64_t m) {
919 void FixedDurationIntervalVar::SetDurationRange(int64_t mi, int64_t ma) {
920 if (mi > duration_ || ma < duration_ || mi > ma) {
925 int64_t FixedDurationIntervalVar::EndMin()
const {
926 CHECK_EQ(performed_.Max(), 1);
927 return start_.Min() + duration_;
930 int64_t FixedDurationIntervalVar::EndMax()
const {
931 CHECK_EQ(performed_.Max(), 1);
932 return CapAdd(start_.Max(), duration_);
935 void FixedDurationIntervalVar::SetEndMin(int64_t m) {
936 SetStartMin(
CapSub(m, duration_));
939 void FixedDurationIntervalVar::SetEndMax(int64_t m) {
940 SetStartMax(
CapSub(m, duration_));
943 void FixedDurationIntervalVar::SetEndRange(int64_t mi, int64_t ma) {
944 SetStartRange(
CapSub(mi, duration_),
CapSub(ma, duration_));
947 bool FixedDurationIntervalVar::MustBePerformed()
const {
948 return (performed_.Min() == 1);
951 bool FixedDurationIntervalVar::MayBePerformed()
const {
952 return (performed_.Max() == 1);
955 void FixedDurationIntervalVar::SetPerformed(
bool val) {
956 performed_.SetValue(val);
959 void FixedDurationIntervalVar::Push() {
965 std::string FixedDurationIntervalVar::DebugString()
const {
966 const std::string& var_name =
name();
967 if (performed_.Max() == 0) {
968 if (!var_name.empty()) {
969 return absl::StrFormat(
"%s(performed = false)", var_name);
971 return "IntervalVar(performed = false)";
975 if (!var_name.empty()) {
976 out = var_name +
"(start = ";
978 out =
"IntervalVar(start = ";
980 absl::StrAppendFormat(&out,
"%s, duration = %d, performed = %s)",
981 start_.DebugString(), duration_,
982 performed_.DebugString());
989 class FixedDurationPerformedIntervalVar :
public BaseIntervalVar {
991 FixedDurationPerformedIntervalVar(Solver*
const s, int64_t
start_min,
993 const std::string&
name);
995 FixedDurationPerformedIntervalVar(Solver*
const s,
const std::string&
name);
996 ~FixedDurationPerformedIntervalVar()
override {}
998 int64_t StartMin()
const override;
999 int64_t StartMax()
const override;
1000 void SetStartMin(int64_t m)
override;
1001 void SetStartMax(int64_t m)
override;
1002 void SetStartRange(int64_t mi, int64_t ma)
override;
1003 int64_t OldStartMin()
const override {
return start_.OldMin(); }
1004 int64_t OldStartMax()
const override {
return start_.OldMax(); }
1005 void WhenStartRange(Demon*
const d)
override { start_.WhenRange(d); }
1006 void WhenStartBound(Demon*
const d)
override { start_.WhenBound(d); }
1008 int64_t DurationMin()
const override;
1009 int64_t DurationMax()
const override;
1010 void SetDurationMin(int64_t m)
override;
1011 void SetDurationMax(int64_t m)
override;
1012 void SetDurationRange(int64_t mi, int64_t ma)
override;
1013 int64_t OldDurationMin()
const override {
return duration_; }
1014 int64_t OldDurationMax()
const override {
return duration_; }
1015 void WhenDurationRange(Demon*
const d)
override {}
1016 void WhenDurationBound(Demon*
const d)
override {}
1018 int64_t EndMin()
const override;
1019 int64_t EndMax()
const override;
1020 void SetEndMin(int64_t m)
override;
1021 void SetEndMax(int64_t m)
override;
1022 void SetEndRange(int64_t mi, int64_t ma)
override;
1023 int64_t OldEndMin()
const override {
1024 return CapAdd(OldStartMin(), duration_);
1026 int64_t OldEndMax()
const override {
1027 return CapAdd(OldStartMax(), duration_);
1029 void WhenEndRange(Demon*
const d)
override { WhenStartRange(d); }
1030 void WhenEndBound(Demon*
const d)
override { WhenEndRange(d); }
1032 bool MustBePerformed()
const override;
1033 bool MayBePerformed()
const override;
1034 void SetPerformed(
bool val)
override;
1035 bool WasPerformedBound()
const override {
return true; }
1036 void WhenPerformedBound(Demon*
const d)
override {}
1037 void Process()
override;
1038 std::string DebugString()
const override;
1040 void Accept(ModelVisitor*
const visitor)
const override {
1041 visitor->VisitIntervalVariable(
this,
"", 0, NullInterval());
1044 IntExpr* StartExpr()
override {
return &start_; }
1045 IntExpr* DurationExpr()
override {
return solver()->MakeIntConst(duration_); }
1046 IntExpr* EndExpr()
override {
1047 return solver()->MakeSum(StartExpr(), duration_);
1049 IntExpr* PerformedExpr()
override {
return solver()->MakeIntConst(1); }
1050 IntExpr* SafeStartExpr(int64_t unperformed_value)
override {
1053 IntExpr* SafeDurationExpr(int64_t unperformed_value)
override {
1054 return DurationExpr();
1056 IntExpr* SafeEndExpr(int64_t unperformed_value)
override {
return EndExpr(); }
1059 void CheckOldPerformed() {}
1060 void Push()
override;
1066 FixedDurationPerformedIntervalVar::FixedDurationPerformedIntervalVar(
1068 const std::string&
name)
1069 : BaseIntervalVar(s,
name),
1071 duration_(duration) {}
1073 FixedDurationPerformedIntervalVar::FixedDurationPerformedIntervalVar(
1074 Solver*
const s,
const std::string&
name)
1075 : BaseIntervalVar(s,
name), start_(s, this, 0, 0), duration_(0) {}
1077 void FixedDurationPerformedIntervalVar::Process() {
1080 start_.UpdatePostponedBounds();
1082 start_.ProcessDemons();
1083 reset_action_on_fail();
1085 start_.UpdatePreviousBounds();
1086 start_.ApplyPostponedBounds(START);
1089 int64_t FixedDurationPerformedIntervalVar::StartMin()
const {
1090 return start_.Min();
1093 int64_t FixedDurationPerformedIntervalVar::StartMax()
const {
1094 return start_.Max();
1097 void FixedDurationPerformedIntervalVar::SetStartMin(int64_t m) {
1101 void FixedDurationPerformedIntervalVar::SetStartMax(int64_t m) {
1105 void FixedDurationPerformedIntervalVar::SetStartRange(int64_t mi, int64_t ma) {
1106 start_.SetRange(mi, ma);
1109 int64_t FixedDurationPerformedIntervalVar::DurationMin()
const {
1113 int64_t FixedDurationPerformedIntervalVar::DurationMax()
const {
1117 void FixedDurationPerformedIntervalVar::SetDurationMin(int64_t m) {
1118 if (m > duration_) {
1119 SetPerformed(
false);
1123 void FixedDurationPerformedIntervalVar::SetDurationMax(int64_t m) {
1124 if (m < duration_) {
1125 SetPerformed(
false);
1128 int64_t FixedDurationPerformedIntervalVar::EndMin()
const {
1129 return CapAdd(start_.Min(), duration_);
1132 int64_t FixedDurationPerformedIntervalVar::EndMax()
const {
1133 return CapAdd(start_.Max(), duration_);
1136 void FixedDurationPerformedIntervalVar::SetEndMin(int64_t m) {
1137 SetStartMin(
CapSub(m, duration_));
1140 void FixedDurationPerformedIntervalVar::SetEndMax(int64_t m) {
1141 SetStartMax(
CapSub(m, duration_));
1144 void FixedDurationPerformedIntervalVar::SetEndRange(int64_t mi, int64_t ma) {
1145 SetStartRange(
CapSub(mi, duration_),
CapSub(ma, duration_));
1148 void FixedDurationPerformedIntervalVar::SetDurationRange(int64_t mi,
1150 if (mi > duration_ || ma < duration_ || mi > ma) {
1151 SetPerformed(
false);
1155 bool FixedDurationPerformedIntervalVar::MustBePerformed()
const {
return true; }
1157 bool FixedDurationPerformedIntervalVar::MayBePerformed()
const {
return true; }
1159 void FixedDurationPerformedIntervalVar::SetPerformed(
bool val) {
1165 void FixedDurationPerformedIntervalVar::Push() {
1171 std::string FixedDurationPerformedIntervalVar::DebugString()
const {
1173 const std::string& var_name =
name();
1174 if (!var_name.empty()) {
1175 out = var_name +
"(start = ";
1177 out =
"IntervalVar(start = ";
1179 absl::StrAppendFormat(&out,
"%s, duration = %d, performed = true)",
1180 start_.DebugString(), duration_);
1186 class StartVarPerformedIntervalVar :
public IntervalVar {
1188 StartVarPerformedIntervalVar(Solver*
const s, IntVar*
const var,
1189 int64_t duration,
const std::string&
name);
1190 ~StartVarPerformedIntervalVar()
override {}
1192 int64_t StartMin()
const override;
1193 int64_t StartMax()
const override;
1194 void SetStartMin(int64_t m)
override;
1195 void SetStartMax(int64_t m)
override;
1196 void SetStartRange(int64_t mi, int64_t ma)
override;
1197 int64_t OldStartMin()
const override {
return start_var_->OldMin(); }
1198 int64_t OldStartMax()
const override {
return start_var_->OldMax(); }
1199 void WhenStartRange(Demon*
const d)
override { start_var_->WhenRange(d); }
1200 void WhenStartBound(Demon*
const d)
override { start_var_->WhenBound(d); }
1202 int64_t DurationMin()
const override;
1203 int64_t DurationMax()
const override;
1204 void SetDurationMin(int64_t m)
override;
1205 void SetDurationMax(int64_t m)
override;
1206 void SetDurationRange(int64_t mi, int64_t ma)
override;
1207 int64_t OldDurationMin()
const override {
return duration_; }
1208 int64_t OldDurationMax()
const override {
return duration_; }
1209 void WhenDurationRange(Demon*
const d)
override {}
1210 void WhenDurationBound(Demon*
const d)
override {}
1212 int64_t EndMin()
const override;
1213 int64_t EndMax()
const override;
1214 void SetEndMin(int64_t m)
override;
1215 void SetEndMax(int64_t m)
override;
1216 void SetEndRange(int64_t mi, int64_t ma)
override;
1217 int64_t OldEndMin()
const override {
1218 return CapAdd(OldStartMin(), duration_);
1220 int64_t OldEndMax()
const override {
1221 return CapAdd(OldStartMax(), duration_);
1223 void WhenEndRange(Demon*
const d)
override { start_var_->WhenRange(d); }
1224 void WhenEndBound(Demon*
const d)
override { start_var_->WhenBound(d); }
1226 bool MustBePerformed()
const override;
1227 bool MayBePerformed()
const override;
1228 void SetPerformed(
bool val)
override;
1229 bool WasPerformedBound()
const override {
return true; }
1230 void WhenPerformedBound(Demon*
const d)
override {}
1231 std::string DebugString()
const override;
1233 IntExpr* StartExpr()
override {
return start_var_; }
1234 IntExpr* DurationExpr()
override {
return solver()->MakeIntConst(duration_); }
1235 IntExpr* EndExpr()
override {
1236 return solver()->MakeSum(start_var_, duration_);
1238 IntExpr* PerformedExpr()
override {
return solver()->MakeIntConst(1); }
1239 IntExpr* SafeStartExpr(int64_t unperformed_value)
override {
1242 IntExpr* SafeDurationExpr(int64_t unperformed_value)
override {
1243 return DurationExpr();
1245 IntExpr* SafeEndExpr(int64_t unperformed_value)
override {
return EndExpr(); }
1247 void Accept(ModelVisitor*
const visitor)
const override {
1248 visitor->VisitIntervalVariable(
this,
"", 0, NullInterval());
1252 IntVar*
const start_var_;
1257 StartVarPerformedIntervalVar::StartVarPerformedIntervalVar(
1258 Solver*
const s, IntVar*
const var, int64_t duration,
1259 const std::string&
name)
1260 : IntervalVar(s,
name), start_var_(
var), duration_(duration) {}
1262 int64_t StartVarPerformedIntervalVar::StartMin()
const {
1263 return start_var_->Min();
1266 int64_t StartVarPerformedIntervalVar::StartMax()
const {
1267 return start_var_->Max();
1270 void StartVarPerformedIntervalVar::SetStartMin(int64_t m) {
1271 start_var_->SetMin(m);
1274 void StartVarPerformedIntervalVar::SetStartMax(int64_t m) {
1275 start_var_->SetMax(m);
1278 void StartVarPerformedIntervalVar::SetStartRange(int64_t mi, int64_t ma) {
1279 start_var_->SetRange(mi, ma);
1282 int64_t StartVarPerformedIntervalVar::DurationMin()
const {
return duration_; }
1284 int64_t StartVarPerformedIntervalVar::DurationMax()
const {
return duration_; }
1286 void StartVarPerformedIntervalVar::SetDurationMin(int64_t m) {
1287 if (m > duration_) {
1292 void StartVarPerformedIntervalVar::SetDurationMax(int64_t m) {
1293 if (m < duration_) {
1297 int64_t StartVarPerformedIntervalVar::EndMin()
const {
1298 return start_var_->Min() + duration_;
1301 int64_t StartVarPerformedIntervalVar::EndMax()
const {
1302 return start_var_->Max() + duration_;
1305 void StartVarPerformedIntervalVar::SetEndMin(int64_t m) {
1306 SetStartMin(
CapSub(m, duration_));
1309 void StartVarPerformedIntervalVar::SetEndMax(int64_t m) {
1310 SetStartMax(
CapSub(m, duration_));
1313 void StartVarPerformedIntervalVar::SetEndRange(int64_t mi, int64_t ma) {
1314 SetStartRange(
CapSub(mi, duration_),
CapSub(ma, duration_));
1317 void StartVarPerformedIntervalVar::SetDurationRange(int64_t mi, int64_t ma) {
1318 if (mi > duration_ || ma < duration_ || mi > ma) {
1323 bool StartVarPerformedIntervalVar::MustBePerformed()
const {
return true; }
1325 bool StartVarPerformedIntervalVar::MayBePerformed()
const {
return true; }
1327 void StartVarPerformedIntervalVar::SetPerformed(
bool val) {
1333 std::string StartVarPerformedIntervalVar::DebugString()
const {
1335 const std::string& var_name =
name();
1336 if (!var_name.empty()) {
1337 out = var_name +
"(start = ";
1339 out =
"IntervalVar(start = ";
1341 absl::StrAppendFormat(&out,
"%d", start_var_->Min());
1342 if (!start_var_->Bound()) {
1343 absl::StrAppendFormat(&out,
" .. %d", start_var_->Max());
1346 absl::StrAppendFormat(&out,
", duration = %d, performed = true)", duration_);
1352 class StartVarIntervalVar :
public BaseIntervalVar {
1354 StartVarIntervalVar(Solver*
const s, IntVar*
const start, int64_t duration,
1356 ~StartVarIntervalVar()
override {}
1358 int64_t StartMin()
const override;
1359 int64_t StartMax()
const override;
1360 void SetStartMin(int64_t m)
override;
1361 void SetStartMax(int64_t m)
override;
1362 void SetStartRange(int64_t mi, int64_t ma)
override;
1363 int64_t OldStartMin()
const override {
return start_->OldMin(); }
1364 int64_t OldStartMax()
const override {
return start_->OldMax(); }
1365 void WhenStartRange(Demon*
const d)
override {
1366 if (performed_->Max() == 1) {
1367 start_->WhenRange(d);
1370 void WhenStartBound(Demon*
const d)
override {
1371 if (performed_->Max() == 1) {
1372 start_->WhenBound(d);
1376 int64_t DurationMin()
const override;
1377 int64_t DurationMax()
const override;
1378 void SetDurationMin(int64_t m)
override;
1379 void SetDurationMax(int64_t m)
override;
1380 void SetDurationRange(int64_t mi, int64_t ma)
override;
1381 int64_t OldDurationMin()
const override {
return duration_; }
1382 int64_t OldDurationMax()
const override {
return duration_; }
1383 void WhenDurationRange(Demon*
const d)
override {}
1384 void WhenDurationBound(Demon*
const d)
override {}
1386 int64_t EndMin()
const override;
1387 int64_t EndMax()
const override;
1388 void SetEndMin(int64_t m)
override;
1389 void SetEndMax(int64_t m)
override;
1390 void SetEndRange(int64_t mi, int64_t ma)
override;
1391 int64_t OldEndMin()
const override {
1392 return CapAdd(OldStartMin(), duration_);
1394 int64_t OldEndMax()
const override {
1395 return CapAdd(OldStartMax(), duration_);
1397 void WhenEndRange(Demon*
const d)
override { WhenStartRange(d); }
1398 void WhenEndBound(Demon*
const d)
override { WhenStartBound(d); }
1400 bool MustBePerformed()
const override;
1401 bool MayBePerformed()
const override;
1402 void SetPerformed(
bool val)
override;
1403 bool WasPerformedBound()
const override {
1404 return performed_->OldMin() == performed_->OldMax();
1406 void WhenPerformedBound(Demon*
const d)
override { performed_->WhenBound(d); }
1407 std::string DebugString()
const override;
1409 void Accept(ModelVisitor*
const visitor)
const override {
1410 visitor->VisitIntervalVariable(
this,
"", 0, NullInterval());
1413 IntExpr* StartExpr()
override {
return start_; }
1414 IntExpr* DurationExpr()
override {
return solver()->MakeIntConst(duration_); }
1415 IntExpr* EndExpr()
override {
1416 return solver()->MakeSum(StartExpr(), duration_);
1418 IntExpr* PerformedExpr()
override {
return performed_; }
1419 IntExpr* SafeStartExpr(int64_t unperformed_value)
override {
1422 IntExpr* SafeDurationExpr(int64_t unperformed_value)
override {
1425 IntExpr* SafeEndExpr(int64_t unperformed_value)
override {
1429 void Process()
override { LOG(FATAL) <<
"Should not be here"; }
1431 void Push()
override { LOG(FATAL) <<
"Should not be here"; }
1433 int64_t StoredMin()
const {
return start_min_.Value(); }
1434 int64_t StoredMax()
const {
return start_max_.Value(); }
1437 IntVar*
const start_;
1439 IntVar*
const performed_;
1440 Rev<int64_t> start_min_;
1441 Rev<int64_t> start_max_;
1444 StartVarIntervalVar::StartVarIntervalVar(Solver*
const s, IntVar*
const start,
1447 const std::string&
name)
1448 : BaseIntervalVar(s,
name),
1450 duration_(duration),
1452 start_min_(
start->Min()),
1453 start_max_(
start->Max()) {}
1455 int64_t StartVarIntervalVar::StartMin()
const {
1456 DCHECK_EQ(performed_->Max(), 1);
1457 return std::max(start_->Min(), start_min_.Value());
1460 int64_t StartVarIntervalVar::StartMax()
const {
1461 DCHECK_EQ(performed_->Max(), 1);
1462 return std::min(start_->Max(), start_max_.Value());
1465 void StartVarIntervalVar::SetStartMin(int64_t m) {
1466 if (performed_->Min() == 1) {
1469 start_min_.SetValue(solver(),
std::max(m, start_min_.Value()));
1470 if (start_min_.Value() >
std::min(start_max_.Value(), start_->Max())) {
1471 performed_->SetValue(0);
1476 void StartVarIntervalVar::SetStartMax(int64_t m) {
1477 if (performed_->Min() == 1) {
1480 start_max_.SetValue(solver(),
std::min(m, start_max_.Value()));
1481 if (start_max_.Value() <
std::max(start_min_.Value(), start_->Min())) {
1482 performed_->SetValue(0);
1487 void StartVarIntervalVar::SetStartRange(int64_t mi, int64_t ma) {
1488 if (performed_->Min() == 1) {
1489 start_->SetRange(mi, ma);
1491 start_min_.SetValue(solver(),
std::max(mi, start_min_.Value()));
1492 start_max_.SetValue(solver(),
std::min(ma, start_max_.Value()));
1493 if (
std::max(start_min_.Value(), start_->Min()) >
1494 std::min(start_max_.Value(), start_->Max())) {
1495 performed_->SetValue(0);
1500 int64_t StartVarIntervalVar::DurationMin()
const {
1501 DCHECK_EQ(performed_->Max(), 1);
1505 int64_t StartVarIntervalVar::DurationMax()
const {
1506 DCHECK_EQ(performed_->Max(), 1);
1510 void StartVarIntervalVar::SetDurationMin(int64_t m) {
1511 if (m > duration_) {
1512 SetPerformed(
false);
1516 void StartVarIntervalVar::SetDurationMax(int64_t m) {
1517 if (m < duration_) {
1518 SetPerformed(
false);
1522 void StartVarIntervalVar::SetDurationRange(int64_t mi, int64_t ma) {
1523 if (mi > duration_ || ma < duration_ || mi > ma) {
1524 SetPerformed(
false);
1528 int64_t StartVarIntervalVar::EndMin()
const {
1529 DCHECK_EQ(performed_->Max(), 1);
1530 return CapAdd(StartMin(), duration_);
1533 int64_t StartVarIntervalVar::EndMax()
const {
1534 DCHECK_EQ(performed_->Max(), 1);
1535 return CapAdd(StartMax(), duration_);
1538 void StartVarIntervalVar::SetEndMin(int64_t m) {
1539 SetStartMin(
CapSub(m, duration_));
1542 void StartVarIntervalVar::SetEndMax(int64_t m) {
1543 SetStartMax(
CapSub(m, duration_));
1546 void StartVarIntervalVar::SetEndRange(int64_t mi, int64_t ma) {
1547 SetStartRange(
CapSub(mi, duration_),
CapSub(ma, duration_));
1550 bool StartVarIntervalVar::MustBePerformed()
const {
1551 return (performed_->Min() == 1);
1554 bool StartVarIntervalVar::MayBePerformed()
const {
1555 return (performed_->Max() == 1);
1558 void StartVarIntervalVar::SetPerformed(
bool val) {
1559 const bool was_bound = performed_->Bound();
1560 performed_->SetValue(val);
1561 if (val && !was_bound) {
1562 start_->SetRange(start_min_.Value(), start_max_.Value());
1566 std::string StartVarIntervalVar::DebugString()
const {
1567 const std::string& var_name =
name();
1568 if (performed_->Max() == 0) {
1569 if (!var_name.empty()) {
1570 return absl::StrFormat(
"%s(performed = false)", var_name);
1572 return "IntervalVar(performed = false)";
1576 if (!var_name.empty()) {
1577 out = var_name +
"(start = ";
1579 out =
"IntervalVar(start = ";
1581 absl::StrAppendFormat(&out,
"%s, duration = %d, performed = %s)",
1582 start_->DebugString(), duration_,
1583 performed_->DebugString());
1588 class LinkStartVarIntervalVar :
public Constraint {
1590 LinkStartVarIntervalVar(Solver*
const solver,
1591 StartVarIntervalVar*
const interval,
1593 : Constraint(solver),
1598 ~LinkStartVarIntervalVar()
override {}
1600 void Post()
override {
1602 solver(),
this, &LinkStartVarIntervalVar::PerformedBound,
1604 performed_->WhenBound(demon);
1607 void InitialPropagate()
override {
1608 if (performed_->Bound()) {
1613 void PerformedBound() {
1614 if (performed_->Min() == 1) {
1615 start_->SetRange(interval_->StoredMin(), interval_->StoredMax());
1620 StartVarIntervalVar*
const interval_;
1621 IntVar*
const start_;
1622 IntVar*
const performed_;
1627 class FixedInterval :
public IntervalVar {
1629 FixedInterval(Solver*
const s, int64_t
start, int64_t duration,
1630 const std::string&
name);
1631 ~FixedInterval()
override {}
1633 int64_t StartMin()
const override {
return start_; }
1634 int64_t StartMax()
const override {
return start_; }
1635 void SetStartMin(int64_t m)
override;
1636 void SetStartMax(int64_t m)
override;
1637 void SetStartRange(int64_t mi, int64_t ma)
override;
1638 int64_t OldStartMin()
const override {
return start_; }
1639 int64_t OldStartMax()
const override {
return start_; }
1640 void WhenStartRange(Demon*
const d)
override {}
1641 void WhenStartBound(Demon*
const d)
override {}
1643 int64_t DurationMin()
const override {
return duration_; }
1644 int64_t DurationMax()
const override {
return duration_; }
1645 void SetDurationMin(int64_t m)
override;
1646 void SetDurationMax(int64_t m)
override;
1647 void SetDurationRange(int64_t mi, int64_t ma)
override;
1648 int64_t OldDurationMin()
const override {
return duration_; }
1649 int64_t OldDurationMax()
const override {
return duration_; }
1650 void WhenDurationRange(Demon*
const d)
override {}
1651 void WhenDurationBound(Demon*
const d)
override {}
1653 int64_t EndMin()
const override {
return start_ + duration_; }
1654 int64_t EndMax()
const override {
return start_ + duration_; }
1655 void SetEndMin(int64_t m)
override;
1656 void SetEndMax(int64_t m)
override;
1657 void SetEndRange(int64_t mi, int64_t ma)
override;
1658 int64_t OldEndMin()
const override {
return start_ + duration_; }
1659 int64_t OldEndMax()
const override {
return start_ + duration_; }
1660 void WhenEndRange(Demon*
const d)
override {}
1661 void WhenEndBound(Demon*
const d)
override {}
1663 bool MustBePerformed()
const override {
return true; }
1664 bool MayBePerformed()
const override {
return true; }
1665 void SetPerformed(
bool val)
override;
1666 bool WasPerformedBound()
const override {
return true; }
1667 void WhenPerformedBound(Demon*
const d)
override {}
1668 std::string DebugString()
const override;
1670 void Accept(ModelVisitor*
const visitor)
const override {
1671 visitor->VisitIntervalVariable(
this,
"", 0, NullInterval());
1674 IntExpr* StartExpr()
override {
return solver()->MakeIntConst(start_); }
1675 IntExpr* DurationExpr()
override {
return solver()->MakeIntConst(duration_); }
1676 IntExpr* EndExpr()
override {
1677 return solver()->MakeIntConst(start_ + duration_);
1679 IntExpr* PerformedExpr()
override {
return solver()->MakeIntConst(1); }
1680 IntExpr* SafeStartExpr(int64_t unperformed_value)
override {
1683 IntExpr* SafeDurationExpr(int64_t unperformed_value)
override {
1684 return DurationExpr();
1686 IntExpr* SafeEndExpr(int64_t unperformed_value)
override {
return EndExpr(); }
1689 const int64_t start_;
1690 const int64_t duration_;
1693 FixedInterval::FixedInterval(Solver*
const s, int64_t
start, int64_t duration,
1694 const std::string&
name)
1695 : IntervalVar(s,
name), start_(
start), duration_(duration) {}
1697 void FixedInterval::SetStartMin(int64_t m) {
1703 void FixedInterval::SetStartMax(int64_t m) {
1709 void FixedInterval::SetStartRange(int64_t mi, int64_t ma) {
1710 if (mi > start_ || ma < start_) {
1715 void FixedInterval::SetDurationMin(int64_t m) {
1716 if (m > duration_) {
1721 void FixedInterval::SetDurationMax(int64_t m) {
1722 if (m < duration_) {
1727 void FixedInterval::SetEndMin(int64_t m) {
1728 if (m > start_ + duration_) {
1733 void FixedInterval::SetEndMax(int64_t m) {
1734 if (m < start_ + duration_) {
1739 void FixedInterval::SetEndRange(int64_t mi, int64_t ma) {
1740 if (mi > start_ + duration_ || ma < start_ + duration_) {
1745 void FixedInterval::SetDurationRange(int64_t mi, int64_t ma) {
1746 if (mi > duration_ || ma < duration_) {
1751 void FixedInterval::SetPerformed(
bool val) {
1757 std::string FixedInterval::DebugString()
const {
1759 const std::string& var_name =
name();
1760 if (!var_name.empty()) {
1761 out = var_name +
"(start = ";
1763 out =
"IntervalVar(start = ";
1765 absl::StrAppendFormat(&out,
"%d, duration = %d, performed = true)", start_,
1772 class VariableDurationIntervalVar :
public BaseIntervalVar {
1774 VariableDurationIntervalVar(Solver*
const s, int64_t
start_min,
1775 int64_t
start_max, int64_t duration_min,
1776 int64_t duration_max, int64_t
end_min,
1777 int64_t
end_max,
bool optional,
1778 const std::string&
name)
1779 : BaseIntervalVar(s,
name),
1786 performed_(s, this, optional) {}
1788 ~VariableDurationIntervalVar()
override {}
1790 int64_t StartMin()
const override {
1791 CHECK_EQ(performed_.Max(), 1);
1792 return start_.Min();
1795 int64_t StartMax()
const override {
1796 CHECK_EQ(performed_.Max(), 1);
1797 return start_.Max();
1800 void SetStartMin(int64_t m)
override {
1801 if (performed_.Max() == 1) {
1806 void SetStartMax(int64_t m)
override {
1807 if (performed_.Max() == 1) {
1812 void SetStartRange(int64_t mi, int64_t ma)
override {
1813 if (performed_.Max() == 1) {
1814 start_.SetRange(mi, ma);
1818 int64_t OldStartMin()
const override {
1819 CHECK_EQ(performed_.Max(), 1);
1821 return start_.OldMin();
1824 int64_t OldStartMax()
const override {
1825 CHECK_EQ(performed_.Max(), 1);
1827 return start_.OldMax();
1830 void WhenStartRange(Demon*
const d)
override {
1831 if (performed_.Max() == 1) {
1832 start_.WhenRange(d);
1836 void WhenStartBound(Demon*
const d)
override {
1837 if (performed_.Max() == 1) {
1838 start_.WhenBound(d);
1842 int64_t DurationMin()
const override {
1843 CHECK_EQ(performed_.Max(), 1);
1844 return duration_.Min();
1847 int64_t DurationMax()
const override {
1848 CHECK_EQ(performed_.Max(), 1);
1849 return duration_.Max();
1852 void SetDurationMin(int64_t m)
override {
1853 if (performed_.Max() == 1) {
1854 duration_.SetMin(m);
1858 void SetDurationMax(int64_t m)
override {
1859 if (performed_.Max() == 1) {
1860 duration_.SetMax(m);
1864 void SetDurationRange(int64_t mi, int64_t ma)
override {
1865 if (performed_.Max() == 1) {
1866 duration_.SetRange(mi, ma);
1870 int64_t OldDurationMin()
const override {
1871 CHECK_EQ(performed_.Max(), 1);
1873 return duration_.OldMin();
1876 int64_t OldDurationMax()
const override {
1877 CHECK_EQ(performed_.Max(), 1);
1879 return duration_.OldMax();
1882 void WhenDurationRange(Demon*
const d)
override {
1883 if (performed_.Max() == 1) {
1884 duration_.WhenRange(d);
1888 void WhenDurationBound(Demon*
const d)
override {
1889 if (performed_.Max() == 1) {
1890 duration_.WhenBound(d);
1894 int64_t EndMin()
const override {
1895 CHECK_EQ(performed_.Max(), 1);
1899 int64_t EndMax()
const override {
1900 CHECK_EQ(performed_.Max(), 1);
1904 void SetEndMin(int64_t m)
override {
1905 if (performed_.Max() == 1) {
1910 void SetEndMax(int64_t m)
override {
1911 if (performed_.Max() == 1) {
1916 void SetEndRange(int64_t mi, int64_t ma)
override {
1917 if (performed_.Max() == 1) {
1918 end_.SetRange(mi, ma);
1922 int64_t OldEndMin()
const override {
1923 CHECK_EQ(performed_.Max(), 1);
1925 return end_.OldMin();
1928 int64_t OldEndMax()
const override {
1929 CHECK_EQ(performed_.Max(), 1);
1931 return end_.OldMax();
1934 void WhenEndRange(Demon*
const d)
override {
1935 if (performed_.Max() == 1) {
1940 void WhenEndBound(Demon*
const d)
override {
1941 if (performed_.Max() == 1) {
1946 bool MustBePerformed()
const override {
return (performed_.Min() == 1); }
1948 bool MayBePerformed()
const override {
return (performed_.Max() == 1); }
1950 void SetPerformed(
bool val)
override { performed_.SetValue(val); }
1952 bool WasPerformedBound()
const override {
1954 return performed_.OldMin() == performed_.OldMax();
1957 void WhenPerformedBound(Demon*
const d)
override { performed_.WhenBound(d); }
1959 void Process()
override {
1962 start_.UpdatePostponedBounds();
1963 duration_.UpdatePostponedBounds();
1964 end_.UpdatePostponedBounds();
1965 performed_.UpdatePostponedValue();
1967 if (performed_.Max() == 1) {
1968 start_.ProcessDemons();
1969 duration_.ProcessDemons();
1970 end_.ProcessDemons();
1972 performed_.Process();
1973 reset_action_on_fail();
1976 start_.UpdatePreviousBounds();
1977 start_.ApplyPostponedBounds(START);
1978 duration_.UpdatePreviousBounds();
1979 duration_.ApplyPostponedBounds(DURATION);
1980 end_.UpdatePreviousBounds();
1981 end_.ApplyPostponedBounds(END);
1982 performed_.UpdatePreviousValueAndApplyPostponedValue();
1985 std::string DebugString()
const override {
1986 const std::string& var_name =
name();
1987 if (performed_.Max() != 1) {
1988 if (!var_name.empty()) {
1989 return absl::StrFormat(
"%s(performed = false)", var_name);
1991 return "IntervalVar(performed = false)";
1995 if (!var_name.empty()) {
1996 out = var_name +
"(start = ";
1998 out =
"IntervalVar(start = ";
2001 absl::StrAppendFormat(&out,
2002 "%s, duration = %s, end = %s, performed = %s)",
2003 start_.DebugString(), duration_.DebugString(),
2004 end_.DebugString(), performed_.DebugString());
2009 void Accept(ModelVisitor*
const visitor)
const override {
2010 visitor->VisitIntervalVariable(
this,
"", 0, NullInterval());
2013 IntExpr* StartExpr()
override {
return &start_; }
2014 IntExpr* DurationExpr()
override {
return &duration_; }
2015 IntExpr* EndExpr()
override {
return &end_; }
2016 IntExpr* PerformedExpr()
override {
return &performed_; }
2017 IntExpr* SafeStartExpr(int64_t unperformed_value)
override {
2020 IntExpr* SafeDurationExpr(int64_t unperformed_value)
override {
2023 IntExpr* SafeEndExpr(int64_t unperformed_value)
override {
2028 void Push()
override {
2030 if (performed_.Max() == 1) {
2034 start_.SetRange(
CapSub(end_.Min(), duration_.Max()),
2035 CapSub(end_.Max(), duration_.Min()));
2036 duration_.SetRange(
CapSub(end_.Min(), start_.Max()),
2037 CapSub(end_.Max(), start_.Min()));
2038 end_.SetRange(
CapAdd(start_.Min(), duration_.Min()),
2039 CapAdd(start_.Max(), duration_.Max()));
2048 PerformedVar performed_;
2053 class FixedDurationSyncedIntervalVar :
public IntervalVar {
2055 FixedDurationSyncedIntervalVar(IntervalVar*
const t, int64_t duration,
2056 int64_t offset,
const std::string&
name)
2057 : IntervalVar(t->solver(),
name),
2059 duration_(duration),
2061 ~FixedDurationSyncedIntervalVar()
override {}
2062 int64_t DurationMin()
const override {
return duration_; }
2063 int64_t DurationMax()
const override {
return duration_; }
2064 void SetDurationMin(int64_t m)
override {
2065 if (m > duration_) {
2069 void SetDurationMax(int64_t m)
override {
2070 if (m < duration_) {
2074 void SetDurationRange(int64_t mi, int64_t ma)
override {
2075 if (mi > duration_ || ma < duration_ || mi > ma) {
2079 int64_t OldDurationMin()
const override {
return duration_; }
2080 int64_t OldDurationMax()
const override {
return duration_; }
2081 void WhenDurationRange(Demon*
const d)
override {}
2082 void WhenDurationBound(Demon*
const d)
override {}
2083 int64_t EndMin()
const override {
return CapAdd(StartMin(), duration_); }
2084 int64_t EndMax()
const override {
return CapAdd(StartMax(), duration_); }
2085 void SetEndMin(int64_t m)
override { SetStartMin(
CapSub(m, duration_)); }
2086 void SetEndMax(int64_t m)
override { SetStartMax(
CapSub(m, duration_)); }
2087 void SetEndRange(int64_t mi, int64_t ma)
override {
2088 SetStartRange(
CapSub(mi, duration_),
CapSub(ma, duration_));
2090 int64_t OldEndMin()
const override {
2091 return CapAdd(OldStartMin(), duration_);
2093 int64_t OldEndMax()
const override {
2094 return CapAdd(OldStartMax(), duration_);
2096 void WhenEndRange(Demon*
const d)
override { WhenStartRange(d); }
2097 void WhenEndBound(Demon*
const d)
override { WhenStartBound(d); }
2098 bool MustBePerformed()
const override {
return t_->MustBePerformed(); }
2099 bool MayBePerformed()
const override {
return t_->MayBePerformed(); }
2100 void SetPerformed(
bool val)
override { t_->SetPerformed(val); }
2101 bool WasPerformedBound()
const override {
return t_->WasPerformedBound(); }
2102 void WhenPerformedBound(Demon*
const d)
override {
2103 t_->WhenPerformedBound(d);
2107 IntervalVar*
const t_;
2108 const int64_t duration_;
2117 class FixedDurationIntervalVarStartSyncedOnStart
2118 :
public FixedDurationSyncedIntervalVar {
2120 FixedDurationIntervalVarStartSyncedOnStart(IntervalVar*
const t,
2121 int64_t duration, int64_t offset)
2122 : FixedDurationSyncedIntervalVar(
2123 t, duration, offset,
2125 "IntervalStartSyncedOnStart(%s, duration = %d, offset = %d)",
2126 t->
name(), duration, offset)) {}
2127 ~FixedDurationIntervalVarStartSyncedOnStart()
override {}
2128 int64_t StartMin()
const override {
return CapAdd(t_->StartMin(),
offset_); }
2129 int64_t StartMax()
const override {
return CapAdd(t_->StartMax(),
offset_); }
2130 void SetStartMin(int64_t m)
override { t_->SetStartMin(
CapSub(m,
offset_)); }
2131 void SetStartMax(int64_t m)
override { t_->SetStartMax(
CapSub(m,
offset_)); }
2132 void SetStartRange(int64_t mi, int64_t ma)
override {
2135 int64_t OldStartMin()
const override {
2138 int64_t OldStartMax()
const override {
2141 void WhenStartRange(Demon*
const d)
override { t_->WhenStartRange(d); }
2142 void WhenStartBound(Demon*
const d)
override { t_->WhenStartBound(d); }
2143 IntExpr* StartExpr()
override {
2144 return solver()->MakeSum(t_->StartExpr(),
offset_);
2146 IntExpr* DurationExpr()
override {
return solver()->MakeIntConst(duration_); }
2147 IntExpr* EndExpr()
override {
2148 return solver()->MakeSum(t_->StartExpr(),
offset_ + duration_);
2150 IntExpr* PerformedExpr()
override {
return t_->PerformedExpr(); }
2154 IntExpr* SafeStartExpr(int64_t unperformed_value)
override {
2157 IntExpr* SafeDurationExpr(int64_t unperformed_value)
override {
2160 IntExpr* SafeEndExpr(int64_t unperformed_value)
override {
2163 void Accept(ModelVisitor*
const visitor)
const override {
2164 visitor->VisitIntervalVariable(
2165 this, ModelVisitor::kStartSyncOnStartOperation,
offset_, t_);
2167 std::string DebugString()
const override {
2168 return absl::StrFormat(
2169 "IntervalStartSyncedOnStart(%s, duration = %d, offset = %d)",
2170 t_->DebugString(), duration_,
offset_);
2176 class FixedDurationIntervalVarStartSyncedOnEnd
2177 :
public FixedDurationSyncedIntervalVar {
2179 FixedDurationIntervalVarStartSyncedOnEnd(IntervalVar*
const t,
2180 int64_t duration, int64_t offset)
2181 : FixedDurationSyncedIntervalVar(
2182 t, duration, offset,
2184 "IntervalStartSyncedOnEnd(%s, duration = %d, offset = %d)",
2185 t->
name(), duration, offset)) {}
2186 ~FixedDurationIntervalVarStartSyncedOnEnd()
override {}
2187 int64_t StartMin()
const override {
return CapAdd(t_->EndMin(),
offset_); }
2188 int64_t StartMax()
const override {
return CapAdd(t_->EndMax(),
offset_); }
2189 void SetStartMin(int64_t m)
override { t_->SetEndMin(
CapSub(m,
offset_)); }
2190 void SetStartMax(int64_t m)
override { t_->SetEndMax(
CapSub(m,
offset_)); }
2191 void SetStartRange(int64_t mi, int64_t ma)
override {
2194 int64_t OldStartMin()
const override {
2197 int64_t OldStartMax()
const override {
2200 void WhenStartRange(Demon*
const d)
override { t_->WhenEndRange(d); }
2201 void WhenStartBound(Demon*
const d)
override { t_->WhenEndBound(d); }
2202 IntExpr* StartExpr()
override {
2203 return solver()->MakeSum(t_->EndExpr(),
offset_);
2205 IntExpr* DurationExpr()
override {
return solver()->MakeIntConst(duration_); }
2206 IntExpr* EndExpr()
override {
2207 return solver()->MakeSum(t_->EndExpr(),
offset_ + duration_);
2209 IntExpr* PerformedExpr()
override {
return t_->PerformedExpr(); }
2213 IntExpr* SafeStartExpr(int64_t unperformed_value)
override {
2216 IntExpr* SafeDurationExpr(int64_t unperformed_value)
override {
2219 IntExpr* SafeEndExpr(int64_t unperformed_value)
override {
2223 void Accept(ModelVisitor*
const visitor)
const override {
2224 visitor->VisitIntervalVariable(
this, ModelVisitor::kStartSyncOnEndOperation,
2227 std::string DebugString()
const override {
2228 return absl::StrFormat(
2229 "IntervalStartSyncedOnEnd(%s, duration = %d, offset = %d)",
2230 t_->DebugString(), duration_,
offset_);
2238 return RegisterIntervalVar(
2239 RevAlloc(
new MirrorIntervalVar(
this, interval_var)));
2244 return interval_var;
2246 return RegisterIntervalVar(
2247 RevAlloc(
new IntervalVarRelaxedMax(interval_var)));
2253 return interval_var;
2255 return RegisterIntervalVar(
2256 RevAlloc(
new IntervalVarRelaxedMin(interval_var)));
2260 void IntervalVar::WhenAnything(
Demon*
const d) {
2262 WhenDurationRange(d);
2264 WhenPerformedBound(d);
2268 const std::string&
name) {
2269 return RevAlloc(
new FixedInterval(
this,
start, duration,
name));
2276 const std::string&
name) {
2279 }
else if (!optional) {
2280 return RegisterIntervalVar(RevAlloc(
new FixedDurationPerformedIntervalVar(
2283 return RegisterIntervalVar(RevAlloc(
new FixedDurationIntervalVar(
2287 void Solver::MakeFixedDurationIntervalVarArray(
2289 bool optional,
const std::string&
name, std::vector<IntervalVar*>* array) {
2291 CHECK(array !=
nullptr);
2293 for (
int i = 0; i < count; ++i) {
2294 const std::string var_name = absl::StrCat(
name, i);
2295 array->push_back(MakeFixedDurationIntervalVar(
2302 const std::string&
name) {
2303 CHECK(start_variable !=
nullptr);
2304 CHECK_GE(duration, 0);
2305 return RegisterIntervalVar(RevAlloc(
2306 new StartVarPerformedIntervalVar(
this, start_variable, duration,
name)));
2312 IntVar*
const start_variable, int64_t duration,
2313 IntVar*
const performed_variable,
const std::string&
name) {
2314 CHECK(start_variable !=
nullptr);
2315 CHECK(performed_variable !=
nullptr);
2316 CHECK_GE(duration, 0);
2317 if (!performed_variable->
Bound()) {
2318 StartVarIntervalVar*
const interval =
2319 reinterpret_cast<StartVarIntervalVar*
>(
2320 RegisterIntervalVar(RevAlloc(
new StartVarIntervalVar(
2321 this, start_variable, duration, performed_variable,
name))));
2322 AddConstraint(RevAlloc(
new LinkStartVarIntervalVar(
2323 this,
interval, start_variable, performed_variable)));
2325 }
else if (performed_variable->
Min() == 1) {
2326 return RegisterIntervalVar(RevAlloc(
new StartVarPerformedIntervalVar(
2327 this, start_variable, duration,
name)));
2332 void Solver::MakeFixedDurationIntervalVarArray(
2333 const std::vector<IntVar*>& start_variables, int64_t duration,
2334 const std::string&
name, std::vector<IntervalVar*>* array) {
2335 CHECK(array !=
nullptr);
2337 for (
int i = 0; i < start_variables.size(); ++i) {
2338 const std::string var_name = absl::StrCat(
name, i);
2340 MakeFixedDurationIntervalVar(start_variables[i], duration, var_name));
2346 void Solver::MakeFixedDurationIntervalVarArray(
2347 const std::vector<IntVar*>& start_variables,
2348 const std::vector<int64_t>& durations,
const std::string&
name,
2349 std::vector<IntervalVar*>* array) {
2350 CHECK(array !=
nullptr);
2351 CHECK_EQ(start_variables.size(), durations.size());
2353 for (
int i = 0; i < start_variables.size(); ++i) {
2354 const std::string var_name = absl::StrCat(
name, i);
2355 array->push_back(MakeFixedDurationIntervalVar(start_variables[i],
2356 durations[i], var_name));
2360 void Solver::MakeFixedDurationIntervalVarArray(
2361 const std::vector<IntVar*>& start_variables,
2362 const std::vector<int>& durations,
const std::string&
name,
2363 std::vector<IntervalVar*>* array) {
2364 CHECK(array !=
nullptr);
2365 CHECK_EQ(start_variables.size(), durations.size());
2367 for (
int i = 0; i < start_variables.size(); ++i) {
2368 const std::string var_name = absl::StrCat(
name, i);
2369 array->push_back(MakeFixedDurationIntervalVar(start_variables[i],
2370 durations[i], var_name));
2374 void Solver::MakeFixedDurationIntervalVarArray(
2375 const std::vector<IntVar*>& start_variables,
2376 const std::vector<int>& durations,
2377 const std::vector<IntVar*>& performed_variables,
const std::string&
name,
2378 std::vector<IntervalVar*>* array) {
2379 CHECK(array !=
nullptr);
2381 for (
int i = 0; i < start_variables.size(); ++i) {
2382 const std::string var_name = absl::StrCat(
name, i);
2383 array->push_back(MakeFixedDurationIntervalVar(
2384 start_variables[i], durations[i], performed_variables[i], var_name));
2388 void Solver::MakeFixedDurationIntervalVarArray(
2389 const std::vector<IntVar*>& start_variables,
2390 const std::vector<int64_t>& durations,
2391 const std::vector<IntVar*>& performed_variables,
const std::string&
name,
2392 std::vector<IntervalVar*>* array) {
2393 CHECK(array !=
nullptr);
2395 for (
int i = 0; i < start_variables.size(); ++i) {
2396 const std::string var_name = absl::StrCat(
name, i);
2397 array->push_back(MakeFixedDurationIntervalVar(
2398 start_variables[i], durations[i], performed_variables[i], var_name));
2405 int64_t duration_min, int64_t duration_max,
2407 bool optional,
const std::string&
name) {
2408 return RegisterIntervalVar(RevAlloc(
new VariableDurationIntervalVar(
2413 void Solver::MakeIntervalVarArray(
int count, int64_t
start_min,
2414 int64_t
start_max, int64_t duration_min,
2415 int64_t duration_max, int64_t
end_min,
2416 int64_t
end_max,
bool optional,
2417 const std::string&
name,
2418 std::vector<IntervalVar*>*
const array) {
2420 CHECK(array !=
nullptr);
2422 for (
int i = 0; i < count; ++i) {
2423 const std::string var_name = absl::StrCat(
name, i);
2432 IntervalVar*
const interval_var, int64_t duration, int64_t offset) {
2433 return RegisterIntervalVar(
2434 RevAlloc(
new FixedDurationIntervalVarStartSyncedOnStart(
2435 interval_var, duration, offset)));
2439 IntervalVar*
const interval_var, int64_t duration, int64_t offset) {
2440 return RegisterIntervalVar(
2441 RevAlloc(
new FixedDurationIntervalVarStartSyncedOnEnd(interval_var,
2442 duration, offset)));
2446 IntervalVar*
const interval_var, int64_t duration, int64_t offset) {
2447 return RegisterIntervalVar(
2448 RevAlloc(
new FixedDurationIntervalVarStartSyncedOnStart(
2449 interval_var, duration,
CapSub(offset, duration))));
2453 IntervalVar*
const interval_var, int64_t duration, int64_t offset) {
2454 return RegisterIntervalVar(
2455 RevAlloc(
new FixedDurationIntervalVarStartSyncedOnEnd(
2456 interval_var, duration,
CapSub(offset, duration))));
A Demon is the base element of a propagation queue.
virtual bool Bound() const
Returns true if the min and the max of the expression are equal.
virtual int64_t Min() const =0
The class IntVar is a subset of IntExpr.
Interval variables are often used in scheduling.
static const int64_t kMinValidValue
The smallest acceptable value to be returned by StartMin()
static const int64_t kMaxValidValue
The largest acceptable value to be returned by EndMax()
virtual bool MustBePerformed() const =0
These methods query, set, and watch the performed status of the interval var.
static const char kMirrorOperation[]
Operations.
static const char kRelaxedMaxOperation[]
static const char kRelaxedMinOperation[]
DemonPriority
This enum represents the three possible priorities for a demon in the Solver queue.
@ VAR_PRIORITY
VAR_PRIORITY is between DELAYED_PRIORITY and NORMAL_PRIORITY.
@ DELAYED_PRIORITY
DELAYED_PRIORITY is the lowest priority: Demons will be processed after VAR_PRIORITY and NORMAL_PRIOR...
std::function< void(Solver *)> Action
#define DISALLOW_COPY_AND_ASSIGN(TypeName)
Collection of objects used to extend the Constraint Solver library.
IntExpr * BuildSafeEndExpr(IntervalVar *var, int64_t unperformed_value)
void InternalSaveBooleanVarValue(Solver *const solver, IntVar *const var)
int64_t CapAdd(int64_t x, int64_t y)
IntExpr * BuildEndExpr(IntervalVar *var)
IntExpr * BuildStartExpr(IntervalVar *var)
Demon * MakeConstraintDemon0(Solver *const s, T *const ct, void(T::*method)(), const std::string &name)
int64_t CapSub(int64_t x, int64_t y)
IntExpr * BuildSafeStartExpr(IntervalVar *var, int64_t unperformed_value)
void RegisterDemon(Solver *const solver, Demon *const demon, DemonProfiler *const monitor)
IntExpr * BuildSafeDurationExpr(IntervalVar *var, int64_t unperformed_value)
void LinkVarExpr(Solver *const s, IntExpr *const expr, IntVar *const var)
IntExpr * BuildDurationExpr(IntervalVar *var)