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>
41 template <
typename NT,
typename N,
typename Config>
46 template <
typename NT,
typename N,
typename Config>
52 template <
typename NT,
typename N,
typename Config>
58 template <
typename NT,
typename N,
typename Config>
61 int size = dep_code.
code.size();
62 for (
int i = 0; i < size; i++) {
63 code << dep_code.
begin[i];
65 if (!dep_code.
end[i].empty()) {
66 code << dep_code.
end[i] << endl;
71 template <
typename NT,
typename N,
typename Config>
75 string component = _config.component[0];
76 bool use_component = _config.use_component[mode];
78 component = _config.component[1];
80 if (!component.empty() && use_component) {
81 buffer <<
"." << component;
86 template <
typename NT,
typename N,
typename Config>
89 map<string, MatrixCode> deps_code;
90 NT nodes = _config.selector.getNodes();
92 std::stringstream code;
94 for (
auto variable : _deps) {
95 list<DepData> var_deps = variable.second;
98 for (
DepData var_dep : var_deps) {
99 string matrix = _config.names[method + mode];
100 string access = _config.access[mode];
101 std::stringstream begin;
102 std::stringstream end;
103 std::stringstream buffer;
104 N node = _config.selector.getNode(var_dep.id);
106 Option<Range> range = getUseRange<N>(ifr.get(), var_dep, node, _config.selector.multipleNodes());
107 Index ifr_idx(use_exp);
108 string ifr_id = ifr_idx.identifier();
109 N ifr_node = _config.selector.setUsage(ifr_idx, node, range);
110 ifr_node = _config.selector.getScalarUsage(var_dep.var_dep.equations(), use_exp, ifr_node, ifr_idx);
111 Index ife_idx(_config.selector.exp(ifr_node));
112 Index ife_orig_idx = ife_idx;
113 Index ifr_orig_idx = ifr_idx;
115 Index swap = ifr_idx;
119 Index ifr_range_idx = ifr_idx;
120 Index ife_range_idx = ife_idx;
121 ifr_idx = ifr_idx.
replace(range);
122 ife_idx = ife_idx.
replace(range);
123 if (deps_code.find(ifr_id) == deps_code.end()) {
125 deps_code[ifr_id] = dep_code;
129 if (!var_dep.var_dep.isRecursive()) {
130 range->replace(ife_range_idx, ifr_range_idx);
132 dep_code.
begin.push_back(range->print());
133 dep_code.
end.push_back(range->end());
134 buffer << range->block();
136 if (ifr_orig_idx.
isConstant() && ifr_node.hasRange()) {
137 Range der_range = ifr_node.range().get();
138 der_range.replace(ife_orig_idx);
139 dep_code.
begin.push_back(der_range.print());
140 dep_code.
end.push_back(der_range.end());
141 buffer << der_range.block();
143 dep_code.
begin.push_back(
"");
144 dep_code.
end.push_back(
"");
148 buffer << _config.container << matrix <<
"[" << ifr_idx <<
"]" << component(
MATRIX::Alloc, mode) <<
"++;" << endl;
150 buffer << _config.container << matrix <<
"[" << ifr_idx <<
"]" << component(
MATRIX::Init, mode) <<
"[" << access <<
"[" << ifr_idx
151 <<
"]++] = " << ife_idx <<
";" << endl;
153 dep_code.
code.push_back(buffer.str());
154 deps_code[ifr_id] = dep_code;
157 for (
auto dc : deps_code) {
158 MatrixCode dep_code = dc.second;
159 addCode(dep_code, code);
162 _model_matrix_def.alloc[mode] = code.str();
164 _model_matrix_def.init[mode] = code.str();
168 template <
typename NT,
typename N,
typename Config>
171 if (_post_process_eval) {
178 _post_process_eval =
true;
181 template <
typename NT,
typename N,
typename Config>
186 template <
typename NT,
typename N,
typename Config>
191 template <
typename NT,
typename N,
typename Config>
194 if (!_config.selector.isAlgebraic(vertex)) {
195 string var_name = var_dep.var().name();
196 DepData dep_data(_config.selector.id(vertex), var_dep);
197 if (!
findDep(_deps, dep_data, _config.selector.multipleNodes())) {
198 list<DepData> deps = _deps[var_name];
199 deps.push_back(dep_data);
200 _deps[var_name] = deps;
205 template <
typename NT,
typename N,
typename Config>
210 template <
typename NT,
typename N,
typename Config>
214 list<SB::Deps::VariableDep> pure_recursive_deps = g_vertex.desc().pureRecursiveDeps();
215 if (!_config.selector.isAlgebraic(v_vertex) && !var_dep.var().isAlgebraic()) {
216 string var_name = var_dep.var().name();
217 const bool FROM_ALG =
true;
218 const bool REC_DEPS = pure_recursive_deps.size() > 0 || var_dep.isRecursive();
219 SB::Deps::VariableDep dep = var_dep;
220 dep.setRecursive(REC_DEPS);
221 DepData dep_data(_config.selector.id(v_vertex), dep, FROM_ALG);
222 if (!
findDep(_deps, dep_data, _config.selector.multipleNodes())) {
223 list<DepData> deps = _deps[var_name];
224 deps.push_back(dep_data);
225 _deps[var_name] = deps;
230 template <
typename NT,
typename N,
typename Config>
232 SB::Deps::LMapExp use_map_exp,
Expression use_exp, SB::PWLMap def_map,
233 SB::Deps::LMapExp def_map_exp, SB::Set intersection)
237 template <
typename NT,
typename N,
typename Config>
242 template <
typename NT,
typename N,
typename Config>
245 return _model_matrix_def;
250 template class MatrixConfig<Deps::EQSelector>;
252 template class MatrixConfig<Deps::EVSelector>;