// Function ReplacePartialRoot replaces all full nodes by a single P-node // with leaves corresponding the keys stored in leafKeys. void PlanarPQTree::ReplacePartialRoot(SListPure<PlanarLeafKey<indInfo*>*> &leafKeys) { m_pertinentRoot->childCount(m_pertinentRoot->childCount() + 1 - fullChildren(m_pertinentRoot)->size()); while (fullChildren(m_pertinentRoot)->size() > 1) removeChildFromSiblings(fullChildren(m_pertinentRoot)->popFrontRet()); PQNode<edge,indInfo*,bool> *currentNode = fullChildren(m_pertinentRoot)->popFrontRet(); currentNode->parent(m_pertinentRoot); m_pertinentRoot = currentNode; ReplaceFullRoot(leafKeys); }
// Function ReplaceFullRoot either replaces the full root // or one full child of a partial root of a pertinent subtree // by a single P-node with leaves corresponding the keys stored in leafKeys. void PlanarSubgraphPQTree:: ReplaceFullRoot(SListPure<PlanarLeafKey<whaInfo*>*> &leafKeys) { PQLeaf<edge,whaInfo*,bool> *leafPtr = 0; // dummy PQInternalNode<edge,whaInfo*,bool> *nodePtr = 0; // dummy //PQNodeKey<edge,whaInfo*,bool> *nodeInfoPtr = 0; // dummy PQNode<edge,whaInfo*,bool> *currentNode = 0; // dummy SListIterator<PlanarLeafKey<whaInfo*>* > it; if (!leafKeys.empty() && leafKeys.front() == leafKeys.back()) { //ReplaceFullRoot: replace pertinent root by a single leaf leafPtr = OGDF_NEW PQLeaf<edge,whaInfo*,bool>(m_identificationNumber++, EMPTY,(PQLeafKey<edge,whaInfo*,bool>*)leafKeys.front()); exchangeNodes(m_pertinentRoot,(PQNode<edge,whaInfo*,bool>*) leafPtr); if (m_pertinentRoot == m_root) m_root = (PQNode<edge,whaInfo*,bool>*) leafPtr; } else if (!leafKeys.empty()) // at least two leaves { //replace pertinent root by a $P$-node if ((m_pertinentRoot->type() == P_NODE) || (m_pertinentRoot->type() == Q_NODE)) { nodePtr = (PQInternalNode<edge,whaInfo*,bool>*)m_pertinentRoot; nodePtr->type(P_NODE); nodePtr->status(PERTROOT); nodePtr->childCount(0); while (!fullChildren(m_pertinentRoot)->empty()) { currentNode = fullChildren(m_pertinentRoot)->popFrontRet(); removeChildFromSiblings(currentNode); } } else if (m_pertinentRoot->type() == LEAF) { nodePtr = OGDF_NEW PQInternalNode<edge,whaInfo*,bool>(m_identificationNumber++, P_NODE,EMPTY); exchangeNodes(m_pertinentRoot,nodePtr); } SListPure<PQLeafKey<edge,whaInfo*,bool>*> castLeafKeys; for (it = leafKeys.begin(); it.valid(); ++it) castLeafKeys.pushBack((PQLeafKey<edge,whaInfo*,bool>*) *it); addNewLeavesToTree(nodePtr,castLeafKeys); } }
// Function ReplaceFullRoot either replaces the full root // or one full child of a partial root of a pertinent subtree // by a single P-node with leaves corresponding the keys stored in leafKeys. void PlanarPQTree::ReplaceFullRoot(SListPure<PlanarLeafKey<indInfo*>*> &leafKeys) { if (!leafKeys.empty() && leafKeys.front() == leafKeys.back()) { //ReplaceFullRoot: replace pertinent root by a single leaf PQLeaf<edge,indInfo*,bool> *leafPtr = OGDF_NEW PQLeaf<edge,indInfo*,bool>(m_identificationNumber++, EMPTY,(PQLeafKey<edge,indInfo*,bool>*)leafKeys.front()); exchangeNodes(m_pertinentRoot,(PQNode<edge,indInfo*,bool>*) leafPtr); if (m_pertinentRoot == m_root) m_root = (PQNode<edge,indInfo*,bool>*) leafPtr; m_pertinentRoot = 0; // check for this emptyAllPertinentNodes } else if (!leafKeys.empty()) // at least two leaves { PQInternalNode<edge,indInfo*,bool> *nodePtr = 0; // dummy //replace pertinent root by a $P$-node if ((m_pertinentRoot->type() == PQNodeRoot::PNode) || (m_pertinentRoot->type() == PQNodeRoot::QNode)) { nodePtr = (PQInternalNode<edge,indInfo*,bool>*)m_pertinentRoot; nodePtr->type(PQNodeRoot::PNode); nodePtr->childCount(0); while (!fullChildren(m_pertinentRoot)->empty()) removeChildFromSiblings(fullChildren(m_pertinentRoot)->popFrontRet()); } else if (m_pertinentRoot->type() == PQNodeRoot::leaf) { nodePtr = OGDF_NEW PQInternalNode<edge,indInfo*,bool>(m_identificationNumber++, PQNodeRoot::PNode,EMPTY); exchangeNodes(m_pertinentRoot,nodePtr); m_pertinentRoot = 0; // check for this emptyAllPertinentNodes } SListPure<PQLeafKey<edge,indInfo*,bool>*> castLeafKeys; SListIterator<PlanarLeafKey<indInfo*>* > it; for (it = leafKeys.begin(); it.valid(); ++it) castLeafKeys.pushBack((PQLeafKey<edge,indInfo*,bool>*) *it); addNewLeavesToTree(nodePtr,castLeafKeys); } }
void EmbedPQTree::ReplacePartialRoot( SListPure<PlanarLeafKey<indInfo*>*> &leafKeys, SListPure<PQBasicKey<edge,indInfo*,bool>*> &frontier, node v) { m_pertinentRoot->childCount(m_pertinentRoot->childCount() + 1 - fullChildren(m_pertinentRoot)->size()); PQNode<edge,indInfo*,bool> *predNode = 0; // dummy PQNode<edge,indInfo*,bool> *beginSequence = 0; // marks begin consecuitve seqeunce PQNode<edge,indInfo*,bool> *endSequence = 0; // marks end consecutive sequence PQNode<edge,indInfo*,bool> *beginInd = 0; // initially, marks direct sibling indicator // next to beginSequence not contained // in consectuive sequence // Get beginning and end of sequence. while (fullChildren(m_pertinentRoot)->size()) { PQNode<edge,indInfo*,bool> *currentNode = fullChildren(m_pertinentRoot)->popFrontRet(); if (!clientSibLeft(currentNode) || clientSibLeft(currentNode)->status() == EMPTY) { if (!beginSequence) { beginSequence = currentNode; predNode = clientSibLeft(currentNode); beginInd =PQTree<edge,indInfo*,bool>::clientSibLeft(currentNode); } else endSequence = currentNode; } else if (!clientSibRight(currentNode) || clientSibRight(currentNode)->status() == EMPTY ) { if (!beginSequence) { beginSequence = currentNode; predNode = clientSibRight(currentNode); beginInd =PQTree<edge,indInfo*,bool>::clientSibRight(currentNode); } else endSequence = currentNode; } } SListPure<PQBasicKey<edge,indInfo*,bool>*> partialFrontier; // Now scan the sequence of full nodes. Remove all of them but the last. // Call ReplaceFullRoot on the last one. // For every full node get its frontier. Scan intermediate indicators. PQNode<edge,indInfo*,bool> *currentNode = beginSequence; while (currentNode != endSequence) { PQNode<edge,indInfo*,bool>* nextNode = clientNextSib(currentNode,predNode); front(currentNode,partialFrontier); frontier.conc(partialFrontier); PQNode<edge,indInfo*,bool>* currentInd = PQTree<edge,indInfo*,bool>:: clientNextSib(currentNode,beginInd); // Scan for intermediate direction indicators. while (currentInd != nextNode) { PQNode<edge,indInfo*,bool> *nextInd = PQTree<edge,indInfo*,bool>:: clientNextSib(currentInd,currentNode); if (currentNode == currentInd->getSib(RIGHT)) //Direction changed currentInd->getNodeInfo()->userStructInfo()->changeDir = true; frontier.pushBack((PQBasicKey<edge,indInfo*,bool>*) currentInd->getNodeInfo()); removeChildFromSiblings(currentInd); m_pertinentNodes->pushBack(currentInd); currentInd = nextInd; } removeChildFromSiblings(currentNode); currentNode = nextNode; } currentNode->parent(m_pertinentRoot); m_pertinentRoot = currentNode; ReplaceFullRoot(leafKeys,partialFrontier,v,true,beginInd); frontier.conc(partialFrontier); }
void EmbedPQTree::ReplaceFullRoot( SListPure<PlanarLeafKey<indInfo*>*> &leafKeys, SListPure<PQBasicKey<edge,indInfo*,bool>*> &frontier, node v, bool addIndicator, PQNode<edge,indInfo*,bool> *opposite) { EmbedIndicator *newInd = 0; front(m_pertinentRoot,frontier); if (addIndicator) { indInfo *newInfo = OGDF_NEW indInfo(v); embedKey *nodeInfoPtr = OGDF_NEW embedKey(newInfo); newInd = OGDF_NEW EmbedIndicator(m_identificationNumber++, (PQNodeKey<edge,indInfo*,bool>*)nodeInfoPtr); newInd->setNodeInfo(nodeInfoPtr); nodeInfoPtr->setNodePointer(newInd); } if (!leafKeys.empty() && leafKeys.front() == leafKeys.back()) { //ReplaceFullRoot: replace pertinent root by a single leaf if (addIndicator) { opposite = m_pertinentRoot->getNextSib(opposite); if (!opposite) // m_pertinentRoot is endmost child { addNodeToNewParent(m_pertinentRoot->parent(),newInd, m_pertinentRoot,opposite); } else addNodeToNewParent(0,newInd,m_pertinentRoot,opposite); // Setting the sibling pointers into opposite direction of // scanning the front allows to track swaps of the indicator newInd->changeSiblings(m_pertinentRoot,0); newInd->changeSiblings(opposite,0); newInd->putSibling(m_pertinentRoot,LEFT); newInd->putSibling(opposite,RIGHT); } PQLeaf<edge,indInfo*,bool> *leafPtr = OGDF_NEW PQLeaf<edge,indInfo*,bool>(m_identificationNumber++, EMPTY,(PQLeafKey<edge,indInfo*,bool>*)leafKeys.front()); exchangeNodes(m_pertinentRoot,(PQNode<edge,indInfo*,bool>*) leafPtr); if (m_pertinentRoot == m_root) m_root = (PQNode<edge,indInfo*,bool>*) leafPtr; m_pertinentRoot = 0; // check for this emptyAllPertinentNodes } else if (!leafKeys.empty()) // at least two leaves { //replace pertinent root by a $P$-node if (addIndicator) { opposite = m_pertinentRoot->getNextSib(opposite); if (!opposite) // m_pertinentRoot is endmost child { addNodeToNewParent(m_pertinentRoot->parent(),newInd, m_pertinentRoot,opposite); } else addNodeToNewParent(0,newInd,m_pertinentRoot,opposite); // Setting the sibling pointers into opposite direction of // scanning the front allows to track swaps of the indicator newInd->changeSiblings(m_pertinentRoot,0); newInd->changeSiblings(opposite,0); newInd->putSibling(m_pertinentRoot,LEFT); newInd->putSibling(opposite,RIGHT); } PQInternalNode<edge,indInfo*,bool> *nodePtr = 0; // dummy if ((m_pertinentRoot->type() == PQNodeRoot::PNode) || (m_pertinentRoot->type() == PQNodeRoot::QNode)) { nodePtr = (PQInternalNode<edge,indInfo*,bool>*)m_pertinentRoot; nodePtr->type(PQNodeRoot::PNode); nodePtr->childCount(0); while (!fullChildren(m_pertinentRoot)->empty()) { PQNode<edge,indInfo*,bool> *currentNode = fullChildren(m_pertinentRoot)->popFrontRet(); removeChildFromSiblings(currentNode); } } else if (m_pertinentRoot->type() == PQNodeRoot::leaf) { nodePtr = OGDF_NEW PQInternalNode<edge,indInfo*,bool>(m_identificationNumber++, PQNodeRoot::PNode,EMPTY); exchangeNodes(m_pertinentRoot,nodePtr); m_pertinentRoot = 0; // check for this emptyAllPertinentNodes } SListPure<PQLeafKey<edge,indInfo*,bool>*> castLeafKeys; SListIterator<PlanarLeafKey<indInfo*>* > it; for (it = leafKeys.begin(); it.valid(); ++it) castLeafKeys.pushBack((PQLeafKey<edge,indInfo*,bool>*) *it); addNewLeavesToTree(nodePtr,castLeafKeys); } }
void EmbedPQTree::ReplaceFullRoot( SListPure<PlanarLeafKey<IndInfo*>*> &leafKeys, SListPure<PQBasicKey<edge,IndInfo*,bool>*> &frontier, node v, bool addIndicator, PQNode<edge,IndInfo*,bool> *opposite) { EmbedIndicator *newInd = nullptr; front(m_pertinentRoot,frontier); if (addIndicator) { IndInfo *newInfo = new IndInfo(v); PQNodeKey<edge,IndInfo*,bool> *nodeInfoPtr = new PQNodeKey<edge,IndInfo*,bool>(newInfo); newInd = new EmbedIndicator(m_identificationNumber++, nodeInfoPtr); newInd->setNodeInfo(nodeInfoPtr); nodeInfoPtr->setNodePointer(newInd); } if (!leafKeys.empty() && leafKeys.front() == leafKeys.back()) { //ReplaceFullRoot: replace pertinent root by a single leaf if (addIndicator) { opposite = m_pertinentRoot->getNextSib(opposite); if (!opposite) // m_pertinentRoot is endmost child { addNodeToNewParent(m_pertinentRoot->parent(), newInd, m_pertinentRoot, opposite); } else addNodeToNewParent(nullptr,newInd,m_pertinentRoot,opposite); // Setting the sibling pointers into opposite direction of // scanning the front allows to track swaps of the indicator newInd->changeSiblings(m_pertinentRoot,nullptr); newInd->changeSiblings(opposite,nullptr); newInd->putSibling(m_pertinentRoot,PQNodeRoot::SibDirection::Left); newInd->putSibling(opposite,PQNodeRoot::SibDirection::Right); } PQLeaf<edge,IndInfo*,bool> *leafPtr = new PQLeaf<edge,IndInfo*,bool>(m_identificationNumber++, PQNodeRoot::PQNodeStatus::Empty,(PQLeafKey<edge,IndInfo*,bool>*)leafKeys.front()); exchangeNodes(m_pertinentRoot,(PQNode<edge,IndInfo*,bool>*) leafPtr); if (m_pertinentRoot == m_root) m_root = (PQNode<edge,IndInfo*,bool>*) leafPtr; m_pertinentRoot = nullptr; // check for this emptyAllPertinentNodes } else if (!leafKeys.empty()) // at least two leaves { //replace pertinent root by a $P$-node if (addIndicator) { opposite = m_pertinentRoot->getNextSib(opposite); if (!opposite) // m_pertinentRoot is endmost child { addNodeToNewParent(m_pertinentRoot->parent(), newInd, m_pertinentRoot, opposite); } else addNodeToNewParent(nullptr, newInd, m_pertinentRoot, opposite); // Setting the sibling pointers into opposite direction of // scanning the front allows to track swaps of the indicator newInd->changeSiblings(m_pertinentRoot,nullptr); newInd->changeSiblings(opposite,nullptr); newInd->putSibling(m_pertinentRoot,PQNodeRoot::SibDirection::Left); newInd->putSibling(opposite,PQNodeRoot::SibDirection::Right); } PQInternalNode<edge,IndInfo*,bool> *nodePtr = nullptr; // dummy if ((m_pertinentRoot->type() == PQNodeRoot::PQNodeType::PNode) || (m_pertinentRoot->type() == PQNodeRoot::PQNodeType::QNode)) { nodePtr = (PQInternalNode<edge,IndInfo*,bool>*)m_pertinentRoot; nodePtr->type(PQNodeRoot::PQNodeType::PNode); nodePtr->childCount(0); while (!fullChildren(m_pertinentRoot)->empty()) { PQNode<edge,IndInfo*,bool> *currentNode = fullChildren(m_pertinentRoot)->popFrontRet(); removeChildFromSiblings(currentNode); } } else if (m_pertinentRoot->type() == PQNodeRoot::PQNodeType::Leaf) { nodePtr = new PQInternalNode<edge,IndInfo*,bool>(m_identificationNumber++, PQNodeRoot::PQNodeType::PNode, PQNodeRoot::PQNodeStatus::Empty); exchangeNodes(m_pertinentRoot,nodePtr); m_pertinentRoot = nullptr; // check for this emptyAllPertinentNodes } SListPure<PQLeafKey<edge, IndInfo*, bool>*> castLeafKeys; for (PlanarLeafKey<IndInfo*> *key : leafKeys) castLeafKeys.pushBack(static_cast<PQLeafKey<edge, IndInfo*, bool>*>(key)); addNewLeavesToTree(nodePtr, castLeafKeys); } }