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