31 Expression
getUseExp(Variable variable, DepData dep_data)
33 if (variable.isScalar()) {
36 Index use_idx(dep_data.var_dep.exp());
37 vector<string> vars = use_idx.variables();
38 if (dep_data.var_dep.isRecursive()) {
41 vector<string> exps = dep_data.var_dep.nMap().apply(vars);
50 string var_name = dep_data.
var_dep.var().name();
51 list<DepData> var_deps = deps[var_name];
53 SB::Set dom = dep.var_dep.mapF().wholeDom();
54 SB::Set dep_eq_image = dep.var_dep.mapF().image(dom);
55 SB::Set new_dom = dep_data.
var_dep.mapF().wholeDom();
56 SB::Set new_dep_eq_image = dep_data.
var_dep.mapF().image(new_dom);
57 if ((dep.id == dep_data.
id) && dep.var_dep.isRecursive() && dep_data.
var_dep.isRecursive() && dep.var_dep.var().name() == var_name) {
60 if ((dep.id == dep_data.
id) && (dep_eq_image == new_dep_eq_image) && (dep.var_dep.nMap() == dep_data.
var_dep.nMap())) {
64 SB::Set dep_var_image = dep.var_dep.mapU().image(dom);
65 SB::Set new_dep_var_image = dep_data.
var_dep.mapU().image(new_dom);
66 if ((dep.id == dep_data.
id) && (dep_var_image == new_dep_var_image) && (dep.var_dep.nMap() == dep_data.
var_dep.nMap())) {
74 bool findAlgDep(
PrintedDeps printed_deps,
int id, SB::Set range, SB::Deps::LMapExp use_map, SB::Deps::LMapExp eq_use_map)
76 for (PrintedDep dep : printed_deps) {
77 if (dep.id ==
id && dep.range == range && dep.use_map == use_map) {
78 if (eq_use_map.constantExp()) {
79 return dep.eq_use_map == eq_use_map;
90 AlgDeps algs = alg_deps[eq.id()];
91 bool recursive_deps =
false;
95 return recursive_deps;
99 recursive_deps = recursive_deps || alg.recursive;
100 if (recursive_deps) {
101 return recursive_deps;
104 return recursive_deps;
112 code <<
addAlgDeps(alg.eq, alg.use_map, deps, deps, printed_deps, alg.recursive);
114 for (DefAlgDepsUse alg : algs) {
115 bool RECURSIVE = alg.recursive || comes_from_rec;
117 vector<string> vars = use.variables();
118 SB::Set var_range = alg.use.image(alg.range);
119 Range range(var_range, alg.offset, vars);
124 SB::Deps::LMapExp eq_use_exp = eq_use;
125 if (!eq_use.constantExp()) {
126 eq_use_exp = eq_use.revert();
128 SB::Deps::LMapExp use_map = alg.use_map.compose(eq_use_exp);
129 if (!use_map.constantExp() && !alg.use_map.constantExp() && !alg.def_map.isEmpty()) {
130 use_map = alg.def_map.solve(use_map);
132 vector<string> exps = use_map.apply(vars);
133 if (
findAlgDep(printed_deps, alg.eq.id(), var_range, use_map, eq_use)) {
136 PrintedDep printed_dep;
137 printed_dep.id = alg.eq.id();
138 printed_dep.range = var_range;
139 printed_dep.use_map = use_map;
140 printed_dep.eq_use_map = eq_use;
141 printed_deps.push_back(printed_dep);
143 Index use_idx = Index(use_exp);
144 if (gen_eq.
hasRange() && RECURSIVE) {
145 Range range = gen_eq.
range().get();
147 code << range.print(
true,
true);
148 code <<
"_get" << gen_eq.
LHSVariable().get() <<
"_idxs(" << range.getDimensionVarsString(
true) <<
");" << endl;
149 use_idx = Index(gen_eq.
lhs());
151 FunctionPrinter printer;
152 if (use_idx.isConstant() && gen_eq.
hasRange()) {
153 if (!gen_eq.
range()->checkUsage(use_idx, gen_eq.
index())) {
160 code << printer.printAlgebraicGuards(gen_eq, use_idx);
161 code <<
TAB << gen_eq;
162 code << printer.endDimGuards(gen_eq.range());
163 if (gen_eq.hasRange() && RECURSIVE) {
164 code <<
TAB << gen_eq.range()->end() << endl;
173 algs.insert(new_dep);
179 vector<string> idx_vars = index.variables();
180 vector<string> range_vars = range.getIndexes();
181 for (
string idx_var : idx_vars) {
183 for (
string range_var : range_vars) {
184 if (idx_var == range_var) {
198 vector<string> index_vars = index.
variables();
200 for (
string idx_var : index_vars) {
201 ret_vars.push_back(idx_var);
203 sort(ret_vars.begin(), ret_vars.end());
204 ret_vars.erase(unique(ret_vars.begin(), ret_vars.end()), ret_vars.end());