00001
00002
00003
00004
00005
00006
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
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
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
00341
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 }
00371
00372 #endif