示例#1
0
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);
	}
}
示例#2
0
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;
	}
}
示例#3
0
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;
	}
}
示例#4
0
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;
	}
}
示例#5
0
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;
	} 
}