void VarEdgeInserterDynCore::blockInsert(node s, node t, List<adjEntry> &L) { L.clear(); // find path in SPQR-tree from an allocation node of s // to an allocation node of t SList<node>& path = m_pBC->dynamicSPQRForest().findPathSPQR(s, t); // call build_subpath for every R-node building the list L of crossed edges ExpandedGraph *pExp = createExpandedGraph(*m_pBC); node vPred = nullptr; path.pushBack(nullptr); SListConstIterator<node> it; for (it = path.begin(); *it; ++it) { node v = *it; node vSucc = *it.succ(); if (m_pBC->dynamicSPQRForest().typeOfTNode(v) == DynamicSPQRForest::RComp) buildSubpath(v, vPred, vSucc, L, *pExp, s, t); vPred = v; } delete &path; delete pExp; }
void OptimalRanking::call (const Graph& G, NodeArray<int> &rank) { List<edge> R; m_subgraph.get().call(G,R); EdgeArray<bool> reversed(G,false); for (edge e : R) reversed[e] = true; R.clear(); EdgeArray<int> length(G,1); if(m_separateMultiEdges) { SListPure<edge> edges; EdgeArray<int> minIndex(G), maxIndex(G); parallelFreeSortUndirected(G, edges, minIndex, maxIndex); SListConstIterator<edge> it = edges.begin(); if(it.valid()) { int prevSrc = minIndex[*it]; int prevTgt = maxIndex[*it]; for(it = it.succ(); it.valid(); ++it) { edge e = *it; if (minIndex[e] == prevSrc && maxIndex[e] == prevTgt) length[e] = 2; else { prevSrc = minIndex[e]; prevTgt = maxIndex[e]; } } } } EdgeArray<int> cost(G,1); doCall(G, rank, reversed, length, cost); }
void UpwardPlanRep::insertEdgePathEmbedded(edge eOrig, SList<adjEntry> crossedEdges, EdgeArray<int> &costOrig) { removeSinkArcs(crossedEdges); //case the copy v of eOrig->source() is a sink switch //we muss remove the sink arcs incident to v, since after inserting eOrig, v is not a sink witch node v = crossedEdges.front()->theNode(); List<edge> outEdges; if (v->outdeg() == 1) v->outEdges(outEdges); // we delete these edges later m_eCopy[eOrig].clear(); adjEntry adjSrc, adjTgt; SListConstIterator<adjEntry> it = crossedEdges.begin(); // iterate over all adjacency entries in crossedEdges except for first // and last adjSrc = *it; List<adjEntry> dirtyList; // left and right face of the element of this list are modified for(++it; it.valid() && it.succ().valid(); ++it) { adjEntry adj = *it; bool isASourceArc = false, isASinkArc = false; if (m_isSinkArc[adj->theEdge()]) isASinkArc = true; if (m_isSourceArc[adj->theEdge()]) isASourceArc = true; int c = 0; if (original(adj->theEdge()) != nullptr) c = costOrig[original(adj->theEdge())]; // split edge node u = m_Gamma.split(adj->theEdge())->source(); if (!m_isSinkArc[adj->theEdge()] && !m_isSourceArc[adj->theEdge()]) crossings = crossings + c; // crossing sink/source arcs cost nothing // determine target adjacency entry and source adjacency entry // in the next iteration step adjTgt = u->firstAdj(); adjEntry adjSrcNext = adjTgt->succ(); if (adjTgt != adj->twin()) std::swap(adjTgt, adjSrcNext); edge e_split = adjTgt->theEdge(); // the new split edge if (e_split->source() != u) e_split = adjSrcNext->theEdge(); if (isASinkArc) m_isSinkArc[e_split] = true; if (isASourceArc) m_isSourceArc[e_split] = true; // insert a new edge into the face edge eNew = m_Gamma.splitFace(adjSrc,adjTgt); m_eIterator[eNew] = GraphCopy::m_eCopy[eOrig].pushBack(eNew); m_eOrig[eNew] = eOrig; dirtyList.pushBack(eNew->adjSource()); adjSrc = adjSrcNext; } // insert last edge edge eNew = m_Gamma.splitFace(adjSrc,*it); m_eIterator[eNew] = m_eCopy[eOrig].pushBack(eNew); m_eOrig[eNew] = eOrig; dirtyList.pushBack(eNew->adjSource()); // remove the sink arc incident to v if(!outEdges.empty()) { edge e = outEdges.popFrontRet(); if (m_isSinkArc[e]) m_Gamma.joinFaces(e); } m_Gamma.setExternalFace(m_Gamma.rightFace(extFaceHandle)); //computeSinkSwitches(); FaceSinkGraph fsg(m_Gamma, s_hat); List<adjEntry> dummyList; FaceArray< List<adjEntry> > sinkSwitches(m_Gamma, dummyList); fsg.sinkSwitches(sinkSwitches); //construct sinkArc for the dirty faces for(adjEntry adj : dirtyList) { face fLeft = m_Gamma.leftFace(adj); face fRight = m_Gamma.rightFace(adj); List<adjEntry> switches = sinkSwitches[fLeft]; OGDF_ASSERT(!switches.empty()); constructSinkArcs(fLeft, switches.front()->theNode()); OGDF_ASSERT(!switches.empty()); switches = sinkSwitches[fRight]; constructSinkArcs(fRight, switches.front()->theNode()); } m_Gamma.setExternalFace(m_Gamma.rightFace(extFaceHandle)); computeSinkSwitches(); }