void update_iters_sg(graph &g, subgraph *sg) { vector<iterOp_t>::iterator i; for (i = sg->sg_iterator.conditions.begin(); i != sg->sg_iterator.conditions.end(); ++i) { vector<string> separate; boost::split(separate, i->right, boost::is_any_of("+")); string newString = g.get_iter_rep(separate[0]); for (unsigned int k=1; k < separate.size(); ++k) { newString += "+" + g.get_iter_rep(separate[k]); } i->right = newString; } for (i = sg->sg_iterator.updates.begin(); i != sg->sg_iterator.updates.end(); ++i) { vector<string> separate; boost::split(separate, i->right, boost::is_any_of("+")); string newString = g.get_iter_rep(separate[0]); for (unsigned int k = 1; k < separate.size(); ++k) { newString += "+" + g.get_iter_rep(separate[k]); } i->right = newString; } for (auto i : sg->subs) { update_iters_sg(g, i); } }
void get_latest(type &ct, graph &g) { type *t = &ct; while (t) { if (t->k == scalar) break; t->dim.dim = g.get_iter_rep(t->dim.dim); t->dim.step = g.get_iter_rep(t->dim.step); string tmp = g.get_iter_rep(t->dim.lead_dim); t->dim.lead_dim = g.get_iter_rep(tmp); t->dim.base_rows = g.get_iter_rep(t->dim.base_rows); t->dim.base_cols = g.get_iter_rep(t->dim.base_cols); t = t->t; } }
void register_type(type &r, graph &g) { type *t = &r; while (t) { g.register_iter(t->dim.dim); t->dim.dim = g.get_iter_rep(t->dim.dim); t = t->t; } }
void merge_all_types(type &l, type &r, graph &g) { if (l.height != r.height) std::cout << "ERROR: build_graph.cpp: merge_all_types(): unexpected types\n"; type *pl = &l; type *pr = &r; while (pl && pr) { g.merge_iters(pl->dim.dim, pr->dim.dim); pl->dim.dim = g.get_iter_rep(pl->dim.dim); pr->dim.dim = g.get_iter_rep(pr->dim.dim); pl = pl->t; pr = pr->t; } }
void mult_sizes(type *u, type *l, type *r, graph &g) { if (l->k == row && r->k == column) { // operands g.merge_iters(l->dim.dim, r->dim.dim); r->dim.dim = g.get_iter_rep(r->dim.dim); l->dim.dim = g.get_iter_rep(l->dim.dim); mult_sizes(u,l->t,r->t,g); } else if (l->k == column && r->k == row) { if (u->k == row) { g.merge_iters(r->dim.dim,u->dim.dim); r->dim.dim = g.get_iter_rep(u->dim.dim); u->dim.dim = g.get_iter_rep(u->dim.dim); mult_sizes(u->t, l, r->t, g); } else { g.merge_iters(l->dim.dim,u->dim.dim); l->dim.dim = g.get_iter_rep(u->dim.dim); u->dim.dim = g.get_iter_rep(u->dim.dim); mult_sizes(u->t, l->t, r, g); } } else if ((l->k == scalar && r->k == column) || (l->k == scalar && r->k == row)) { // scaling g.merge_iters(r->dim.dim,u->dim.dim); r->dim.dim = g.get_iter_rep(r->dim.dim); u->dim.dim = g.get_iter_rep(u->dim.dim); } else if ((l->k == row && r->k == scalar) || (l->k == column && r->k == scalar)) { // scaling g.merge_iters(l->dim.dim, u->dim.dim); l->dim.dim = g.get_iter_rep(l->dim.dim); u->dim.dim = g.get_iter_rep(u->dim.dim); } else if (l->k == row && r->k == row) { if (u->k == row) { // result and one or other operand g.merge_iters(u->dim.dim, r->dim.dim); r->dim.dim = g.get_iter_rep(r->dim.dim); u->dim.dim = g.get_iter_rep(u->dim.dim); mult_sizes(u->t,l,r->t,g); } else if (u->k == column) { // k g.merge_iters(l->dim.dim, r->t->dim.dim); r->t->dim.dim = g.get_iter_rep(l->dim.dim); l->dim.dim = g.get_iter_rep(l->dim.dim); type *tmp = new type(*(r->t)); if (tmp->k == row) tmp->k = column; else tmp->k = row; tmp->dim.dim = r->dim.dim; tmp->dim.step = r->dim.step; mult_sizes(u,l->t,tmp,g); delete tmp; } } else if (l->k == column && r->k == column) { if (u->k == row) { // k g.merge_iters(l->t->dim.dim, r->dim.dim); l->t->dim.dim = g.get_iter_rep(r->dim.dim); r->dim.dim = g.get_iter_rep(r->dim.dim); type *tmp = new type(*(l->t)); if (tmp->k == row) tmp->k = column; else tmp->k = row; tmp->dim.dim = l->dim.dim; tmp->dim.step = l->dim.step; mult_sizes(u,tmp,r->t,g); delete tmp; } else if (u->k == column) { // result and one or other operand g.merge_iters(u->dim.dim, l->dim.dim); l->dim.dim = g.get_iter_rep(u->dim.dim); u->dim.dim = g.get_iter_rep(u->dim.dim); mult_sizes(u->t,l->t,r,g); } } else { // must be be scalar * scalar return; } }