OR-Tools  9.1
sched_expr.cc
Go to the documentation of this file.
1// Copyright 2010-2021 Google LLC
2// Licensed under the Apache License, Version 2.0 (the "License");
3// you may not use this file except in compliance with the License.
4// You may obtain a copy of the License at
5//
6// http://www.apache.org/licenses/LICENSE-2.0
7//
8// Unless required by applicable law or agreed to in writing, software
9// distributed under the License is distributed on an "AS IS" BASIS,
10// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11// See the License for the specific language governing permissions and
12// limitations under the License.
13
14#include <cstdint>
15#include <string>
16#include <vector>
17
18#include "absl/strings/str_format.h"
21#include "ortools/base/macros.h"
24
25#if defined(_MSC_VER)
26#pragma warning(disable : 4351 4355 4804 4805)
27#endif
28
29namespace operations_research {
30namespace {
31class IntervalVarStartExpr : public BaseIntExpr {
32 public:
33 explicit IntervalVarStartExpr(IntervalVar* const i)
34 : BaseIntExpr(i->solver()), interval_(i) {}
35 ~IntervalVarStartExpr() override {}
36
37 int64_t Min() const override { return interval_->StartMin(); }
38
39 void SetMin(int64_t m) override { interval_->SetStartMin(m); }
40
41 int64_t Max() const override { return interval_->StartMax(); }
42
43 void SetMax(int64_t m) override { interval_->SetStartMax(m); }
44
45 void SetRange(int64_t l, int64_t u) override {
46 interval_->SetStartRange(l, u);
47 }
48
49 void SetValue(int64_t v) override { interval_->SetStartRange(v, v); }
50
51 bool Bound() const override {
52 return interval_->StartMin() == interval_->StartMax();
53 }
54
55 void WhenRange(Demon* d) override { interval_->WhenStartRange(d); }
56
57 std::string DebugString() const override {
58 return absl::StrFormat("start(%s)", interval_->DebugString());
59 }
60
61 void Accept(ModelVisitor* const visitor) const override {
62 visitor->BeginVisitIntegerExpression(ModelVisitor::kStartExpr, this);
63 visitor->VisitIntervalArgument(ModelVisitor::kIntervalArgument, interval_);
64 visitor->EndVisitIntegerExpression(ModelVisitor::kStartExpr, this);
65 }
66
67 private:
68 IntervalVar* interval_;
69 DISALLOW_COPY_AND_ASSIGN(IntervalVarStartExpr);
70};
71
72class IntervalVarEndExpr : public BaseIntExpr {
73 public:
74 explicit IntervalVarEndExpr(IntervalVar* const i)
75 : BaseIntExpr(i->solver()), interval_(i) {}
76 ~IntervalVarEndExpr() override {}
77
78 int64_t Min() const override { return interval_->EndMin(); }
79
80 void SetMin(int64_t m) override { interval_->SetEndMin(m); }
81
82 int64_t Max() const override { return interval_->EndMax(); }
83
84 void SetMax(int64_t m) override { interval_->SetEndMax(m); }
85
86 void SetRange(int64_t l, int64_t u) override { interval_->SetEndRange(l, u); }
87
88 void SetValue(int64_t v) override { interval_->SetEndRange(v, v); }
89
90 bool Bound() const override {
91 return interval_->EndMin() == interval_->EndMax();
92 }
93
94 void WhenRange(Demon* d) override { interval_->WhenEndRange(d); }
95
96 std::string DebugString() const override {
97 return absl::StrFormat("end(%s)", interval_->DebugString());
98 }
99
100 void Accept(ModelVisitor* const visitor) const override {
101 visitor->BeginVisitIntegerExpression(ModelVisitor::kEndExpr, this);
102 visitor->VisitIntervalArgument(ModelVisitor::kIntervalArgument, interval_);
103 visitor->EndVisitIntegerExpression(ModelVisitor::kEndExpr, this);
104 }
105
106 private:
107 IntervalVar* interval_;
108 DISALLOW_COPY_AND_ASSIGN(IntervalVarEndExpr);
109};
110
111class IntervalVarDurationExpr : public BaseIntExpr {
112 public:
113 explicit IntervalVarDurationExpr(IntervalVar* const i)
114 : BaseIntExpr(i->solver()), interval_(i) {}
115 ~IntervalVarDurationExpr() override {}
116
117 int64_t Min() const override { return interval_->DurationMin(); }
118
119 void SetMin(int64_t m) override { interval_->SetDurationMin(m); }
120
121 int64_t Max() const override { return interval_->DurationMax(); }
122
123 void SetMax(int64_t m) override { interval_->SetDurationMax(m); }
124
125 void SetRange(int64_t l, int64_t u) override {
126 interval_->SetDurationRange(l, u);
127 }
128
129 void SetValue(int64_t v) override { interval_->SetDurationRange(v, v); }
130
131 bool Bound() const override {
132 return interval_->DurationMin() == interval_->DurationMax();
133 }
134
135 void WhenRange(Demon* d) override { interval_->WhenDurationRange(d); }
136
137 std::string DebugString() const override {
138 return absl::StrFormat("duration(%s)", interval_->DebugString());
139 }
140
141 void Accept(ModelVisitor* const visitor) const override {
142 visitor->BeginVisitIntegerExpression(ModelVisitor::kDurationExpr, this);
143 visitor->VisitIntervalArgument(ModelVisitor::kIntervalArgument, interval_);
144 visitor->EndVisitIntegerExpression(ModelVisitor::kDurationExpr, this);
145 }
146
147 private:
148 IntervalVar* interval_;
149 DISALLOW_COPY_AND_ASSIGN(IntervalVarDurationExpr);
150};
151} // namespace
152
153// ----- API -----
154
156 Solver* const s = var->solver();
157 IntExpr* const expr =
158 s->RegisterIntExpr(s->RevAlloc(new IntervalVarStartExpr(var)));
159 if (var->HasName()) {
160 expr->set_name(absl::StrFormat("start<%s>", var->name()));
161 }
162 return expr;
163}
164
166 Solver* const s = var->solver();
167 IntExpr* const expr =
168 s->RegisterIntExpr(s->RevAlloc(new IntervalVarDurationExpr(var)));
169 if (var->HasName()) {
170 expr->set_name(absl::StrFormat("duration<%s>", var->name()));
171 }
172 return expr;
173}
174
176 Solver* const s = var->solver();
177 IntExpr* const expr =
178 s->RegisterIntExpr(s->RevAlloc(new IntervalVarEndExpr(var)));
179 if (var->HasName()) {
180 expr->set_name(absl::StrFormat("end<%s>", var->name()));
181 }
182 return expr;
183}
184
185IntExpr* BuildSafeStartExpr(IntervalVar* var, int64_t unperformed_value) {
187 var->PerformedExpr()->Var(), var->StartExpr(), unperformed_value);
188}
189
190IntExpr* BuildSafeDurationExpr(IntervalVar* var, int64_t unperformed_value) {
192 var->PerformedExpr()->Var(), var->DurationExpr(), unperformed_value);
193}
194
195IntExpr* BuildSafeEndExpr(IntervalVar* var, int64_t unperformed_value) {
197 var->PerformedExpr()->Var(), var->EndExpr(), unperformed_value);
198}
199} // namespace operations_research
The class IntExpr is the base of all integer expressions in constraint programming.
IntVar * Var() override
Creates a variable from the expression.
Interval variables are often used in scheduling.
virtual std::string name() const
Object naming.
bool HasName() const
Returns whether the object has been named or not.
IntExpr * RegisterIntExpr(IntExpr *const expr)
Registers a new IntExpr and wraps it inside a TraceIntExpr if necessary.
Definition: trace.cc:849
IntExpr * MakeConditionalExpression(IntVar *const condition, IntExpr *const expr, int64_t unperformed_value)
Conditional Expr condition ? expr : unperformed_value.
T * RevAlloc(T *object)
Registers the given object as being reversible.
IntVar * var
Definition: expr_array.cc:1874
#define DISALLOW_COPY_AND_ASSIGN(TypeName)
Definition: macros.h:29
Collection of objects used to extend the Constraint Solver library.
IntExpr * BuildSafeEndExpr(IntervalVar *var, int64_t unperformed_value)
Definition: sched_expr.cc:195
IntExpr * BuildEndExpr(IntervalVar *var)
Definition: sched_expr.cc:175
IntExpr * BuildStartExpr(IntervalVar *var)
Definition: sched_expr.cc:155
IntExpr * BuildSafeStartExpr(IntervalVar *var, int64_t unperformed_value)
Definition: sched_expr.cc:185
IntExpr * BuildSafeDurationExpr(IntervalVar *var, int64_t unperformed_value)
Definition: sched_expr.cc:190
IntExpr * BuildDurationExpr(IntervalVar *var)
Definition: sched_expr.cc:165