OR-Tools  9.3
visitor.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 <cstddef>
15#include <cstdint>
16#include <string>
17#include <vector>
18
19#include "absl/container/flat_hash_map.h"
20#include "absl/container/flat_hash_set.h"
23#include "ortools/base/macros.h"
28
29namespace operations_research {
30// ---------- ArgumentHolder ----------
31
32const std::string& ArgumentHolder::TypeName() const { return type_name_; }
33
34void ArgumentHolder::SetTypeName(const std::string& type_name) {
35 type_name_ = type_name;
36}
37
38void ArgumentHolder::SetIntegerArgument(const std::string& arg_name,
39 int64_t value) {
40 integer_argument_[arg_name] = value;
41}
42
44 const std::string& arg_name, const std::vector<int64_t>& values) {
45 integer_array_argument_[arg_name] = values;
46}
47
48void ArgumentHolder::SetIntegerMatrixArgument(const std::string& arg_name,
49 const IntTupleSet& values) {
50 std::pair<std::string, IntTupleSet> to_insert =
51 std::make_pair(arg_name, values);
52 matrix_argument_.insert(to_insert);
53}
54
55void ArgumentHolder::SetIntegerExpressionArgument(const std::string& arg_name,
56 IntExpr* const expr) {
57 integer_expression_argument_[arg_name] = expr;
58}
59
61 const std::string& arg_name, const std::vector<IntVar*>& vars) {
62 integer_variable_array_argument_[arg_name] = vars;
63}
64
65void ArgumentHolder::SetIntervalArgument(const std::string& arg_name,
66 IntervalVar* const var) {
67 interval_argument_[arg_name] = var;
68}
69
71 const std::string& arg_name, const std::vector<IntervalVar*>& vars) {
72 interval_array_argument_[arg_name] = vars;
73}
74
75void ArgumentHolder::SetSequenceArgument(const std::string& arg_name,
76 SequenceVar* const var) {
77 sequence_argument_[arg_name] = var;
78}
79
81 const std::string& arg_name, const std::vector<SequenceVar*>& vars) {
82 sequence_array_argument_[arg_name] = vars;
83}
84
86 const std::string& arg_name) const {
87 return integer_expression_argument_.contains(arg_name);
88}
89
91 const std::string& arg_name) const {
92 return integer_variable_array_argument_.contains(arg_name);
93}
94
96 const std::string& arg_name, int64_t def) const {
97 return gtl::FindWithDefault(integer_argument_, arg_name, def);
98}
99
101 const std::string& arg_name) const {
102 return gtl::FindOrDie(integer_argument_, arg_name);
103}
104
106 const std::string& arg_name) const {
107 return gtl::FindOrDie(integer_array_argument_, arg_name);
108}
109
111 const std::string& arg_name) const {
112 return gtl::FindOrDie(integer_expression_argument_, arg_name);
113}
114
115const std::vector<IntVar*>&
117 const std::string& arg_name) const {
118 return gtl::FindOrDie(integer_variable_array_argument_, arg_name);
119}
120
122 const std::string& arg_name) const {
123 return gtl::FindOrDie(matrix_argument_, arg_name);
124}
125
126// ---------- ModelParser ---------
127
129
130ModelParser::~ModelParser() { CHECK(holders_.empty()); }
131
132void ModelParser::BeginVisitModel(const std::string& solver_name) {
134}
135
136void ModelParser::EndVisitModel(const std::string& solver_name) {
138}
139
140void ModelParser::BeginVisitConstraint(const std::string& type_name,
141 const Constraint* const constraint) {
143}
144
145void ModelParser::EndVisitConstraint(const std::string& type_name,
146 const Constraint* const constraint) {
147 // Constraint parsing is usually done here.
149}
150
151void ModelParser::BeginVisitIntegerExpression(const std::string& type_name,
152 const IntExpr* const expr) {
154}
155
156void ModelParser::EndVisitIntegerExpression(const std::string& type_name,
157 const IntExpr* const expr) {
158 // Expression parsing is usually done here.
160}
161
162void ModelParser::VisitIntegerVariable(const IntVar* const variable,
163 IntExpr* const delegate) {
164 // Usual place for parsing.
165}
166
167void ModelParser::VisitIntegerVariable(const IntVar* const variable,
168 const std::string& operation,
169 int64_t value, IntVar* const delegate) {
170 delegate->Accept(this);
171 // Usual place for parsing.
172}
173
175 const std::string& operation,
176 int64_t value,
177 IntervalVar* const delegate) {
178 if (delegate != nullptr) {
179 delegate->Accept(this);
180 }
181 // Usual place for parsing.
182}
183
185 // Usual place for parsing.
186}
187
188// Integer arguments
189void ModelParser::VisitIntegerArgument(const std::string& arg_name,
190 int64_t value) {
191 Top()->SetIntegerArgument(arg_name, value);
192}
193
195 const std::string& arg_name, const std::vector<int64_t>& values) {
196 Top()->SetIntegerArrayArgument(arg_name, values);
197}
198
199void ModelParser::VisitIntegerMatrixArgument(const std::string& arg_name,
200 const IntTupleSet& values) {
201 Top()->SetIntegerMatrixArgument(arg_name, values);
202}
203
204// Variables.
205void ModelParser::VisitIntegerExpressionArgument(const std::string& arg_name,
206 IntExpr* const argument) {
207 Top()->SetIntegerExpressionArgument(arg_name, argument);
208 argument->Accept(this);
209}
210
212 const std::string& arg_name, const std::vector<IntVar*>& arguments) {
213 Top()->SetIntegerVariableArrayArgument(arg_name, arguments);
214 for (int i = 0; i < arguments.size(); ++i) {
215 arguments[i]->Accept(this);
216 }
217}
218
219// Visit interval argument.
220void ModelParser::VisitIntervalArgument(const std::string& arg_name,
221 IntervalVar* const argument) {
222 Top()->SetIntervalArgument(arg_name, argument);
223 argument->Accept(this);
224}
225
227 const std::string& arg_name, const std::vector<IntervalVar*>& arguments) {
228 Top()->SetIntervalArrayArgument(arg_name, arguments);
229 for (int i = 0; i < arguments.size(); ++i) {
230 arguments[i]->Accept(this);
231 }
232}
233
234// Visit sequence argument.
235void ModelParser::VisitSequenceArgument(const std::string& arg_name,
236 SequenceVar* const argument) {
237 Top()->SetSequenceArgument(arg_name, argument);
238 argument->Accept(this);
239}
240
242 const std::string& arg_name, const std::vector<SequenceVar*>& arguments) {
243 Top()->SetSequenceArrayArgument(arg_name, arguments);
244 for (int i = 0; i < arguments.size(); ++i) {
245 arguments[i]->Accept(this);
246 }
247}
248
250 holders_.push_back(new ArgumentHolder);
251}
252
254 CHECK(!holders_.empty());
255 delete holders_.back();
256 holders_.pop_back();
257}
258
260 CHECK(!holders_.empty());
261 return holders_.back();
262}
263} // namespace operations_research
#define CHECK(condition)
Definition: base/logging.h:495
Argument Holder: useful when visiting a model.
const std::vector< IntVar * > & FindIntegerVariableArrayArgumentOrDie(const std::string &arg_name) const
Definition: visitor.cc:116
const IntTupleSet & FindIntegerMatrixArgumentOrDie(const std::string &arg_name) const
Definition: visitor.cc:121
bool HasIntegerVariableArrayArgument(const std::string &arg_name) const
Definition: visitor.cc:90
void SetSequenceArgument(const std::string &arg_name, SequenceVar *const var)
Definition: visitor.cc:75
void SetIntegerExpressionArgument(const std::string &arg_name, IntExpr *const expr)
Definition: visitor.cc:55
void SetTypeName(const std::string &type_name)
Definition: visitor.cc:34
const std::string & TypeName() const
Type of the argument.
Definition: visitor.cc:32
void SetIntegerVariableArrayArgument(const std::string &arg_name, const std::vector< IntVar * > &vars)
Definition: visitor.cc:60
const std::vector< int64_t > & FindIntegerArrayArgumentOrDie(const std::string &arg_name) const
Definition: visitor.cc:105
void SetSequenceArrayArgument(const std::string &arg_name, const std::vector< SequenceVar * > &vars)
Definition: visitor.cc:80
void SetIntervalArgument(const std::string &arg_name, IntervalVar *const var)
Definition: visitor.cc:65
int64_t FindIntegerArgumentOrDie(const std::string &arg_name) const
Definition: visitor.cc:100
void SetIntegerArgument(const std::string &arg_name, int64_t value)
Setters.
Definition: visitor.cc:38
IntExpr * FindIntegerExpressionArgumentOrDie(const std::string &arg_name) const
Definition: visitor.cc:110
void SetIntegerMatrixArgument(const std::string &arg_name, const IntTupleSet &values)
Definition: visitor.cc:48
int64_t FindIntegerArgumentWithDefault(const std::string &arg_name, int64_t def) const
Getters.
Definition: visitor.cc:95
bool HasIntegerExpressionArgument(const std::string &arg_name) const
Checks if arguments exist.
Definition: visitor.cc:85
void SetIntegerArrayArgument(const std::string &arg_name, const std::vector< int64_t > &values)
Definition: visitor.cc:43
void SetIntervalArrayArgument(const std::string &arg_name, const std::vector< IntervalVar * > &vars)
Definition: visitor.cc:70
A constraint is the main modeling object.
The class IntExpr is the base of all integer expressions in constraint programming.
virtual void Accept(ModelVisitor *const visitor) const
Accepts the given visitor.
The class IntVar is a subset of IntExpr.
void Accept(ModelVisitor *const visitor) const override
Accepts the given visitor.
Interval variables are often used in scheduling.
virtual void Accept(ModelVisitor *const visitor) const =0
Accepts the given visitor.
void VisitIntegerArrayArgument(const std::string &arg_name, const std::vector< int64_t > &values) override
Definition: visitor.cc:194
void BeginVisitIntegerExpression(const std::string &type_name, const IntExpr *const expr) override
Definition: visitor.cc:151
void BeginVisitConstraint(const std::string &type_name, const Constraint *const constraint) override
Definition: visitor.cc:140
ArgumentHolder * Top() const
Definition: visitor.cc:259
void VisitIntegerExpressionArgument(const std::string &arg_name, IntExpr *const argument) override
Variables.
Definition: visitor.cc:205
void VisitSequenceVariable(const SequenceVar *const variable) override
Definition: visitor.cc:184
void VisitIntegerArgument(const std::string &arg_name, int64_t value) override
Integer arguments.
Definition: visitor.cc:189
void VisitIntervalArgument(const std::string &arg_name, IntervalVar *const argument) override
Visit interval argument.
Definition: visitor.cc:220
void VisitSequenceArrayArgument(const std::string &arg_name, const std::vector< SequenceVar * > &arguments) override
Definition: visitor.cc:241
void EndVisitConstraint(const std::string &type_name, const Constraint *const constraint) override
Definition: visitor.cc:145
void EndVisitModel(const std::string &solver_name) override
Definition: visitor.cc:136
void VisitSequenceArgument(const std::string &arg_name, SequenceVar *const argument) override
Visit sequence argument.
Definition: visitor.cc:235
void VisitIntegerVariableArrayArgument(const std::string &arg_name, const std::vector< IntVar * > &arguments) override
Definition: visitor.cc:211
void VisitIntegerVariable(const IntVar *const variable, IntExpr *const delegate) override
Definition: visitor.cc:162
void VisitIntegerMatrixArgument(const std::string &arg_name, const IntTupleSet &values) override
Definition: visitor.cc:199
void VisitIntervalVariable(const IntervalVar *const variable, const std::string &operation, int64_t value, IntervalVar *const delegate) override
Definition: visitor.cc:174
void BeginVisitModel(const std::string &solver_name) override
Header/footers.
Definition: visitor.cc:132
void EndVisitIntegerExpression(const std::string &type_name, const IntExpr *const expr) override
Definition: visitor.cc:156
void VisitIntervalArrayArgument(const std::string &arg_name, const std::vector< IntervalVar * > &arguments) override
Definition: visitor.cc:226
A sequence variable is a variable whose domain is a set of possible orderings of the interval variabl...
virtual void Accept(ModelVisitor *const visitor) const
Accepts the given visitor.
Definition: sched_search.cc:73
int64_t value
IntVar * var
Definition: expr_array.cc:1874
const Collection::value_type::second_type & FindOrDie(const Collection &collection, const typename Collection::value_type::first_type &key)
Definition: map_util.h:206
const Collection::value_type::second_type & FindWithDefault(const Collection &collection, const typename Collection::value_type::first_type &key, const typename Collection::value_type::second_type &value)
Definition: map_util.h:29
Collection of objects used to extend the Constraint Solver library.