OR-Tools  9.0
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"
22 #include "ortools/base/logging.h"
23 #include "ortools/base/macros.h"
24 #include "ortools/base/map_util.h"
25 #include "ortools/base/stl_util.h"
28 
29 namespace operations_research {
30 // ---------- ArgumentHolder ----------
31 
32 const std::string& ArgumentHolder::TypeName() const { return type_name_; }
33 
34 void ArgumentHolder::SetTypeName(const std::string& type_name) {
35  type_name_ = type_name;
36 }
37 
38 void 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 
48 void 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 
55 void 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 
65 void 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 
75 void 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 gtl::ContainsKey(integer_expression_argument_, arg_name);
88 }
89 
91  const std::string& arg_name) const {
92  return gtl::ContainsKey(integer_variable_array_argument_, 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 
115 const 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 
130 ModelParser::~ModelParser() { CHECK(holders_.empty()); }
131 
132 void ModelParser::BeginVisitModel(const std::string& solver_name) {
134 }
135 
136 void ModelParser::EndVisitModel(const std::string& solver_name) {
138 }
139 
140 void ModelParser::BeginVisitConstraint(const std::string& type_name,
141  const Constraint* const constraint) {
143 }
144 
145 void ModelParser::EndVisitConstraint(const std::string& type_name,
146  const Constraint* const constraint) {
147  // Constraint parsing is usually done here.
149 }
150 
151 void ModelParser::BeginVisitIntegerExpression(const std::string& type_name,
152  const IntExpr* const expr) {
154 }
155 
156 void ModelParser::EndVisitIntegerExpression(const std::string& type_name,
157  const IntExpr* const expr) {
158  // Expression parsing is usually done here.
160 }
161 
162 void ModelParser::VisitIntegerVariable(const IntVar* const variable,
163  IntExpr* const delegate) {
164  // Usual place for parsing.
165 }
166 
167 void 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 
184 void ModelParser::VisitSequenceVariable(const SequenceVar* const variable) {
185  // Usual place for parsing.
186 }
187 
188 // Integer arguments
189 void 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 
199 void ModelParser::VisitIntegerMatrixArgument(const std::string& arg_name,
200  const IntTupleSet& values) {
201  Top()->SetIntegerMatrixArgument(arg_name, values);
202 }
203 
204 // Variables.
205 void 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.
220 void 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.
235 void 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:498
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
bool ContainsKey(const Collection &collection, const Key &key)
Definition: map_util.h:200
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
const Collection::value_type::second_type & FindOrDie(const Collection &collection, const typename Collection::value_type::first_type &key)
Definition: map_util.h:206
Collection of objects used to extend the Constraint Solver library.