191 if (pMinSpanningTree.empty())
198 meshIndexMatrix.clear();
201 std::vector<EdgeP> linksToBeAdded;
202 for (
auto i = pEdgesList.begin(); i != pEdgesList.end(); i++)
205 if (std::find(pMinSpanningTree.begin(), pMinSpanningTree.end(), (*i))
206 == pMinSpanningTree.end())
208 linksToBeAdded.push_back(*i);
212 std::vector<EdgeIncidence> incidenceMatrix(linksToBeAdded.size());
213 for (uint i = 0; i < linksToBeAdded.size(); i++)
215 incidenceMatrix[i] = getIncidenceVector(linksToBeAdded[i]);
218 for (uint i = 0; i < linksToBeAdded.size(); i++)
220 logs.info() <<
"Searching basis (loop " << i + 1 <<
"/" << linksToBeAdded.size() <<
")";
223 getDuplicatedGrid(polarisedDuplicate);
224 VectorEdgeP v = getEdgeVectorFromIncidence(incidenceMatrix[i]);
227 VectorNodeP adjacentNodes;
230 for (uint j = 0; j < v.size(); j++)
232 if (std::find(adjacentNodes.begin(), adjacentNodes.end(), v[j]->getOrigin())
233 == adjacentNodes.end())
235 adjacentNodes.push_back(v[j]->getOrigin());
237 if (std::find(adjacentNodes.begin(), adjacentNodes.end(), v[j]->getDestination())
238 == adjacentNodes.end())
240 adjacentNodes.push_back(v[j]->getDestination());
244 v[j]->getDestination()->getName()
251 polarisedDuplicate.
addEdge(ni1, ni2, ei->getWeight());
252 polarisedDuplicate.removeEdge(ei);
255 v[j]->getDestination()->getName() +
"-");
257 ni1 = polarisedDuplicate.
findNodeFromName(v[j]->getOrigin()->getName() +
"-");
258 ni2 = polarisedDuplicate.
findNodeFromName(v[j]->getDestination()->getName() +
"+");
260 polarisedDuplicate.
addEdge(ni1, ni2, ei->getWeight());
261 polarisedDuplicate.removeEdge(ei);
265 v = polarisedDuplicate.twoLevelPath(adjacentNodes);
269 std::vector<int> edgeIndices;
270 for (
typename VectorEdgeP::iterator e = v.begin(); e != v.end(); e++)
272 auto name1 = (*e)->getOrigin()->getName();
273 name1 = name1.substr(0, name1.length() - 1);
274 auto name2 = (*e)->getDestination()->getName();
275 name2 = name2.substr(0, name2.length() - 1);
276 EdgeP ei = findEdgeFromNodeNames(name1, name2);
279 auto eIT = std::find(pEdgesList.begin(), pEdgesList.end(), ei);
280 int pos = (int)std::distance(pEdgesList.begin(), eIT);
281 edgeIndices.push_back(pos);
285 EdgeIncidence I = getIncidenceVector(Ci);
286 meshIndexMatrix.push_back(edgeIndices);
288 for (uint j = i + 1; j < linksToBeAdded.size(); j++)
290 if (incidenceInnerProduct(I, incidenceMatrix[j]) == 1)
292 incidenceMatrix[j] = incidenceXOR(incidenceMatrix[i], incidenceMatrix[j]);
308 for (
typename VectorNodeP::iterator node = pNodesList.begin(); node != pNodesList.end(); node++)
311 grid.
addNode((*(*node)->nodeProperties), (*node)->getName() +
"+");
315 grid.
addNode((*(*node)->nodeProperties), (*node)->getName() +
"-");
320 for (
typename VectorEdgeP::iterator e = pEdgesList.begin(); e != pEdgesList.end(); e++)
323 auto nodeOrigIT = std::find_if(grid.pNodesList.begin(),
324 grid.pNodesList.end(),
325 [&e](
const NodeP& nodeP) ->
bool {
326 return nodeP->getName()
327 == (*e)->getOrigin()->getName() +
"+";
330 auto nodeDestIT = std::find_if(grid.pNodesList.begin(),
331 grid.pNodesList.end(),
332 [&e](
const NodeP& nodeP) ->
bool {
333 return nodeP->getName()
334 == (*e)->getDestination()->getName() +
"+";
337 grid.
addEdge(*nodeOrigIT, *nodeDestIT, (*e)->getWeight());
341 auto nodeOrigIT = std::find_if(grid.pNodesList.begin(),
342 grid.pNodesList.end(),
343 [&e](
const NodeP& nodeP) ->
bool {
344 return nodeP->getName()
345 == (*e)->getOrigin()->getName() +
"-";
348 auto nodeDestIT = std::find_if(grid.pNodesList.begin(),
349 grid.pNodesList.end(),
350 [&e](
const NodeP& nodeP) ->
bool {
351 return nodeP->getName()
352 == (*e)->getDestination()->getName() +
"-";
355 grid.
addEdge(*nodeOrigIT, *nodeDestIT, (*e)->getWeight());
369 for (
typename VectorNodeP::iterator node = pNodesList.begin(); node != pNodesList.end(); node++)
372 grid.
addNode((*(*node)->nodeProperties), (*node)->getName());
377 for (
typename VectorEdgeP::iterator e = pEdgesList.begin(); e != pEdgesList.end(); e++)
380 auto nodeOrigIT = std::find_if(grid.pNodesList.begin(),
381 grid.pNodesList.end(),
382 [&e](
const NodeP& nodeP) ->
bool {
383 return nodeP->getName()
384 == (*e)->getOrigin()->getName();
387 auto nodeDestIT = std::find_if(grid.pNodesList.begin(),
388 grid.pNodesList.end(),
389 [&e](
const NodeP& nodeP) ->
bool {
390 return nodeP->getName()
391 == (*e)->getDestination()->getName();
394 grid.
addEdge(*nodeOrigIT, *nodeDestIT, (*e)->getWeight());
403 VectorEdgeP SP, minSP;
404 double minLength = DBL_MAX, length;
405 for (
typename VectorNodeP::iterator n = vN.begin(); n != vN.end(); n++)
407 SP = findShortestPath(findNodeFromName((*n)->getName() +
"+"),
408 findNodeFromName((*n)->getName() +
"-"));
409 length = std::accumulate(SP.begin(),
413 if (length < minLength)
427 assert(node1 != node2);
431 std::map<NodeP, double> dist;
432 std::map<NodeP, NodeP> prev;
435 [[maybe_unused]]
bool checkNode1(
false), checkNode2(
false);
436 VectorNodeP nodes = pNodesList;
438 for (
auto i = nodes.begin(); i != nodes.end(); i++)
446 else if ((*i) == node2)
451 assert(checkNode1 && checkNode2);
458 std::pair<Grid::NodeP, double> u(
nullptr, inf - 1);
459 typename Grid::VectorNodeP::iterator ui;
460 for (
auto i = nodes.begin(); i != nodes.end(); i++)
462 if (dist[(*i)] < u.second)
465 u.second = dist[(*i)];
471 if (u.first == node2)
481 for (
auto i = adjency.at(u.first).begin(); i != adjency.at(u.first).end(); i++)
483 if (i->second ==
nullptr)
488 if ((u.second + i->second->getWeight()) < dist[i->first])
490 dist[i->first] = u.second + i->second->getWeight();
491 prev[i->first] = u.first;
497 Grid::VectorEdgeP path;
500 while (prev[currentNode] !=
nullptr)
502 path.push_back(adjency.at(currentNode).at(prev[currentNode]));
503 currentNode = prev[currentNode];