All pastes #2092507 Raw Edit

Miscellany

public text v1 · immutable
#2092507 ·published 2011-10-22 10:34 UTC
rendered paste body
void reduceRes(multiset<Res*>& res, vector<Res*>& resToReduce)
{
	Node* newA = resToReduce[0]->a;
	Node* newB = resToReduce[0]->b;

	// Do some clean up
	res.erase(resToReduce[0]);

	double resValue = 0;
	for (int i = 0; i < resToReduce.size(); i++)
	{
		// Accumulate the res values
		resValue += 1 / resToReduce[i]->valeur; 

		newA->conn.erase(
			remove(newA->conn.begin(), newA->conn.end(), resToReduce[i]),
			newA->conn.end());
		newB->conn.erase(
			remove(newB->conn.begin(), newB->conn.end(), resToReduce[i]),
			newB->conn.end());

		delete resToReduce[i];
	}

	resValue = 1 / resValue;
	

	Res* newRes = new Res();
	newRes->a = newA;
	newRes->b = newB;
	newRes->valeur = resValue;

	res.insert(newRes);

	newA->conn.push_back(newRes);
	newB->conn.push_back(newRes);
}
 
bool reduceParallel (multiset<Res*>& res)
{
	multiset<Res*>::iterator it = res.begin();
	vector<Res*> resToReduce;

	resToReduce.push_back(*it);

	it++;

	while(it != res.end())
	{
		// If it's the same, add it to the res to reduce
		if (*it == resToReduce[0])
		{
			resToReduce.push_back(*it);
		}
		else if (resToReduce.size() == 1) // If not, but there is only one res in the stack
		{ // change it for the current one
			resToReduce[0] = *it;
		}
		else // If it's different and we have multiple element in the stack, reduce them and return
		{
			reduceRes(res, resToReduce);
			return true;
		}
	}

	// If we finish and the stack has some element, reduce them
	if (resToReduce.size() > 1)
	{
		reduceRes(res, resToReduce);
		return true;
	}

	return false;
}