17 #include "absl/strings/str_format.h"
25 #pragma warning(disable : 4351 4355 4804 4805)
30 class IntervalVarStartExpr :
public BaseIntExpr {
32 explicit IntervalVarStartExpr(IntervalVar*
const i)
33 : BaseIntExpr(i->solver()), interval_(i) {}
34 ~IntervalVarStartExpr()
override {}
36 int64 Min()
const override {
return interval_->StartMin(); }
38 void SetMin(
int64 m)
override { interval_->SetStartMin(m); }
40 int64 Max()
const override {
return interval_->StartMax(); }
42 void SetMax(
int64 m)
override { interval_->SetStartMax(m); }
44 void SetRange(
int64 l,
int64 u)
override { interval_->SetStartRange(l, u); }
46 void SetValue(
int64 v)
override { interval_->SetStartRange(v, v); }
48 bool Bound()
const override {
49 return interval_->StartMin() == interval_->StartMax();
52 void WhenRange(Demon* d)
override { interval_->WhenStartRange(d); }
54 std::string DebugString()
const override {
55 return absl::StrFormat(
"start(%s)", interval_->DebugString());
58 void Accept(ModelVisitor*
const visitor)
const override {
59 visitor->BeginVisitIntegerExpression(ModelVisitor::kStartExpr,
this);
60 visitor->VisitIntervalArgument(ModelVisitor::kIntervalArgument, interval_);
61 visitor->EndVisitIntegerExpression(ModelVisitor::kStartExpr,
this);
65 IntervalVar* interval_;
69 class IntervalVarEndExpr :
public BaseIntExpr {
71 explicit IntervalVarEndExpr(IntervalVar*
const i)
72 : BaseIntExpr(i->solver()), interval_(i) {}
73 ~IntervalVarEndExpr()
override {}
75 int64 Min()
const override {
return interval_->EndMin(); }
77 void SetMin(
int64 m)
override { interval_->SetEndMin(m); }
79 int64 Max()
const override {
return interval_->EndMax(); }
81 void SetMax(
int64 m)
override { interval_->SetEndMax(m); }
83 void SetRange(
int64 l,
int64 u)
override { interval_->SetEndRange(l, u); }
85 void SetValue(
int64 v)
override { interval_->SetEndRange(v, v); }
87 bool Bound()
const override {
88 return interval_->EndMin() == interval_->EndMax();
91 void WhenRange(Demon* d)
override { interval_->WhenEndRange(d); }
93 std::string DebugString()
const override {
94 return absl::StrFormat(
"end(%s)", interval_->DebugString());
97 void Accept(ModelVisitor*
const visitor)
const override {
98 visitor->BeginVisitIntegerExpression(ModelVisitor::kEndExpr,
this);
99 visitor->VisitIntervalArgument(ModelVisitor::kIntervalArgument, interval_);
100 visitor->EndVisitIntegerExpression(ModelVisitor::kEndExpr,
this);
104 IntervalVar* interval_;
108 class IntervalVarDurationExpr :
public BaseIntExpr {
110 explicit IntervalVarDurationExpr(IntervalVar*
const i)
111 : BaseIntExpr(i->solver()), interval_(i) {}
112 ~IntervalVarDurationExpr()
override {}
114 int64 Min()
const override {
return interval_->DurationMin(); }
116 void SetMin(
int64 m)
override { interval_->SetDurationMin(m); }
118 int64 Max()
const override {
return interval_->DurationMax(); }
120 void SetMax(
int64 m)
override { interval_->SetDurationMax(m); }
123 interval_->SetDurationRange(l, u);
126 void SetValue(
int64 v)
override { interval_->SetDurationRange(v, v); }
128 bool Bound()
const override {
129 return interval_->DurationMin() == interval_->DurationMax();
132 void WhenRange(Demon* d)
override { interval_->WhenDurationRange(d); }
134 std::string DebugString()
const override {
135 return absl::StrFormat(
"duration(%s)", interval_->DebugString());
138 void Accept(ModelVisitor*
const visitor)
const override {
139 visitor->BeginVisitIntegerExpression(ModelVisitor::kDurationExpr,
this);
140 visitor->VisitIntervalArgument(ModelVisitor::kIntervalArgument, interval_);
141 visitor->EndVisitIntegerExpression(ModelVisitor::kDurationExpr,
this);
145 IntervalVar* interval_;
153 Solver*
const s =
var->solver();
154 IntExpr*
const expr =
155 s->RegisterIntExpr(s->RevAlloc(
new IntervalVarStartExpr(
var)));
156 if (
var->HasName()) {
157 expr->set_name(absl::StrFormat(
"start<%s>",
var->name()));
163 Solver*
const s =
var->solver();
164 IntExpr*
const expr =
165 s->RegisterIntExpr(s->RevAlloc(
new IntervalVarDurationExpr(
var)));
166 if (
var->HasName()) {
167 expr->set_name(absl::StrFormat(
"duration<%s>",
var->name()));
173 Solver*
const s =
var->solver();
174 IntExpr*
const expr =
175 s->RegisterIntExpr(s->RevAlloc(
new IntervalVarEndExpr(
var)));
176 if (
var->HasName()) {
177 expr->set_name(absl::StrFormat(
"end<%s>",
var->name()));
183 return var->solver()->MakeConditionalExpression(
184 var->PerformedExpr()->Var(),
var->StartExpr(), unperformed_value);
188 return var->solver()->MakeConditionalExpression(
189 var->PerformedExpr()->Var(),
var->DurationExpr(), unperformed_value);
193 return var->solver()->MakeConditionalExpression(
194 var->PerformedExpr()->Var(),
var->EndExpr(), unperformed_value);