//update face information after inserting a merger ith edge e in a copy graph void CombinatorialEmbedding::updateMerger(edge e, face fRight, face fLeft) { //two cases: a single face/two faces fRight->m_size++; fLeft->m_size++; m_rightFace[e->adjSource()] = fRight; m_rightFace[e->adjTarget()] = fLeft; //check for first adjacency entry if (fRight != fLeft) { fRight->entries.m_adjFirst = e->adjSource(); fLeft->entries.m_adjFirst = e->adjTarget(); }//if }//updateMerger
edge ExpandedGraph2::insertEdge(node vG, node wG, edge eG) { node &rVG = m_GtoExp[vG]; node &rWG = m_GtoExp[wG]; if (rVG == 0) { rVG = m_exp.newNode(); m_nodesG.pushBack(vG); } if (rWG == 0) { rWG = m_exp.newNode(); m_nodesG.pushBack(wG); } edge e1 = m_exp.newEdge(rVG,rWG); if(eG != 0) { m_expToG[e1->adjSource()] = eG->adjSource(); m_expToG[e1->adjTarget()] = eG->adjTarget(); } else { m_expToG[e1->adjSource()] = 0; m_expToG[e1->adjTarget()] = 0; } return e1; }
face CombinatorialEmbedding::joinFacesPure(edge e) { OGDF_ASSERT(e->graphOf() == m_pGraph); // get the two faces adjacent to e face f1 = m_rightFace[e->adjSource()]; face f2 = m_rightFace[e->adjTarget()]; OGDF_ASSERT(f1 != f2); // we will reuse the largest face and delete the other one if (f2->m_size > f1->m_size) swap(f1,f2); // the size of the joined face is the sum of the sizes of the two faces // f1 and f2 minus the two adjacency entries of e f1->m_size += f2->m_size - 2; // If the stored (first) adjacency entry of f1 belongs to e, we must set // it to the next entry in the face, because we will remove it by deleting // edge e if (f1->entries.m_adjFirst->theEdge() == e) f1->entries.m_adjFirst = f1->entries.m_adjFirst->faceCycleSucc(); // each adjacency entry in f2 belongs now to f1 adjEntry adj1 = f2->firstAdj(), adj = adj1; do { m_rightFace[adj] = f1; } while((adj = adj->faceCycleSucc()) != adj1); faces.del(f2); return f1; }
node CombinatorialEmbedding::contract(edge e) { // Since we remove face e, we also remove adjSrc and adjTgt. // We make sure that node of them is stored as first adjacency // entry of a face. adjEntry adjSrc = e->adjSource(); adjEntry adjTgt = e->adjTarget(); face fSrc = m_rightFace[adjSrc]; face fTgt = m_rightFace[adjTgt]; if (fSrc->entries.m_adjFirst == adjSrc) { adjEntry adj = adjSrc->faceCycleSucc(); fSrc->entries.m_adjFirst = (adj != adjTgt) ? adj : adj->faceCycleSucc(); } if (fTgt->entries.m_adjFirst == adjTgt) { adjEntry adj = adjTgt->faceCycleSucc(); fTgt->entries.m_adjFirst = (adj != adjSrc) ? adj : adj->faceCycleSucc(); } node v = m_pGraph->contract(e); --fSrc->m_size; --fTgt->m_size; OGDF_ASSERT_IF(dlConsistencyChecks, consistencyCheck()); return v; }
void CombinatorialEmbedding::unsplit(edge eIn, edge eOut) { face f1 = m_rightFace[eIn->adjSource()]; face f2 = m_rightFace[eIn->adjTarget()]; --f1->m_size; --f2->m_size; if (f1->entries.m_adjFirst == eOut->adjSource()) f1->entries.m_adjFirst = eIn->adjSource(); if (f2->entries.m_adjFirst == eIn->adjTarget()) f2->entries.m_adjFirst = eOut->adjTarget(); m_pGraph->unsplit(eIn,eOut); }
edge CombinatorialEmbedding::split(edge e) { face f1 = m_rightFace[e->adjSource()]; face f2 = m_rightFace[e->adjTarget()]; edge e2 = m_pGraph->split(e); m_rightFace[e->adjSource()] = m_rightFace[e2->adjSource()] = f1; f1->m_size++; m_rightFace[e->adjTarget()] = m_rightFace[e2->adjTarget()] = f2; f2->m_size++; OGDF_ASSERT_IF(dlConsistencyChecks, consistencyCheck()); return e2; }
edge VarEdgeInserterDynCore::ExpandedGraph::insertEdge(node vG, node wG, edge eG) { node &rVG = m_GtoExp[vG]; node &rWG = m_GtoExp[wG]; if (rVG == nullptr) { rVG = m_exp.newNode(); m_nodesG.pushBack(vG); } if (rWG == nullptr) { rWG = m_exp.newNode(); m_nodesG.pushBack(wG); } edge e1 = m_exp.newEdge(rVG, rWG); if (eG != nullptr) { m_expToG[e1->adjSource()] = eG->adjSource(); m_expToG[e1->adjTarget()] = eG->adjTarget(); } else { m_expToG[e1->adjSource()] = nullptr; m_expToG[e1->adjTarget()] = nullptr; } return e1; }
forall_edges(e,G) { const BendString &bs1 = bend(e->adjSource()); const BendString &bs2 = bend(e->adjTarget()); if (bs1.size() != bs2.size()) { error.sprintf( "Size of corresponding bend strings at edge %d differ!", e->index()); return false; } size_t i = 0, j = bs2.size()-1; while(i < bs1.size()) { if (bs1[i] != flip(bs2[j])) { error.sprintf( "Corresponding bend strings at edge %d not consistent!", e->index()); return false; } ++i; --j; } }