26 #include <ast/parser/parse.hpp>
30 #include <util/visitors/autonomous.hpp>
31 #include <util/visitors/expression_printer.hpp>
32 #include <util/visitors/get_index_variables.hpp>
33 #include <util/visitors/is_constant_index.hpp>
34 #include <util/visitors/partial_eval_exp.hpp>
42 Expression::Expression() : _exp(nullptr), _order(0) {}
44 string Expression::print()
const
46 stringstream buffer, exp;
48 ExpressionPrinter printer(_order);
49 exp << printer.apply(_exp);
56 bool Expression::isScalar()
const
61 CheckIndexExpression constant_index;
62 return constant_index.apply(_exp);
69 bool Expression::isReference()
const
79 assert(isReference());
80 AST_Expression_ComponentReference cr = _exp->getAsComponentReference();
81 return ModelConfig::instance().lookup(cr->name());
87 vector<Expression> exps = usageExps();
88 int size = exps.size(), i = 0;
90 PartialEvalExp partial_eval;
91 Expression usage_exp = partial_eval.apply(exp.expression());
92 buffer << usage_exp << (++i < size ?
"," :
"");
97 string Expression::dimVariables(
bool range_idxs)
const
100 vector<Expression> exps = usageExps();
101 int size = exps.size(), i = 1;
106 buffer <<
"_d" << i << (i < size ?
"," :
"");
112 vector<Expression> Expression::usageExps()
const
114 vector<Expression> exps;
116 AST_Expression_ComponentReference cr = _exp->getAsComponentReference();
117 if (cr->hasIndexes()) {
118 AST_ExpressionList indexes = cr->firstIndex();
119 AST_ExpressionListIterator it;
120 foreach (it, indexes) {
128 list<Expression> Expression::indexes()
const
130 list<Expression> exps;
132 AST_Expression_ComponentReference cr = _exp->getAsComponentReference();
133 if (cr->hasIndexes()) {
134 AST_ExpressionList indexes = cr->firstIndex();
135 AST_ExpressionListIterator it;
136 foreach (it, indexes) {
145 Expression Expression::generate(
string var_name, vector<string> indices)
149 if (indices.size()) {
152 int i = 0, size = indices.size();
153 for (
string exp : indices) {
154 code << exp << ((++i == size) ?
"]" :
",");
156 AST_Expression ast_exp = parseExpression(code.str(), &i);
166 bool Expression::operator<(
const Expression& other)
const
168 std::stringstream cmp_this;
169 std::stringstream cmp_other;
172 return cmp_this.str() < cmp_other.str();
175 std::multimap<std::string, int> Expression::usedVariables()
const
177 GetIndexVariables used_variables;
178 return used_variables.apply(_exp);
181 bool Expression::autonomous()
const
183 Autonomous autonomous;
184 return autonomous.apply(expression());