Open
Graph Drawing
Framework

 v.2012.05
 

MMFixedEmbeddingInserter.h
Go to the documentation of this file.
00001 /*
00002  * $Revision: 2299 $
00003  * 
00004  * last checkin:
00005  *   $Author: gutwenger $ 
00006  *   $Date: 2012-05-07 15:57:08 +0200 (Mon, 07 May 2012) $ 
00007  ***************************************************************/
00008  
00042 #ifdef _MSC_VER
00043 #pragma once
00044 #endif
00045 
00046 #ifndef OGDF_MM_FIXED_EMBEDDING_INSERTER_H
00047 #define OGDF_MM_FIXED_EMBEDDING_INSERTER_H
00048 
00049 
00050 
00051 #include <ogdf/module/MMEdgeInsertionModule.h>
00052 #include <ogdf/basic/CombinatorialEmbedding.h>
00053 #include <ogdf/basic/FaceArray.h>
00054 #include <ogdf/basic/tuples.h>
00055 
00056 
00057 
00058 namespace ogdf {
00059 
00060 
00061 class OGDF_EXPORT FaceSetSimple;
00062 class OGDF_EXPORT NodeSetPure;
00063 class OGDF_EXPORT NodeSet;
00064 
00065 
00067 class OGDF_EXPORT MMFixedEmbeddingInserter : public MMEdgeInsertionModule
00068 {
00069 public:
00071     MMFixedEmbeddingInserter();
00072 
00073     // destruction
00074     virtual ~MMFixedEmbeddingInserter() { }
00075 
00076 
00078     void removeReinsert(RemoveReinsertType rrOption) {
00079         m_rrOption = rrOption;
00080     }
00081 
00083     RemoveReinsertType removeReinsert() const {
00084         return m_rrOption;
00085     }
00086 
00087 
00089 
00094     void percentMostCrossed(double percent) {
00095         m_percentMostCrossed = percent;
00096     }
00097 
00099     double percentMostCrossed() const {
00100         return m_percentMostCrossed;
00101     }
00102 
00103 
00104 private:
00114     ReturnType doCall(
00115         PlanRepExpansion &PG,
00116         const List<edge> &origEdges,
00117         const EdgeArray<bool> *forbiddenEdgeOrig);
00118 
00120 
00124     void constructDual(
00125         const PlanRepExpansion &PG,
00126         const CombinatorialEmbedding &E);
00127 
00129 
00142     void findShortestPath(
00143         const PlanRepExpansion &PG,
00144         const CombinatorialEmbedding &E,
00145         const List<node> &sources,
00146         const List<node> &targets,
00147         List<Tuple2<adjEntry,adjEntry> > &crossed,
00148         const EdgeArray<bool> *forbiddenEdgeOrig);
00149 
00150     void prepareAnchorNode(
00151         PlanRepExpansion &PG,
00152         CombinatorialEmbedding &E,
00153         adjEntry &adjStart,
00154         node srcOrig);
00155 
00156     void preprocessInsertionPath(
00157         PlanRepExpansion &PG,
00158         CombinatorialEmbedding &E,
00159         node srcOrig,
00160         node tgtOrig,
00161         //PlanRepExpansion::nodeSplit ns,
00162         List<Tuple2<adjEntry,adjEntry> > &crossed);
00163 
00179     void insertEdge(
00180         PlanRepExpansion &PG,
00181         CombinatorialEmbedding &E,
00182         edge eOrig,
00183         node srcOrig,
00184         node tgtOrig,
00185         PlanRepExpansion::NodeSplit *nodeSplit,
00186         List<Tuple2<adjEntry,adjEntry> > &crossed);
00187 
00200     void removeEdge(
00201         PlanRepExpansion &PG,
00202         CombinatorialEmbedding &E,
00203         edge eOrig,
00204         PlanRepExpansion::NodeSplit *nodeSplit,
00205         node &oldSrc,
00206         node &oldTgt);
00207 
00215     void insertDualEdge(node vDual, adjEntry adj, const CombinatorialEmbedding &E);
00216 
00223     void insertDualEdges(node v, const CombinatorialEmbedding &E);
00224 
00232     void contractSplit(
00233         PlanRepExpansion &PG,
00234         CombinatorialEmbedding &E,
00235         PlanRepExpansion::NodeSplit *nodeSplit);
00236 
00245     void contractSplitIfReq(
00246         PlanRepExpansion &PG,
00247         CombinatorialEmbedding &E,
00248         node u,
00249         const PlanRepExpansion::nodeSplit nsCurrent = 0);
00250 
00254     void convertDummy(
00255         PlanRepExpansion &PG,
00256         CombinatorialEmbedding &E,
00257         node u,
00258         node vOrig,
00259         PlanRepExpansion::nodeSplit ns);
00260 
00270     void collectAnchorNodes(
00271         node v, 
00272         NodeSet &nodes, 
00273         const PlanRepExpansion::NodeSplit *nsParent,
00274         const PlanRepExpansion &PG) const;
00275 
00283     void anchorNodes(
00284         node vOrig,
00285         NodeSet &nodes,
00286         const PlanRepExpansion &PG) const;
00287 
00297     void findSourcesAndTargets(
00298         node src, node tgt,
00299         NodeSet &sources,
00300         NodeSet &targets,
00301         const PlanRepExpansion &PG) const;
00302 
00309     node commonDummy(
00310         NodeSet &sources,
00311         NodeSet &targets);
00312 
00314     bool checkDualGraph(PlanRepExpansion &PG, const CombinatorialEmbedding &E) const;
00315 
00316     bool checkSplitDeg(
00317         PlanRepExpansion &PG);
00318 
00319     bool origOfDualForbidden(
00320         edge e, 
00321         const PlanRepExpansion &PG, 
00322         const EdgeArray<bool> *forbiddenEdgeOrig) const
00323     {
00324         if(forbiddenEdgeOrig == 0)
00325             return false;
00326 
00327         if(e->source() == m_vS || e->target() == m_vT)
00328             return false;
00329 
00330         if(m_primalNode[e->source()] != 0)
00331             return false;
00332         if(m_primalNode[e->target()] != 0)
00333             return false;
00334 
00335         adjEntry adj = m_primalAdj[e];
00336         if(adj == 0) return false;
00337         
00338         edge eOrig = PG.originalEdge(adj->theEdge());
00339         if(eOrig != 0) {
00340             //if((*forbiddenEdgeOrig)[eOrig] == true)
00341             //  cout << "forbidden: " << eOrig << ", dual: " << e << endl;
00342             return (*forbiddenEdgeOrig)[eOrig];
00343         } else return false;
00344     }
00345 
00346     void drawDual(
00347         const PlanRepExpansion &PG,
00348         const EdgeArray<bool> *forbiddenEdgeOrig);
00349 
00350     RemoveReinsertType m_rrOption; 
00351     double m_percentMostCrossed;   
00352 
00353     Graph m_dual;                      
00354     FaceArray<node>     m_dualOfFace;  
00355     NodeArray<node>     m_dualOfNode;  
00356     NodeArray<node>     m_primalNode;  
00357     EdgeArray<adjEntry> m_primalAdj;   
00358     AdjEntryArray<edge> m_dualEdge;    
00359     EdgeArray<int>      m_dualCost;    
00360 
00361     node m_vS; 
00362     node m_vT; 
00363     int m_maxCost; 
00364 
00365     FaceSetSimple      *m_delFaces;
00366     FaceSetPure        *m_newFaces;
00367     NodeSetPure        *m_mergedNodes;
00368 };
00369 
00370 } // end namespace ogdf
00371 
00372 #endif