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"
20 #include "ortools/base/logging.h"
21 #include "ortools/base/macros.h"
24 
25 #if defined(_MSC_VER)
26 #pragma warning(disable : 4351 4355 4804 4805)
27 #endif
28 
29 namespace operations_research {
30 namespace {
31 class 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 
72 class 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 
111 class 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 
185 IntExpr* BuildSafeStartExpr(IntervalVar* var, int64_t unperformed_value) {
187  var->PerformedExpr()->Var(), var->StartExpr(), unperformed_value);
188 }
189 
190 IntExpr* BuildSafeDurationExpr(IntervalVar* var, int64_t unperformed_value) {
192  var->PerformedExpr()->Var(), var->DurationExpr(), unperformed_value);
193 }
194 
195 IntExpr* BuildSafeEndExpr(IntervalVar* var, int64_t unperformed_value) {
197  var->PerformedExpr()->Var(), var->EndExpr(), unperformed_value);
198 }
199 } // namespace operations_research
IntVar * Var() override
Creates a variable from the expression.
IntExpr * BuildSafeEndExpr(IntervalVar *var, int64_t unperformed_value)
Definition: sched_expr.cc:195
IntExpr * BuildStartExpr(IntervalVar *var)
Definition: sched_expr.cc:155
virtual std::string name() const
Object naming.
IntExpr * RegisterIntExpr(IntExpr *const expr)
Registers a new IntExpr and wraps it inside a TraceIntExpr if necessary.
Definition: trace.cc:849
Interval variables are often used in scheduling.
IntExpr * BuildSafeDurationExpr(IntervalVar *var, int64_t unperformed_value)
Definition: sched_expr.cc:190
The class IntExpr is the base of all integer expressions in constraint programming.
IntExpr * BuildEndExpr(IntervalVar *var)
Definition: sched_expr.cc:175
T * RevAlloc(T *object)
Registers the given object as being reversible.
IntExpr * BuildSafeStartExpr(IntervalVar *var, int64_t unperformed_value)
Definition: sched_expr.cc:185
Collection of objects used to extend the Constraint Solver library.
IntExpr * MakeConditionalExpression(IntVar *const condition, IntExpr *const expr, int64_t unperformed_value)
Conditional Expr condition ? expr : unperformed_value.
IntVar * var
Definition: expr_array.cc:1874
IntExpr * BuildDurationExpr(IntervalVar *var)
Definition: sched_expr.cc:165
bool HasName() const
Returns whether the object has been named or not.
#define DISALLOW_COPY_AND_ASSIGN(TypeName)
Definition: macros.h:29