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;
}