MicroModelicaCCompiler  4.5.3
qss_model.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.hpp"
21 
22 #include <sstream>
23 
24 #include <ast/parser/parse.hpp>
25 #include <deps/builders/eq_graph_builder.hpp>
26 #include <deps/sbg_graph/build_from_exps.hpp>
27 #include <deps/sb_dependencies.hpp>
28 #include <ir/derivative.hpp>
29 #include <ir/helpers.hpp>
30 #include <ir/index.hpp>
31 #include <util/model_config.hpp>
32 #include <util/util.hpp>
33 #include <util/symbol_table.hpp>
34 
35 namespace MicroModelica {
36 using namespace Deps;
37 using namespace SB;
38 using namespace Util;
39 namespace IR {
40 
41 QSSModelGenerator::QSSModelGenerator() : _qss_model_def(), _tabs(0), _post_process_eval(false) {}
42 
43 void QSSModelGenerator::setup(QSSModelConfig config) { _config = config; }
44 
45 void QSSModelGenerator::postProcess(SB::Deps::SetVertex vertex)
46 {
47  if (_post_process_eval) {
48  return;
49  }
50  EquationTable equations = _config.eqs;
52  std::stringstream simple;
53  std::stringstream generic;
54  for (Equation der = equations.begin(it); !equations.end(it); der = equations.next(it)) {
55  PrintedDeps printed_deps;
56  string alg_code = addAlgDeps(der, SB::Deps::LMapExp(), _der_deps, _alg_deps, printed_deps);
57  der.setAlgCode(alg_code);
58  if (der.hasRange()) {
59  generic << der << endl;
60  } else {
61  simple << der << endl;
62  }
63  }
64  _qss_model_def.simple = simple.str();
65  _qss_model_def.generic = generic.str();
66  _post_process_eval = true;
67 }
68 
69 void QSSModelGenerator::init(SB::Deps::SetVertex vertex) {}
70 
71 void QSSModelGenerator::end() {}
72 
73 void QSSModelGenerator::visitF(SB::Deps::SetVertex vertex, SB::Deps::VariableDep var_dep) {}
74 
75 void QSSModelGenerator::visitF(SB::Deps::SetVertex vertex, SB::Deps::VariableDep var_dep, SB::Deps::SetVertex gen_vertex) {}
76 
77 void QSSModelGenerator::visitG(SB::Deps::SetVertex v_vertex, SB::Deps::SetVertex g_vertex, SB::Deps::VariableDep var_dep, int index_shift)
78 {
79  if (var_dep.isRecursive()) {
80  Equation v_eq = getEquation(v_vertex, _config.eqs);
81  Equation g_eq = getEquation(g_vertex, _config.eqs);
82  DefAlgDepsUse new_dep(g_eq, var_dep);
83  insertAlg(((v_eq.type() == IR::EQUATION::Algebraic) ? _alg_deps : _der_deps), v_eq.id(), new_dep);
84  }
85 }
86 
87 void QSSModelGenerator::visitG(SB::Deps::SetVertex v_vertex, SB::Deps::SetVertex g_vertex, SB::PWLMap use_map,
88  SB::Deps::LMapExp use_map_exp, Expression use_exp, SB::PWLMap def_map, SB::Deps::LMapExp def_map_exp,
89  SB::Set intersection)
90 {
91  Equation v_eq = getEquation(v_vertex, _config.eqs);
92  Equation g_eq = getEquation(g_vertex, _config.eqs);
93  DefAlgDepsUse new_dep(g_eq, def_map, use_exp, use_map_exp, def_map_exp, g_vertex.id());
94  insertAlg(((v_eq.type() == IR::EQUATION::Algebraic) ? _alg_deps : _der_deps), v_eq.id(), new_dep);
95 }
96 
97 void QSSModelGenerator::initG(SB::Deps::SetVertex vertex, SB::Deps::SetEdge edge) {}
98 
99 QSSModelDef QSSModelGenerator::def() { return _qss_model_def; }
100 
101 template <typename GraphBuilder>
103 {
104 }
105 
106 template <typename GraphBuilder>
108 {
111  QSSModelBuilder qss_model;
112  IndexShiftBuilder index_shifts(algebraics);
113  GraphBuilder EQSBGraph(eqs, algebraics);
114  SB::Deps::Graph graph = EQSBGraph.build();
115  QSSModelConfig config;
116  config.eqs = eqs;
117  config.graph = graph;
118  qss_model.setup(config);
119  qss_model.compute(graph, index_shifts.build());
120  _qss_model_def = qss_model.def();
121 }
122 
123 template <typename GraphBuilder>
125 {
126  return _qss_model_def.simple;
127 }
128 
129 template <typename GraphBuilder>
131 {
132  return _qss_model_def.generic;
133 }
134 
135 template class QSSModel<SDSBGraphBuilder>;
136 
137 template class QSSModel<SZSBGraphBuilder>;
138 
139 template class QSSModel<SOSBGraphBuilder>;
140 
141 } // namespace IR
142 } // namespace MicroModelica
ModelTable< int, Equation >
MicroModelica::IR::QSSModel
Definition: qss_model.hpp:103
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::Util::ModelConfig::symbols
VarSymbolTable & symbols()
Definition: model_config.hpp:122
index.hpp
MicroModelica::IR::QSSModelGenerator::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.cpp:94
MicroModelica::IR::QSSModelGenerator::initG
void initG(SB::Deps::SetVertex vertex, SB::Deps::SetEdge edge)
Definition: qss_model.cpp:114
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
qss_model.hpp
helpers.hpp
model_config.hpp
MicroModelica::IR::QSSModelConfig::graph
SB::Deps::Graph graph
Definition: compute_deps.hpp:81
MicroModelica::IR::Expression
Definition: expression.hpp:64
MicroModelica::IR::QSSModelGenerator::def
QSSModelDef def()
Definition: qss_model.cpp:116
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::QSSModel::QSSModel
QSSModel()
Definition: qss_model.cpp:119
MicroModelica::IR::PrintedDeps
list< PrintedDep > PrintedDeps
Definition: compute_deps.hpp:147
MicroModelica::IR::Equation
Definition: equation.hpp:67
MicroModelica::IR::QSSModelGenerator::QSSModelGenerator
QSSModelGenerator()
Definition: qss_model.cpp:58
MicroModelica::IR::QSSModel::genericDef
std::string genericDef()
Definition: qss_model.cpp:147
MicroModelica::IR::DefAlgDepsUse
Definition: compute_deps.hpp:67
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::QSSModelGenerator::init
void init(SB::Deps::SetVertex vertex)
Definition: qss_model.cpp:86
MicroModelica::IR::QSSModelDef
Definition: qss_model.hpp:69
MicroModelica::IR::QSSModelGenerator::end
void end()
Definition: qss_model.cpp:88
MicroModelica::IR::Equation::id
int id() const
Definition: equation.hpp:88
MicroModelica::IR::QSSModelGenerator::postProcess
void postProcess(SB::Deps::SetVertex vertex)
Definition: qss_model.cpp:62
derivative.hpp
MicroModelica::Generator::MODEL_INSTANCE::Component::Deps
@ Deps
MicroModelica
Definition: files.cpp:45
MicroModelica::IR::QSSModelGenerator::setup
void setup(QSSModelConfig config)
Definition: qss_model.cpp:60
MicroModelica::IR::QSSModelConfig
Definition: compute_deps.hpp:62
MicroModelica::IR::QSSModel::simpleDef
std::string simpleDef()
Definition: qss_model.cpp:141
MicroModelica::IR::EQUATION::Algebraic
@ Algebraic
Definition: equation.hpp:50
MicroModelica::IR::QSSModelGenerator::visitF
void visitF(SB::Deps::SetVertex vertex, SB::Deps::VariableDep var_dep)
Definition: qss_model.cpp:90
MicroModelica::IR::QSSModel::build
void build(EquationTable eqs)
Definition: qss_model.cpp:124
MicroModelica::IR::Equation::type
EQUATION::Type type() const
Definition: equation.hpp:89
util.hpp