MAiNGO
symbolFinder.h
Go to the documentation of this file.
1 /**********************************************************************************
2  * Copyright (c) 2019 Process Systems Engineering (AVT.SVT), RWTH Aachen University
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License 2.0 which is available at
6  * http://www.eclipse.org/legal/epl-2.0.
7  *
8  * SPDX-License-Identifier: EPL-2.0
9  *
10  * @file symbolFinder.h
11  *
12  * @brief File containing the SymbolFinder class that detects all symbols occurring
13  * in visited expression.
14  *
15  **********************************************************************************/
16 
17 #pragma once
18 
19 #include "symbol_table.hpp"
20 
21 #include "expression.hpp"
22 
23 
24 namespace maingo {
25 
26 
27 using namespace ale;
28 
33 class SymbolFinder {
34  public:
40  SymbolFinder(symbol_table& symbols):
41  _symbols(symbols){};
42 
48  template <typename TType>
49  void dispatch(expression<TType>& expr)
50  {
51  dispatch(expr.get());
52  }
53 
54 
55  template <typename TType>
56  void dispatch(value_node<TType>* node)
57  {
58  std::visit(*this, node->get_variant());
59  }
60 
61 
62  template <typename TType>
63  void dispatch(value_symbol<TType>* sym)
64  {
65  std::visit(*this, sym->get_value_variant());
66  }
74  template <typename TType>
75  void operator()(constant_node<TType>* node)
76  {
77  }
78 
79 
80  template <typename TType>
81  void operator()(parameter_node<TType>* node)
82  {
83  if (std::find(_scopeStack.begin(), _scopeStack.end(), node->name) != _scopeStack.end()) {
84  mScopedSymbols.insert(node->name);
85  return;
86  }
87  auto sym = _symbols.resolve<TType>(node->name);
88  if (sym) {
89  dispatch(sym);
90  return;
91  }
92  mIlldefinedSymbols.insert(node->name);
93  }
94 
95 
96  template <typename TType>
97  void operator()(parameter_symbol<TType>* sym)
98  {
99  mFixedSymbols.insert(sym->m_name);
100  }
101 
102 
103  template <typename TType>
104  void operator()(variable_symbol<TType>* sym)
105  {
106  mDefinedSymbols.insert(sym->m_name);
107  }
108 
109  template <typename TType>
110  void operator()(expression_symbol<TType>* sym)
111  {
112  dispatch(sym->m_value.get());
113  }
121  template <typename TType>
122  void traverse(unary_node<TType>* node)
123  {
124  dispatch(node->template get_child<0>());
125  }
126 
127 
128  template <typename TType, typename UType>
129  void traverse(binary_node<TType, UType>* node)
130  {
131  dispatch(node->template get_child<0>());
132  dispatch(node->template get_child<1>());
133  }
134 
135 
136  template <typename TType, typename UType, typename VType>
137  void traverse(ternary_node<TType, UType, VType>* node)
138  {
139  dispatch(node->template get_child<0>());
140  dispatch(node->template get_child<1>());
141  dispatch(node->template get_child<2>());
142  }
143 
144 
145  template <typename TType, typename UType, typename VType, typename WType>
146  void traverse(quaternary_node<TType, UType, VType, WType>* node)
147  {
148  dispatch(node->template get_child<0>());
149  dispatch(node->template get_child<1>());
150  dispatch(node->template get_child<2>());
151  dispatch(node->template get_child<3>());
152  }
153 
154 
155  template <typename TType, typename UType, typename VType, typename WType, typename XType>
156  void traverse(quinary_node<TType, UType, VType, WType, XType>* node)
157  {
158  dispatch(node->template get_child<0>());
159  dispatch(node->template get_child<1>());
160  dispatch(node->template get_child<2>());
161  dispatch(node->template get_child<3>());
162  dispatch(node->template get_child<4>());
163  }
164 
165 
166  template <typename TType, typename UType, typename VType, typename WType, typename XType, typename YType>
167  void traverse(senary_node<TType, UType, VType, WType, XType, YType>* node)
168  {
169  dispatch(node->template get_child<0>());
170  dispatch(node->template get_child<1>());
171  dispatch(node->template get_child<2>());
172  dispatch(node->template get_child<3>());
173  dispatch(node->template get_child<4>());
174  dispatch(node->template get_child<5>());
175  }
176 
177 
178  template <typename TType, typename UType, typename VType, typename WType, typename XType, typename YType, typename ZType>
179  void traverse(septenary_node<TType, UType, VType, WType, XType, YType, ZType>* node)
180  {
181  dispatch(node->template get_child<0>());
182  dispatch(node->template get_child<1>());
183  dispatch(node->template get_child<2>());
184  dispatch(node->template get_child<3>());
185  dispatch(node->template get_child<4>());
186  dispatch(node->template get_child<5>());
187  dispatch(node->template get_child<6>());
188  }
189 
190 
191  template <typename TType, typename UType, typename VType, typename WType, typename XType, typename YType, typename ZType, typename AType>
192  void traverse(octonary_node<TType, UType, VType, WType, XType, YType, ZType, AType>* node)
193  {
194  dispatch(node->template get_child<0>());
195  dispatch(node->template get_child<1>());
196  dispatch(node->template get_child<2>());
197  dispatch(node->template get_child<3>());
198  dispatch(node->template get_child<4>());
199  dispatch(node->template get_child<5>());
200  dispatch(node->template get_child<6>());
201  dispatch(node->template get_child<7>());
202  }
203 
204 
205  template <typename TType, typename UType, typename VType, typename WType, typename XType, typename YType, typename ZType, typename AType, typename BType>
206  void traverse(novenary_node<TType, UType, VType, WType, XType, YType, ZType, AType, BType>* node)
207  {
208  dispatch(node->template get_child<0>());
209  dispatch(node->template get_child<1>());
210  dispatch(node->template get_child<2>());
211  dispatch(node->template get_child<3>());
212  dispatch(node->template get_child<4>());
213  dispatch(node->template get_child<5>());
214  dispatch(node->template get_child<6>());
215  dispatch(node->template get_child<7>());
216  dispatch(node->template get_child<8>());
217  }
218 
219 
220  template <typename TType, typename UType, typename VType, typename WType, typename XType, typename YType, typename ZType, typename AType, typename BType, typename CType, typename DType>
221  void traverse(undenary_node<TType, UType, VType, WType, XType, YType, ZType, AType, BType, CType, DType>* node)
222  {
223  dispatch(node->template get_child<0>());
224  dispatch(node->template get_child<1>());
225  dispatch(node->template get_child<2>());
226  dispatch(node->template get_child<3>());
227  dispatch(node->template get_child<4>());
228  dispatch(node->template get_child<5>());
229  dispatch(node->template get_child<6>());
230  dispatch(node->template get_child<7>());
231  dispatch(node->template get_child<8>());
232  dispatch(node->template get_child<9>());
233  dispatch(node->template get_child<10>());
234  }
235 
236 
237  template <typename TTypes>
238  void traverse(nary_node<TTypes>* node)
239  {
240  for (auto it = node->children.begin(); it != node->children.end(); ++it) {
241  dispatch(it->get());
242  }
243  }
251  template <typename TType>
252  void operator()(entry_node<TType>* node)
253  {
254  traverse(node);
255  }
256 
257  void operator()(minus_node* node) { traverse(node); }
258  void operator()(inverse_node* node) { traverse(node); }
259 
260  void operator()(addition_node* node) { traverse(node); }
261  void operator()(multiplication_node* node) { traverse(node); }
262  void operator()(exponentiation_node* node) { traverse(node); }
263  void operator()(min_node* node) { traverse(node); }
264  void operator()(max_node* node) { traverse(node); }
265  void operator()(sum_div_node* node) { traverse(node); };
266  void operator()(xlog_sum_node* node) { traverse(node); };
267 
268  void operator()(exp_node* node) { traverse(node); }
269  void operator()(log_node* node) { traverse(node); }
270  void operator()(sqrt_node* node) { traverse(node); }
271  void operator()(sin_node* node) { traverse(node); }
272  void operator()(asin_node* node) { traverse(node); }
273  void operator()(cos_node* node) { traverse(node); }
274  void operator()(acos_node* node) { traverse(node); }
275  void operator()(tan_node* node) { traverse(node); }
276  void operator()(atan_node* node) { traverse(node); }
277 
278  void operator()(lmtd_node* node) { traverse(node); }
279  void operator()(rlmtd_node* node) { traverse(node); }
280  void operator()(xexpax_node* node) { traverse(node); }
281  void operator()(arh_node* node) { traverse(node); }
282  void operator()(lb_func_node* node) { traverse(node); }
283  void operator()(ub_func_node* node) { traverse(node); }
284  void operator()(bounding_func_node* node) { traverse(node); }
285  void operator()(ale::squash_node* node) { traverse(node); }
286  void operator()(ale::regnormal_node* node) { traverse(node); }
287 
288  void operator()(xlogx_node* node) { traverse(node); }
289  void operator()(abs_node* node) { traverse(node); }
290  void operator()(xabsx_node* node) { traverse(node); }
291  void operator()(cosh_node* node) { traverse(node); }
292  void operator()(sinh_node* node) { traverse(node); }
293  void operator()(tanh_node* node) { traverse(node); }
294  void operator()(coth_node* node) { traverse(node); }
295  void operator()(acosh_node* node) { traverse(node); }
296  void operator()(asinh_node* node) { traverse(node); }
297  void operator()(atanh_node* node) { traverse(node); }
298  void operator()(acoth_node* node) { traverse(node); }
299  void operator()(erf_node* node) { traverse(node); }
300  void operator()(erfc_node* node) { traverse(node); }
301  void operator()(pos_node* node) { traverse(node); }
302  void operator()(neg_node* node) { traverse(node); }
303  void operator()(xexpy_node* node) { traverse(node); }
304  void operator()(norm2_node* node) { traverse(node); }
305 
306  void operator()(schroeder_ethanol_p_node* node) { traverse(node); }
307  void operator()(schroeder_ethanol_rhovap_node* node) { traverse(node); }
308  void operator()(schroeder_ethanol_rholiq_node* node) { traverse(node); }
309 
310  void operator()(nrtl_dtau_node* node) { traverse(node); }
311  void operator()(nrtl_tau_node* node) { traverse(node); }
312  void operator()(nrtl_g_node* node) { traverse(node); }
313  void operator()(nrtl_gtau_node* node) { traverse(node); }
314  void operator()(nrtl_gdtau_node* node) { traverse(node); }
315  void operator()(nrtl_dgtau_node* node) { traverse(node); }
316 
317  void operator()(ext_antoine_psat_node* node) { traverse(node); }
318  void operator()(antoine_psat_node* node) { traverse(node); }
319  void operator()(wagner_psat_node* node) { traverse(node); }
320  void operator()(ik_cape_psat_node* node) { traverse(node); }
321 
322  void operator()(aspen_hig_node* node) { traverse(node); }
323  void operator()(nasa9_hig_node* node) { traverse(node); }
324  void operator()(dippr107_hig_node* node) { traverse(node); }
325  void operator()(dippr127_hig_node* node) { traverse(node); }
326 
327  void operator()(antoine_tsat_node* node) { traverse(node); }
328 
329  void operator()(watson_dhvap_node* node) { traverse(node); }
330  void operator()(dippr106_dhvap_node* node) { traverse(node); }
331 
332  void operator()(cost_turton_node* node) { traverse(node); }
333 
334  void operator()(covar_matern_1_node* node) { traverse(node); }
335  void operator()(covar_matern_3_node* node) { traverse(node); }
336  void operator()(covar_matern_5_node* node) { traverse(node); }
337  void operator()(covar_sqrexp_node* node) { traverse(node); }
338 
339  void operator()(gpdf_node* node) { traverse(node); }
340 
341  template <typename TType>
342  void operator()(sum_node<TType>* node)
343  {
344  _scopeStack.push_back(node->name);
345  traverse(node);
346  _scopeStack.pop_back();
347  }
348 
349 
350  template <typename TType>
351  void operator()(set_min_node<TType>* node)
352  {
353  _scopeStack.push_back(node->name);
354  traverse(node);
355  _scopeStack.pop_back();
356  }
357 
358 
359  template <typename TType>
360  void operator()(set_max_node<TType>* node)
361  {
362  _scopeStack.push_back(node->name);
363  traverse(node);
364  _scopeStack.pop_back();
365  }
366 
367  void operator()(index_minus_node* node) { traverse(node); }
368 
369  void operator()(index_addition_node* node) { traverse(node); }
370  void operator()(index_multiplication_node* node) { traverse(node); }
371 
372  void operator()(negation_node* node) { traverse(node); }
373 
374  template <typename TType>
375  void operator()(equal_node<TType>* node)
376  {
377  traverse(node);
378  }
379  template <typename TType>
380  void operator()(less_node<TType>* node)
381  {
382  traverse(node);
383  }
384  template <typename TType>
385  void operator()(less_equal_node<TType>* node)
386  {
387  traverse(node);
388  }
389  template <typename TType>
390  void operator()(greater_node<TType>* node)
391  {
392  traverse(node);
393  }
394  template <typename TType>
395  void operator()(greater_equal_node<TType>* node)
396  {
397  traverse(node);
398  }
399 
400  void operator()(disjunction_node* node) { traverse(node); }
401  void operator()(conjunction_node* node) { traverse(node); }
402 
403  void operator()(element_node* node) { traverse(node); };
404 
405  template <typename TType>
406  void operator()(forall_node<TType>* node)
407  {
408  _scopeStack.push_back(node->name);
409  traverse(node);
410  _scopeStack.pop_back();
411  }
412 
413 
414  template <typename TType>
415  void operator()(indicator_set_node<TType>* node)
416  {
417  _scopeStack.push_back(node->name);
418  traverse(node);
419  _scopeStack.pop_back();
420  }
421 
422  void operator()(mid_node* node) { traverse(node); }
425  std::set<std::string> mDefinedSymbols;
426  std::set<std::string> mIlldefinedSymbols;
427  std::set<std::string> mFixedSymbols;
428  std::set<std::string> mScopedSymbols;
430  private:
431  symbol_table& _symbols;
432  std::deque<std::string> _scopeStack;
433 };
434 
435 
436 } // namespace maingo
void operator()(schroeder_ethanol_rholiq_node *node)
Definition: symbolFinder.h:308
void operator()(nrtl_dtau_node *node)
Definition: symbolFinder.h:310
std::set< std::string > mDefinedSymbols
Definition: symbolFinder.h:425
std::set< std::string > mFixedSymbols
Definition: symbolFinder.h:427
void operator()(acosh_node *node)
Definition: symbolFinder.h:295
void operator()(greater_equal_node< TType > *node)
Definition: symbolFinder.h:395
void operator()(cos_node *node)
Definition: symbolFinder.h:273
void operator()(min_node *node)
Definition: symbolFinder.h:263
void operator()(conjunction_node *node)
Definition: symbolFinder.h:401
void operator()(multiplication_node *node)
Definition: symbolFinder.h:261
std::set< std::string > mIlldefinedSymbols
Definition: symbolFinder.h:426
void dispatch(value_symbol< TType > *sym)
Definition: symbolFinder.h:63
void traverse(novenary_node< TType, UType, VType, WType, XType, YType, ZType, AType, BType > *node)
Definition: symbolFinder.h:206
void operator()(lmtd_node *node)
Definition: symbolFinder.h:278
void operator()(set_min_node< TType > *node)
Definition: symbolFinder.h:351
void operator()(mid_node *node)
Definition: symbolFinder.h:422
void traverse(nary_node< TTypes > *node)
Definition: symbolFinder.h:238
void operator()(parameter_symbol< TType > *sym)
Definition: symbolFinder.h:97
void operator()(gpdf_node *node)
Definition: symbolFinder.h:339
void operator()(atanh_node *node)
Definition: symbolFinder.h:297
void operator()(wagner_psat_node *node)
Definition: symbolFinder.h:319
void operator()(cost_turton_node *node)
Definition: symbolFinder.h:332
void operator()(greater_node< TType > *node)
Definition: symbolFinder.h:390
void traverse(undenary_node< TType, UType, VType, WType, XType, YType, ZType, AType, BType, CType, DType > *node)
Definition: symbolFinder.h:221
void dispatch(value_node< TType > *node)
Definition: symbolFinder.h:56
void traverse(octonary_node< TType, UType, VType, WType, XType, YType, ZType, AType > *node)
Definition: symbolFinder.h:192
void operator()(exp_node *node)
Definition: symbolFinder.h:268
void operator()(sinh_node *node)
Definition: symbolFinder.h:292
void operator()(schroeder_ethanol_rhovap_node *node)
Definition: symbolFinder.h:307
void operator()(nrtl_gdtau_node *node)
Definition: symbolFinder.h:314
void operator()(neg_node *node)
Definition: symbolFinder.h:302
void operator()(covar_matern_5_node *node)
Definition: symbolFinder.h:336
void operator()(forall_node< TType > *node)
Definition: symbolFinder.h:406
void operator()(asin_node *node)
Definition: symbolFinder.h:272
std::deque< std::string > _scopeStack
Definition: symbolFinder.h:432
void operator()(xabsx_node *node)
Definition: symbolFinder.h:290
void operator()(indicator_set_node< TType > *node)
Definition: symbolFinder.h:415
void operator()(tan_node *node)
Definition: symbolFinder.h:275
void operator()(index_multiplication_node *node)
Definition: symbolFinder.h:370
void operator()(ale::regnormal_node *node)
Definition: symbolFinder.h:286
void dispatch(expression< TType > &expr)
Definition: symbolFinder.h:49
void operator()(covar_matern_3_node *node)
Definition: symbolFinder.h:335
void operator()(nasa9_hig_node *node)
Definition: symbolFinder.h:323
void operator()(dippr106_dhvap_node *node)
Definition: symbolFinder.h:330
void operator()(tanh_node *node)
Definition: symbolFinder.h:293
void traverse(quinary_node< TType, UType, VType, WType, XType > *node)
Definition: symbolFinder.h:156
void operator()(nrtl_dgtau_node *node)
Definition: symbolFinder.h:315
void operator()(watson_dhvap_node *node)
Definition: symbolFinder.h:329
void operator()(xexpax_node *node)
Definition: symbolFinder.h:280
void operator()(covar_sqrexp_node *node)
Definition: symbolFinder.h:337
void operator()(xlogx_node *node)
Definition: symbolFinder.h:288
void operator()(ub_func_node *node)
Definition: symbolFinder.h:283
void operator()(aspen_hig_node *node)
Definition: symbolFinder.h:322
void operator()(norm2_node *node)
Definition: symbolFinder.h:304
void operator()(lb_func_node *node)
Definition: symbolFinder.h:282
void operator()(xexpy_node *node)
Definition: symbolFinder.h:303
void operator()(acoth_node *node)
Definition: symbolFinder.h:298
void traverse(ternary_node< TType, UType, VType > *node)
Definition: symbolFinder.h:137
void operator()(erf_node *node)
Definition: symbolFinder.h:299
void operator()(log_node *node)
Definition: symbolFinder.h:269
void operator()(xlog_sum_node *node)
Definition: symbolFinder.h:266
void operator()(index_addition_node *node)
Definition: symbolFinder.h:369
namespace holding all essentials of MAiNGO
Definition: aleModel.h:31
void operator()(sum_div_node *node)
Definition: symbolFinder.h:265
void operator()(max_node *node)
Definition: symbolFinder.h:264
void operator()(cosh_node *node)
Definition: symbolFinder.h:291
void operator()(equal_node< TType > *node)
Definition: symbolFinder.h:375
void operator()(expression_symbol< TType > *sym)
Definition: symbolFinder.h:110
SymbolFinder(symbol_table &symbols)
Constructor.
Definition: symbolFinder.h:40
void operator()(disjunction_node *node)
Definition: symbolFinder.h:400
void operator()(entry_node< TType > *node)
Definition: symbolFinder.h:252
void operator()(bounding_func_node *node)
Definition: symbolFinder.h:284
void operator()(constant_node< TType > *node)
Definition: symbolFinder.h:75
void operator()(antoine_tsat_node *node)
Definition: symbolFinder.h:327
void operator()(asinh_node *node)
Definition: symbolFinder.h:296
void operator()(parameter_node< TType > *node)
Definition: symbolFinder.h:81
void operator()(schroeder_ethanol_p_node *node)
Definition: symbolFinder.h:306
void operator()(arh_node *node)
Definition: symbolFinder.h:281
void traverse(binary_node< TType, UType > *node)
Definition: symbolFinder.h:129
void traverse(unary_node< TType > *node)
Definition: symbolFinder.h:122
void operator()(nrtl_gtau_node *node)
Definition: symbolFinder.h:313
void operator()(variable_symbol< TType > *sym)
Definition: symbolFinder.h:104
void operator()(nrtl_g_node *node)
Definition: symbolFinder.h:312
void operator()(ext_antoine_psat_node *node)
Definition: symbolFinder.h:317
void operator()(covar_matern_1_node *node)
Definition: symbolFinder.h:334
void operator()(negation_node *node)
Definition: symbolFinder.h:372
std::set< std::string > mScopedSymbols
Definition: symbolFinder.h:428
void operator()(antoine_psat_node *node)
Definition: symbolFinder.h:318
void operator()(nrtl_tau_node *node)
Definition: symbolFinder.h:311
void traverse(septenary_node< TType, UType, VType, WType, XType, YType, ZType > *node)
Definition: symbolFinder.h:179
void operator()(rlmtd_node *node)
Definition: symbolFinder.h:279
symbol_table & _symbols
Definition: symbolFinder.h:431
void operator()(acos_node *node)
Definition: symbolFinder.h:274
void operator()(less_node< TType > *node)
Definition: symbolFinder.h:380
void operator()(abs_node *node)
Definition: symbolFinder.h:289
Visitor for finding all symbols used in an expression.
Definition: symbolFinder.h:33
void operator()(sum_node< TType > *node)
Definition: symbolFinder.h:342
void operator()(sqrt_node *node)
Definition: symbolFinder.h:270
void operator()(sin_node *node)
Definition: symbolFinder.h:271
void operator()(ale::squash_node *node)
Definition: symbolFinder.h:285
void operator()(index_minus_node *node)
Definition: symbolFinder.h:367
void operator()(set_max_node< TType > *node)
Definition: symbolFinder.h:360
void operator()(less_equal_node< TType > *node)
Definition: symbolFinder.h:385
void operator()(pos_node *node)
Definition: symbolFinder.h:301
void operator()(dippr127_hig_node *node)
Definition: symbolFinder.h:325
void traverse(quaternary_node< TType, UType, VType, WType > *node)
Definition: symbolFinder.h:146
void operator()(element_node *node)
Definition: symbolFinder.h:403
void operator()(erfc_node *node)
Definition: symbolFinder.h:300
void operator()(addition_node *node)
Definition: symbolFinder.h:260
void operator()(coth_node *node)
Definition: symbolFinder.h:294
void operator()(inverse_node *node)
Definition: symbolFinder.h:258
void operator()(minus_node *node)
Definition: symbolFinder.h:257
void operator()(dippr107_hig_node *node)
Definition: symbolFinder.h:324
void operator()(ik_cape_psat_node *node)
Definition: symbolFinder.h:320
void operator()(atan_node *node)
Definition: symbolFinder.h:276
void traverse(senary_node< TType, UType, VType, WType, XType, YType > *node)
Definition: symbolFinder.h:167
void operator()(exponentiation_node *node)
Definition: symbolFinder.h:262