MicroModelicaCCompiler  4.5.3
qss_model_deps.cpp
Go to the documentation of this file.
1 /*****************************************************************************
2 
3  This file is part of QSS Solver.
4 
5  QSS Solver is free software: you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation, either version 3 of the License, or
8  (at your option) any later version.
9 
10  QSS Solver is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU General Public License for more details.
14 
15  You should have received a copy of the GNU General Public License
16  along with QSS Solver. If not, see <http://www.gnu.org/licenses/>.
17 
18  ******************************************************************************/
19 
20 #include "qss_model_deps.hpp"
21 
22 #include <boost/algorithm/string/trim.hpp>
23 #include <sstream>
24 
25 #include <ast/parser/parse.hpp>
26 #include <deps/builders/eq_graph_builder.hpp>
27 #include <deps/sbg_graph/build_from_exps.hpp>
28 #include <deps/sb_dependencies.hpp>
29 #include <ir/derivative.hpp>
30 #include <ir/helpers.hpp>
31 #include <ir/index.hpp>
32 #include <util/model_config.hpp>
33 #include <util/util.hpp>
34 #include <util/symbol_table.hpp>
35 
36 namespace MicroModelica {
37 using namespace Deps;
38 using namespace SB;
39 using namespace Util;
40 namespace IR {
41 
42 QSSModelDepsGenerator::QSSModelDepsGenerator() : _qss_model_deps_def(), _tabs(0), _deps(), _post_process_eval(false) {}
43 
44 void QSSModelDepsGenerator::setup(QSSModelConfig config) { _config = config; }
45 
46 QSSModelConfig QSSModelDepsGenerator::config() { return _config; }
47 
48 void QSSModelDepsGenerator::addCode(DepCode dep_code, std::stringstream& code)
49 {
50  if (dep_code.scalar) {
51  code << dep_code.begin[0];
52  for (string alg : dep_code.alg_code) {
53  code << alg;
54  }
55  for (string eq : dep_code.code) {
56  boost::algorithm::trim_right(eq);
57  code << eq << endl;
58  }
59  code << TAB << TAB << dep_code.end[0] << endl;
60  } else {
61  assert(dep_code.alg_code.size() == dep_code.code.size());
62  int size = dep_code.code.size();
63  for (int i = 0; i < size; i++) {
64  code << dep_code.begin[i];
65  code << dep_code.alg_code[i];
66  code << dep_code.code[i];
67  code << dep_code.end[i] << endl;
68  }
69  }
70 }
71 
72 void QSSModelDepsGenerator::postProcess(SB::Deps::SetVertex vertex)
73 {
74  if (_post_process_eval) {
75  return;
76  }
77  map<string, DepCode> deps_code;
79  VarSymbolTable variables = ModelConfig::instance().symbols();
81  std::stringstream simple;
82  std::stringstream generic;
83  FunctionPrinter printer;
84  for (auto variable : _deps) {
85  PrintedDeps printed_deps;
86  list<DepData> var_deps = variable.second;
87  Option<Variable> ifr = variables[variable.first];
88  assert(ifr);
89  for (DepData var_dep : var_deps) {
90  std::stringstream begin;
91  std::stringstream end;
92  Option<Equation> eq = equations[var_dep.id];
93  assert(eq);
94  vector<string> exps;
95  Expression use_exp = getUseExp(ifr.get(), var_dep);
96  bool alg_recursive_use = checkAlgRecursiveDeps(eq.get(), _der_deps, _alg_deps);
97  Option<Range> range = getUseRange(ifr.get(), var_dep, eq.get(), false, alg_recursive_use);
98  Index use_idx(use_exp);
99  string use_id = use_idx.identifier(alg_recursive_use && !ifr.get().isScalar());
100  Equation der = eq.get();
102  der.setUsage(use_idx);
103  if (range && der.hasRange()) {
104  der.setRange(range);
105  }
106  if ((var_dep.var_dep.equations().size() == 1) && use_exp.isScalar() && der.hasRange() && !alg_recursive_use) {
107  Equation use_eq = der;
108  use_eq.applyUsage(use_idx);
109  der = use_eq;
110  }
111  if (deps_code.find(use_id) == deps_code.end()) {
112  DepCode dep_code;
113  dep_code.scalar = (use_exp.isScalar() && !alg_recursive_use) || ifr.get().isScalar();
114  deps_code[use_id] = dep_code;
115  }
116  DepCode dep_code = deps_code[use_id];
117  dep_code.begin.push_back(printer.beginExpression(use_id, range));
118  dep_code.end.push_back(printer.endExpression(range, FUNCTION_PRINTER::Break));
119  dep_code.alg_code.push_back(addAlgDeps(der, var_dep.var_dep.nMap(), _der_deps, _alg_deps, printed_deps));
120  dep_code.code.push_back(der.print());
121  deps_code[use_id] = dep_code;
122  }
123  }
124  for (auto dc : deps_code) {
125  DepCode dep_code = dc.second;
126  addCode(dep_code, ((dep_code.scalar) ? simple : generic));
127  }
128  _qss_model_deps_def.simple = simple.str();
129  _qss_model_deps_def.generic = generic.str();
130  _post_process_eval = true;
131 }
132 
133 void QSSModelDepsGenerator::init(SB::Deps::SetVertex vertex) {}
134 
136 
137 void QSSModelDepsGenerator::visitF(SB::Deps::SetVertex vertex, SB::Deps::VariableDep var_dep)
138 {
139  Equation eq = getEquation(vertex);
140  if (eq.type() == EQUATION::QSSDerivative) {
141  string var_name = var_dep.var().name();
142  DepData dep_data(eq.id(), var_dep);
143  if (!findDep(_deps, dep_data)) {
144  list<DepData> deps = _deps[var_name];
145  deps.push_back(dep_data);
146  _deps[var_name] = deps;
147  }
148  }
149 }
150 
151 void QSSModelDepsGenerator::visitF(SB::Deps::SetVertex vertex, SB::Deps::VariableDep var_dep, SB::Deps::SetVertex gen_vertex) {}
152 
153 void QSSModelDepsGenerator::visitG(SB::Deps::SetVertex v_vertex, SB::Deps::SetVertex g_vertex, SB::Deps::VariableDep var_dep,
154  int index_shift)
155 {
156  Equation v_eq = getEquation(v_vertex);
157  Equation g_eq = getEquation(g_vertex);
158  if (var_dep.isRecursive()) {
159  DefAlgDepsUse new_dep(g_eq, var_dep);
160  insertAlg(((v_eq.type() == IR::EQUATION::Algebraic) ? _alg_deps : _der_deps), v_eq.id(), new_dep);
161  }
162  if (v_eq.type() == EQUATION::QSSDerivative && var_dep.var().isState()) {
163  string var_name = var_dep.var().name();
164  DepData dep_data(v_eq.id(), var_dep);
165  if (!findDep(_deps, dep_data)) {
166  list<DepData> deps = _deps[var_name];
167  deps.push_back(dep_data);
168  _deps[var_name] = deps;
169  }
170  }
171 }
172 
173 void QSSModelDepsGenerator::visitG(SB::Deps::SetVertex v_vertex, SB::Deps::SetVertex g_vertex, SB::PWLMap use_map,
174  SB::Deps::LMapExp use_map_exp, Expression use_exp, SB::PWLMap def_map, SB::Deps::LMapExp def_map_exp,
175  SB::Set intersection)
176 {
177  Equation v_eq = getEquation(v_vertex);
178  Equation g_eq = getEquation(g_vertex);
179  DefAlgDepsUse new_dep(g_eq, def_map, use_exp, use_map_exp, def_map_exp, g_vertex.id());
180  insertAlg(((v_eq.type() == IR::EQUATION::Algebraic) ? _alg_deps : _der_deps), v_eq.id(), new_dep);
181 }
182 
183 void QSSModelDepsGenerator::initG(SB::Deps::SetVertex vertex, SB::Deps::SetEdge edge) {}
184 
185 QSSModelDepsDef QSSModelDepsGenerator::def() { return _qss_model_deps_def; }
186 
188 
190 {
193  QSSModelDepsBuilder qss_model_deps;
194  IndexShiftBuilder index_shifts(algebraics);
195  SDSBGraphBuilder SDSBGraph = SDSBGraphBuilder(eqs, algebraics);
196  SB::Deps::Graph graph = SDSBGraph.build();
197  QSSModelConfig config;
198  config.eqs = eqs;
199  config.graph = graph;
200  qss_model_deps.setup(config);
201  qss_model_deps.compute(graph, index_shifts.build());
202  _qss_model_deps_def = qss_model_deps.def();
203 }
204 
206 
208 
209 } // namespace IR
210 } // namespace MicroModelica
MicroModelica::IR::QSSModelDeps::QSSModelDeps
QSSModelDeps()
Definition: qss_model_deps.cpp:204
MicroModelica::IR::QSSModelDepsGenerator::_qss_model_deps_def
QSSModelDepsDef _qss_model_deps_def
Definition: qss_model_deps.hpp:103
ModelTable< int, Equation >
MicroModelica::IR::addAlgDeps
string addAlgDeps(Equation eq, SB::Deps::LMapExp eq_use, AlgDepsMap alg_deps, AlgDepsMap deps, PrintedDeps &printed_deps, bool comes_from_rec)
Definition: compute_deps.cpp:123
MicroModelica::Util::VarSymbolTable
Definition: symbol_table.hpp:184
MicroModelica::IR::DepCode::begin
vector< std::string > begin
Definition: qss_model_deps.hpp:74
MicroModelica::Util::ModelConfig::symbols
VarSymbolTable & symbols()
Definition: model_config.hpp:122
index.hpp
MicroModelica::IR::findDep
bool findDep(DepsMap deps, DepData dep_data, bool multiple_nodes)
Definition: compute_deps.cpp:65
MicroModelica::IR::QSSModelDeps::_qss_model_deps_def
QSSModelDepsDef _qss_model_deps_def
Definition: qss_model_deps.hpp:124
MicroModelica::IR::Equation::setRange
void setRange(Option< Range > range)
Definition: equation.hpp:87
MicroModelica::IR::getUseExp
Expression getUseExp(Variable variable, DepData dep_data)
Definition: compute_deps.cpp:48
MicroModelica::IR::QSSModelDepsGenerator::end
void end()
Definition: qss_model_deps.cpp:152
MicroModelica::IR::QSSModelDeps::build
void build(EquationTable eqs)
Definition: qss_model_deps.cpp:206
MicroModelica::IR::insertAlg
void insertAlg(AlgDepsMap &map, int id, DefAlgDepsUse new_dep)
Definition: compute_deps.cpp:187
MicroModelica::IR::EquationTable
ModelTable< int, Equation > EquationTable
Definition: equation.hpp:169
symbol_table.hpp
MicroModelica::IR::QSSModelDepsGenerator::_deps
DepsMap _deps
Definition: qss_model_deps.hpp:107
MicroModelica::IR::QSSModelDepsGenerator::addCode
void addCode(DepCode dep_code, std::stringstream &code)
Definition: qss_model_deps.cpp:65
helpers.hpp
Option
Definition: util_types.hpp:32
MicroModelica::IR::QSSModelDepsGenerator::visitF
void visitF(SB::Deps::SetVertex vertex, SB::Deps::VariableDep var_dep)
Definition: qss_model_deps.cpp:154
MicroModelica::IR::QSSModelDepsGenerator::_config
QSSModelConfig _config
Definition: qss_model_deps.hpp:109
MicroModelica::IR::Equation::print
std::string print() const
Definition: equation.cpp:211
model_config.hpp
MicroModelica::IR::DepCode::code
vector< std::string > code
Definition: qss_model_deps.hpp:76
MicroModelica::IR::QSSModelDepsGenerator::init
void init(SB::Deps::SetVertex vertex)
Definition: qss_model_deps.cpp:150
MicroModelica::IR::QSSModelDepsGenerator::postProcess
void postProcess(SB::Deps::SetVertex vertex)
Definition: qss_model_deps.cpp:89
MicroModelica::IR::QSSModelConfig::graph
SB::Deps::Graph graph
Definition: compute_deps.hpp:81
MicroModelica::IR::QSSModelDepsGenerator::_der_deps
AlgDepsMap _der_deps
Definition: qss_model_deps.hpp:105
MicroModelica::IR::QSSModelDepsDef::generic
std::string generic
Definition: qss_model_deps.hpp:87
MicroModelica::IR::Expression
Definition: expression.hpp:64
MicroModelica::Util::ModelConfig::algebraics
IR::EquationTable algebraics()
Definition: model_config.hpp:96
MicroModelica::IR::QSSModelConfig::eqs
EquationTable eqs
Definition: compute_deps.hpp:80
MicroModelica::IR::QSSModelDepsGenerator::def
QSSModelDepsDef def()
Definition: qss_model_deps.cpp:202
MicroModelica::IR::QSSModelDepsGenerator::initG
void initG(SB::Deps::SetVertex vertex, SB::Deps::SetEdge edge)
Definition: qss_model_deps.cpp:200
MicroModelica::IR::QSSModelDeps::genericDef
std::string genericDef()
Definition: qss_model_deps.cpp:224
MicroModelica::IR::PrintedDeps
list< PrintedDep > PrintedDeps
Definition: compute_deps.hpp:147
MicroModelica::IR::Equation
Definition: equation.hpp:67
MicroModelica::IR::QSSModelDeps::simpleDef
std::string simpleDef()
Definition: qss_model_deps.cpp:222
MicroModelica::IR::FUNCTION_PRINTER::Break
@ Break
Definition: helpers.hpp:144
MicroModelica::IR::DefAlgDepsUse
Definition: compute_deps.hpp:67
TAB
#define TAB
Definition: util.hpp:79
ModelTable< int, Equation >::iterator
std::map< int, Equation >::iterator iterator
Definition: table.hpp:61
MicroModelica::Util::ModelConfig::instance
static ModelConfig & instance()
Definition: model_config.hpp:87
MicroModelica::IR::Equation::setType
void setType(EQUATION::Type type)
Definition: equation.cpp:213
MicroModelica::IR::QSSModelDepsGenerator::visitG
void visitG(SB::Deps::SetVertex v_vertex, SB::Deps::SetVertex g_vertex, SB::Deps::VariableDep var_dep, int index_shift=0)
Definition: qss_model_deps.cpp:170
MicroModelica::IR::QSSModelDepsGenerator::QSSModelDepsGenerator
QSSModelDepsGenerator()
Definition: qss_model_deps.cpp:59
MicroModelica::IR::QSSModelDepsDef::simple
std::string simple
Definition: qss_model_deps.hpp:86
MicroModelica::IR::Equation::setUsage
void setUsage(Index usage)
Definition: equation.hpp:103
MicroModelica::IR::Equation::id
int id() const
Definition: equation.hpp:88
MicroModelica::IR::DepCode
Definition: qss_model_deps.hpp:73
MicroModelica::IR::EQUATION::QSSDerivative
@ QSSDerivative
Definition: equation.hpp:50
MicroModelica::IR::Index
Definition: index.hpp:92
MicroModelica::IR::EQUATION::Dependency
@ Dependency
Definition: equation.hpp:50
derivative.hpp
MicroModelica::IR::DepCode::alg_code
vector< std::string > alg_code
Definition: qss_model_deps.hpp:77
MicroModelica::IR::QSSModelDepsGenerator::setup
void setup(QSSModelConfig _config)
Definition: qss_model_deps.cpp:61
MicroModelica::IR::QSSModelDepsGenerator::config
QSSModelConfig config()
Definition: qss_model_deps.cpp:63
MicroModelica::Generator::MODEL_INSTANCE::Component::Deps
@ Deps
MicroModelica::IR::Equation::applyUsage
void applyUsage(Index usage)
Definition: equation.cpp:215
MicroModelica::IR::Expression::isScalar
bool isScalar() const
Definition: expression.cpp:73
MicroModelica
Definition: files.cpp:45
MicroModelica::IR::DepCode::end
vector< std::string > end
Definition: qss_model_deps.hpp:75
MicroModelica::IR::Equation::hasRange
bool hasRange() const
Definition: equation.hpp:77
MicroModelica::IR::Index::identifier
std::string identifier(bool recursive_use=false) const
Definition: index.cpp:149
MicroModelica::IR::QSSModelDepsGenerator::_post_process_eval
bool _post_process_eval
Definition: qss_model_deps.hpp:108
MicroModelica::IR::getUseRange
Option< Range > getUseRange(Util::Variable variable, DepData dep_data, N node, bool event=false, bool path_recursive_deps=false)
Definition: compute_deps.hpp:173
MicroModelica::IR::DepData
Definition: compute_deps.hpp:149
MicroModelica::IR::QSSModelConfig
Definition: compute_deps.hpp:62
MicroModelica::IR::EQUATION::Algebraic
@ Algebraic
Definition: equation.hpp:50
MicroModelica::IR::checkAlgRecursiveDeps
bool checkAlgRecursiveDeps(Equation eq, AlgDepsMap alg_deps, AlgDepsMap deps)
Definition: compute_deps.cpp:105
MicroModelica::IR::QSSModelDepsGenerator::_alg_deps
AlgDepsMap _alg_deps
Definition: qss_model_deps.hpp:106
qss_model_deps.hpp
MicroModelica::IR::Equation::type
EQUATION::Type type() const
Definition: equation.hpp:89
MicroModelica::Util::ModelConfig::derivatives
IR::EquationTable derivatives()
Definition: model_config.hpp:109
util.hpp
MicroModelica::IR::DepCode::scalar
bool scalar
Definition: qss_model_deps.hpp:78