Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

CombinatorialEmbedding.h
Go to the documentation of this file.
1 
34 #pragma once
35 
37 
38 namespace ogdf {
39 
40 using face = FaceElement*;
41 
43 OGDF_EXPORT std::ostream& operator<<(std::ostream& os, ogdf::face f);
44 
45 // Definition of iterator and container types for adjacency entries in a face
46 // These declarations are just internal representations
47 namespace internal {
48 
53 
54 public:
55  FaceAdjIterator() : m_adj(nullptr), m_adjFirst(nullptr) { }
56 
57  explicit FaceAdjIterator(adjEntry adj) : m_adj(adj), m_adjFirst(adj) { }
58 
59  FaceAdjIterator(adjEntry adjFirst, adjEntry adj) : m_adj(adj), m_adjFirst(adjFirst) { }
60 
61  FaceAdjIterator(const FaceAdjIterator&) = default;
62  FaceAdjIterator& operator=(const FaceAdjIterator&) = default;
63 
64  bool operator==(const FaceAdjIterator& other) const { return m_adj == other.m_adj; }
65 
66  bool operator!=(const FaceAdjIterator& other) const { return m_adj != other.m_adj; }
67 
68  adjEntry operator*() const { return m_adj; }
69 
71  OGDF_ASSERT(m_adj != nullptr);
73  if (m_adj == m_adjFirst) {
74  m_adj = nullptr;
75  }
76  return *this;
77  }
78 };
79 
81 
86  friend class ogdf::FaceElement;
89 
91 
92  FaceAdjContainer() : m_adjFirst(nullptr) { }
93 
94  explicit FaceAdjContainer(adjEntry adjFirst) : m_adjFirst(adjFirst) { }
95 
96 public:
98 
99  iterator begin() const { return iterator(m_adjFirst); }
100 
101  iterator end() const { return iterator(); }
102 };
103 
104 }
105 
113 
114  //adjEntry m_adjFirst; //!< The first adjacency element in the face.
115  int m_id;
116  int m_size;
117 
118 #ifdef OGDF_DEBUG
120 #endif
121 
122 #ifdef OGDF_DEBUG
123  FaceElement(const ConstCombinatorialEmbedding* pEmbedding, adjEntry adjFirst, int id)
125  : m_id(id), m_size(0), m_pEmbedding(pEmbedding), entries(adjFirst) { }
126 #else
127  FaceElement(adjEntry adjFirst, int id) : m_id(id), m_size(0), entries(adjFirst) { }
129 #endif
130 
131 public:
134 
136  int index() const { return m_id; }
137 
139  adjEntry firstAdj() const { return entries.m_adjFirst; }
140 
142  int size() const { return m_size; }
143 
145  face succ() const { return static_cast<face>(m_next); }
146 
148  face pred() const { return static_cast<face>(m_prev); }
149 
152  adj = adj->faceCycleSucc();
153  return (adj != entries.m_adjFirst) ? adj : nullptr;
154  }
155 
156 #ifdef OGDF_DEBUG
157  const ConstCombinatorialEmbedding* embeddingOf() const { return m_pEmbedding; }
158 #endif
159 
161  static int compare(const FaceElement& x, const FaceElement& y) { return x.m_id - y.m_id; }
163 
165 };
166 
169 
171 template<class Value, bool WithDefault>
172 class FaceArrayBase : public RegisteredArray<ConstCombinatorialEmbedding, Value, WithDefault> {
174 
175 public:
176  using RA::RA;
177 
179  ConstCombinatorialEmbedding* embeddingOf() const { return RA::registeredAt(); }
180 };
181 
182 #define OGDF_DECL_REG_ARRAY_TYPE(v, c) FaceArrayBase<v, c>
184 #undef OGDF_DECL_REG_ARRAY_TYPE
185 
208 protected:
209  const Graph* m_cpGraph;
210 
212 
215 
216 public:
219 
222 
225 
227 
231  explicit ConstCombinatorialEmbedding(const Graph& G);
232 
235 
238 
240  virtual ~ConstCombinatorialEmbedding();
241 
243  bool valid() const { return m_cpGraph != nullptr; }
244 
246 
249  const Graph& getGraph() const {
250  OGDF_ASSERT(valid());
251  return *m_cpGraph;
252  }
253 
255  operator const Graph&() const { return getGraph(); }
256 
258  face firstFace() const { return faces.head(); }
259 
261  face lastFace() const { return faces.tail(); }
262 
264  int numberOfFaces() const { return faces.size(); }
265 
267 
270  face rightFace(adjEntry adj) const { return m_rightFace[adj]; }
271 
276  face leftFace(adjEntry adj) const { return m_rightFace[adj->twin()]; }
277 
279  int maxFaceIndex() const { return m_faceIdCount - 1; }
280 
287  face chooseFace(
288  std::function<bool(face)> includeFace = [](face) { return true; },
289  bool isFastTest = true) const;
290 
292  face maximalFace() const;
293 
295  face externalFace() const { return m_externalFace; }
296 
302  OGDF_ASSERT(f->embeddingOf() == this);
303  m_externalFace = f;
304  }
305 
306  bool isBridge(edge e) const {
307  return m_rightFace[e->adjSource()] == m_rightFace[e->adjTarget()];
308  }
309 
311 
315  void init(const Graph& G);
316 
317  void init();
318 
320  void computeFaces();
321 
322 #ifdef OGDF_DEBUG
323  void consistencyCheck() const;
325 #endif
326 
327  static inline int keyToIndex(face key) { return key->index(); }
328 
329  bool isKeyAssociated(face key) const {
330  if (key == nullptr) {
331  return false;
332  }
333 #ifdef OGDF_DEBUG
334  if (key->embeddingOf() == this) {
335  OGDF_ASSERT(keyToIndex(key) < this->getArraySize());
336  return true;
337  } else {
338  return false;
339  }
340 #else
341  return true;
342 #endif
343  }
344 
345  int calculateArraySize(int add) const { return calculateTableSize(m_faceIdCount + add); }
346 
347  int maxKeyIndex() const { return (m_faceIdCount)-1; }
348 
349  face_iterator begin() const { return faces.begin(); }
350 
351  face_iterator end() const { return faces.end(); }
352 
362  adjEntry findCommonFace(const node v, const node w, bool left = true) const {
363  adjEntry adj;
364  return findCommonFace(v, w, adj, left);
365  }
366 
377  adjEntry findCommonFace(const node v, const node w, adjEntry& adjW, bool left = true) const;
378 
379 protected:
381  face createFaceElement(adjEntry adjFirst);
382 };
383 
398  friend class GraphCopy;
399 
401 
402  // the following methods are explicitly deleted
403  // It is not clear which meaning copying of a comb. embedding should
404  // have since we only store a pointer to the topology (Graph)
406  CombinatorialEmbedding& operator=(const CombinatorialEmbedding&) = delete;
407 
408 public:
413 
420  explicit CombinatorialEmbedding(Graph& G) : ConstCombinatorialEmbedding(G) { m_pGraph = &G; }
421 
423 
426 
429  const Graph& getGraph() const {
430  OGDF_ASSERT(valid());
431  return *m_cpGraph;
432  }
433 
435  OGDF_ASSERT(valid());
436  return *m_pGraph;
437  }
438 
439  operator const Graph&() const { return getGraph(); }
440 
441  operator Graph&() { return getGraph(); }
442 
444 
447 
455  void init(Graph& G) {
457  m_pGraph = &G;
458  }
459 
463  void clear();
464 
465 
467 
470 
477  edge split(edge e);
478 
484  void unsplit(edge eIn, edge eOut);
485 
504  node splitNode(adjEntry adjStartLeft, adjEntry adjStartRight);
505 
509  node contract(edge e, bool keepSelfLoops = false);
510 
530  edge splitFace(adjEntry adjSrc, adjEntry adjTgt, bool sourceAfter = false);
531 
540  edge addEdgeToIsolatedNode(node v, adjEntry adjTgt);
541 
550  edge addEdgeToIsolatedNode(adjEntry adjSrc, node v);
551 
557  face joinFaces(edge e);
558 
560  void reverseEdge(edge e);
561 
563  void moveBridge(adjEntry adjBridge, adjEntry adjBefore);
564 
566  void removeDeg1(node v);
567 
569  void updateMerger(edge e, face fRight, face fLeft);
570 
571 
574 private:
583  edge addEdgeToIsolatedNode(adjEntry adj, node v, bool adjSrc);
584 };
585 
586 }
ogdf::RegistryBase
Abstract base class for registries.
Definition: RegisteredArray.h:95
ogdf
The namespace for all OGDF objects.
Definition: AugmentationModule.h:36
ogdf::ConstCombinatorialEmbedding::valid
bool valid() const
Returns whether the embedding is associated with a graph.
Definition: CombinatorialEmbedding.h:243
ogdf::RegisteredArray
Dynamic arrays indexed with arbitrary keys.
Definition: RegisteredArray.h:808
OGDF_DECL_REG_ARRAY
#define OGDF_DECL_REG_ARRAY(NAME)
Definition: RegisteredArray.h:960
ogdf::internal::GraphList< GraphObject >::size
int size() const
Returns the size of the list.
Definition: GraphList.h:84
ogdf::internal::FaceAdjIterator::m_adjFirst
adjEntry m_adjFirst
Definition: CombinatorialEmbedding.h:52
ogdf::internal::FaceAdjContainer::begin
iterator begin() const
Definition: CombinatorialEmbedding.h:99
ogdf::internal::FaceAdjIterator::FaceAdjIterator
FaceAdjIterator(adjEntry adjFirst, adjEntry adj)
Definition: CombinatorialEmbedding.h:59
ogdf::internal::FaceAdjContainer::FaceAdjContainer
FaceAdjContainer()
Definition: CombinatorialEmbedding.h:92
ogdf::internal::FaceAdjContainer
Container for the adjacency entries in a face.
Definition: CombinatorialEmbedding.h:85
ogdf::internal::GraphList< GraphObject >::tail
GraphObject * tail() const
Returns the last element in the list.
Definition: GraphList.h:322
OGDF_ASSERT
#define OGDF_ASSERT(expr)
Assert condition expr. See doc/build.md for more information.
Definition: basic.h:54
ogdf::FaceElement::embeddingOf
const ConstCombinatorialEmbedding * embeddingOf() const
Definition: CombinatorialEmbedding.h:157
ogdf::internal::GraphIteratorBase
Definition: graph_iterators.h:44
ogdf::FaceElement::m_size
int m_size
The size of the face.
Definition: CombinatorialEmbedding.h:116
ogdf::ConstCombinatorialEmbedding::findCommonFace
adjEntry findCommonFace(const node v, const node w, bool left=true) const
Identifies a common face of two nodes and returns the respective adjacency entry.
Definition: CombinatorialEmbedding.h:362
ogdf::RegisteredArray< ConstCombinatorialEmbedding, Value, WithDefault >::RA
typename std::conditional< WithDefault, internal::RegisteredArrayWithDefault< ConstCombinatorialEmbedding, Value >, internal::RegisteredArrayWithoutDefault< ConstCombinatorialEmbedding, Value > >::type RA
Definition: RegisteredArray.h:813
ogdf::internal::FaceAdjContainer::end
iterator end() const
Definition: CombinatorialEmbedding.h:101
ogdf::internal::GraphElement
The base class for objects used by (hyper)graphs.
Definition: GraphList.h:55
ogdf::ConstCombinatorialEmbedding::leftFace
face leftFace(adjEntry adj) const
Returns the face to the left of adj, i.e., the face containing the twin of adj.
Definition: CombinatorialEmbedding.h:276
ogdf::ConstCombinatorialEmbedding::m_faceIdCount
int m_faceIdCount
The index assigned to the next created face.
Definition: CombinatorialEmbedding.h:211
OGDF_AUGMENT_COMPARER
#define OGDF_AUGMENT_COMPARER(type)
Add this macro to your class to turn it into a full comparer.
Definition: comparer.h:179
ogdf::CombinatorialEmbedding::getGraph
Graph & getGraph()
Definition: CombinatorialEmbedding.h:434
ogdf::FaceArrayBase::embeddingOf
ConstCombinatorialEmbedding * embeddingOf() const
Returns a pointer to the associated combinatorial embedding.
Definition: CombinatorialEmbedding.h:179
ogdf::FaceElement::entries
internal::FaceAdjContainer entries
Container maintaining the adjacency entries in the face.
Definition: CombinatorialEmbedding.h:133
ogdf::sync_plan::split
std::pair< node, node > split(Graph &G, sync_plan::PipeBij &bij, const EdgeArray< edge > *new_edges=nullptr, const EdgeArray< bool > *reverse_edges=nullptr, node src=nullptr, node tgt=nullptr)
ogdf::ConstCombinatorialEmbedding::maxKeyIndex
int maxKeyIndex() const
Definition: CombinatorialEmbedding.h:347
ogdf::ConstCombinatorialEmbedding::rightFace
face rightFace(adjEntry adj) const
Returns the face to the right of adj, i.e., the face containing adj.
Definition: CombinatorialEmbedding.h:270
ogdf::internal::FaceAdjIterator::operator++
FaceAdjIterator & operator++()
Definition: CombinatorialEmbedding.h:70
ogdf::ConstCombinatorialEmbedding::numberOfFaces
int numberOfFaces() const
Returns the number of faces.
Definition: CombinatorialEmbedding.h:264
ogdf::GraphCopy
Copies of graphs supporting edge splitting.
Definition: GraphCopy.h:384
ogdf::ConstCombinatorialEmbedding::lastFace
face lastFace() const
Returns the last face in the list of all faces.
Definition: CombinatorialEmbedding.h:261
ogdf::ConstCombinatorialEmbedding::end
face_iterator end() const
Definition: CombinatorialEmbedding.h:351
ogdf::internal::FaceAdjIterator::FaceAdjIterator
FaceAdjIterator(adjEntry adj)
Definition: CombinatorialEmbedding.h:57
ogdf::internal::GraphObjectContainer
Public read-only interface for lists of graph objects.
Definition: GraphList.h:405
ogdf::ConstCombinatorialEmbedding::maxFaceIndex
int maxFaceIndex() const
Returns the largest used face index.
Definition: CombinatorialEmbedding.h:279
ogdf::AdjElement::twin
adjEntry twin() const
Returns the corresponding adjacency element associated with the same edge.
Definition: Graph_d.h:165
OGDF_NEW_DELETE
#define OGDF_NEW_DELETE
Makes the class use OGDF's memory allocator.
Definition: memory.h:84
ogdf::ConstCombinatorialEmbedding::begin
face_iterator begin() const
Definition: CombinatorialEmbedding.h:349
ogdf::AdjElement
Class for adjacency list elements.
Definition: Graph_d.h:135
ogdf::FaceElement::firstAdj
adjEntry firstAdj() const
Returns the first adjacency element in the face.
Definition: CombinatorialEmbedding.h:139
ogdf::ConstCombinatorialEmbedding::setExternalFace
void setExternalFace(face f)
Sets the external face to f.
Definition: CombinatorialEmbedding.h:301
ogdf::ConstCombinatorialEmbedding::init
void init()
ogdf::CombinatorialEmbeddingRegistry
RegistryBase< face, ConstCombinatorialEmbedding, internal::GraphIterator< face > > CombinatorialEmbeddingRegistry
Definition: CombinatorialEmbedding.h:168
ogdf::FaceElement::compare
static int compare(const FaceElement &x, const FaceElement &y)
Standard Comparer.
Definition: CombinatorialEmbedding.h:161
ogdf::internal::FaceAdjIterator::operator*
adjEntry operator*() const
Definition: CombinatorialEmbedding.h:68
ogdf::ConstCombinatorialEmbedding::faces
internal::GraphObjectContainer< FaceElement > faces
The container containing all face objects.
Definition: CombinatorialEmbedding.h:221
ogdf::ConstCombinatorialEmbedding::isKeyAssociated
bool isKeyAssociated(face key) const
Definition: CombinatorialEmbedding.h:329
ogdf::internal::FaceAdjIterator::m_adj
adjEntry m_adj
Definition: CombinatorialEmbedding.h:51
ogdf::CombinatorialEmbedding::init
void init(Graph &G)
Initializes the embedding for graph G.
Definition: CombinatorialEmbedding.h:455
ogdf::ConstCombinatorialEmbedding::keyToIndex
static int keyToIndex(face key)
Definition: CombinatorialEmbedding.h:327
ogdf::calculateTableSize
int calculateTableSize(int actualCount)
The default growth function for registered arrays.
Definition: RegisteredArray.h:58
ogdf::ConstCombinatorialEmbedding::m_rightFace
AdjEntryArray< face > m_rightFace
The face to which an adjacency entry belongs.
Definition: CombinatorialEmbedding.h:213
ogdf::FaceElement::m_id
int m_id
The index of the face.
Definition: CombinatorialEmbedding.h:115
ogdf::operator<<
std::ostream & operator<<(std::ostream &os, const ogdf::Array< E, INDEX > &a)
Prints array a to output stream os.
Definition: Array.h:978
ogdf::ConstCombinatorialEmbedding::m_cpGraph
const Graph * m_cpGraph
The associated graph.
Definition: CombinatorialEmbedding.h:209
ogdf::ConstCombinatorialEmbedding::getGraph
const Graph & getGraph() const
Returns the associated graph of the combinatorial embedding.
Definition: CombinatorialEmbedding.h:249
ogdf::internal::GraphRegisteredArray
RegisteredArray for nodes, edges and adjEntries of a graph.
Definition: Graph_d.h:651
ogdf::EdgeElement::adjSource
adjEntry adjSource() const
Returns the corresponding adjacancy entry at source node.
Definition: Graph_d.h:400
ogdf::Graph
Data type for general directed graphs (adjacency list representation).
Definition: Graph_d.h:862
ogdf::FaceArrayBase
RegisteredArray for labeling the faces of a CombinatorialEmbedding.
Definition: CombinatorialEmbedding.h:172
ogdf::internal::GraphList
Lists of graph objects (like nodes, edges, etc.).
Definition: GraphList.h:296
ogdf::ConstCombinatorialEmbedding::firstFace
face firstFace() const
Returns the first face in the list of all faces.
Definition: CombinatorialEmbedding.h:258
ogdf::CombinatorialEmbedding::m_pGraph
Graph * m_pGraph
The associated graph.
Definition: CombinatorialEmbedding.h:400
ogdf::FaceElement::size
int size() const
Returns the size of the face, i.e., the number of edges in the face.
Definition: CombinatorialEmbedding.h:142
ogdf::internal::FaceAdjIterator
Forward iterator for adjacency entries in a face.
Definition: CombinatorialEmbedding.h:50
ogdf::ConstCombinatorialEmbedding::externalFace
face externalFace() const
Returns the external face.
Definition: CombinatorialEmbedding.h:295
ogdf::ConstCombinatorialEmbedding
Combinatorial embeddings of planar graphs.
Definition: CombinatorialEmbedding.h:207
ogdf::FaceElement::pred
face pred() const
Returns the predecessor in the list of all faces.
Definition: CombinatorialEmbedding.h:148
ogdf::FaceElement::index
int index() const
Returns the index of the face.
Definition: CombinatorialEmbedding.h:136
ogdf::EdgeElement::adjTarget
adjEntry adjTarget() const
Returns the corresponding adjacancy entry at target node.
Definition: Graph_d.h:403
ogdf::internal::FaceAdjContainer::iterator
FaceAdjIterator iterator
Definition: CombinatorialEmbedding.h:97
ogdf::ConstCombinatorialEmbedding::m_externalFace
face m_externalFace
Definition: CombinatorialEmbedding.h:214
ogdf::internal::GraphList< GraphObject >::begin
iterator begin() const
Returns an iterator to the first element in the container.
Definition: GraphList.h:380
ogdf::graphics::init
void init()
Definition: graphics.h:446
ogdf::internal::GraphList< GraphObject >::head
GraphObject * head() const
Returns the first element in the list.
Definition: GraphList.h:319
ogdf::face
FaceElement * face
Definition: CombinatorialEmbedding.h:40
ogdf::internal::FaceAdjContainer::FaceAdjContainer
FaceAdjContainer(adjEntry adjFirst)
Definition: CombinatorialEmbedding.h:94
OGDF_EXPORT
#define OGDF_EXPORT
Specifies that a function or class is exported by the OGDF DLL.
Definition: config.h:101
ogdf::internal::FaceAdjContainer::m_adjFirst
adjEntry m_adjFirst
Definition: CombinatorialEmbedding.h:90
ogdf::internal::GraphList< GraphObject >::end
iterator end() const
Returns an iterator to the one-past-last element in the container.
Definition: GraphList.h:383
ogdf::CombinatorialEmbedding
Combinatorial embeddings of planar graphs with modification functionality.
Definition: CombinatorialEmbedding.h:397
ogdf::AdjElement::faceCycleSucc
adjEntry faceCycleSucc() const
Returns the cyclic successor in face.
Definition: Graph_d.h:205
AdjEntryArray.h
Declaration and implementation of AdjEntryArray class.
ogdf::internal::FaceAdjIterator::FaceAdjIterator
FaceAdjIterator()
Definition: CombinatorialEmbedding.h:55
ogdf::EdgeElement
Class for the representation of edges.
Definition: Graph_d.h:356
ogdf::CombinatorialEmbedding::getGraph
const Graph & getGraph() const
Returns the associated graph.
Definition: CombinatorialEmbedding.h:429
ogdf::ConstCombinatorialEmbedding::isBridge
bool isBridge(edge e) const
Definition: CombinatorialEmbedding.h:306
ogdf::ConstCombinatorialEmbedding::calculateArraySize
int calculateArraySize(int add) const
Definition: CombinatorialEmbedding.h:345
ogdf::internal::FaceAdjIterator::operator!=
bool operator!=(const FaceAdjIterator &other) const
Definition: CombinatorialEmbedding.h:66
ogdf::internal::FaceAdjIterator::operator=
FaceAdjIterator & operator=(const FaceAdjIterator &)=default
ogdf::FaceElement::nextFaceEdge
adjEntry nextFaceEdge(adjEntry adj) const
Returns the successor of adj in the list of all adjacency elements in the face.
Definition: CombinatorialEmbedding.h:151
ogdf::internal::FaceAdjIterator::operator==
bool operator==(const FaceAdjIterator &other) const
Definition: CombinatorialEmbedding.h:64
ogdf::NodeElement
Class for the representation of nodes.
Definition: Graph_d.h:233
ogdf::FaceElement::m_pEmbedding
const ConstCombinatorialEmbedding * m_pEmbedding
Definition: CombinatorialEmbedding.h:119
ogdf::CombinatorialEmbedding::CombinatorialEmbedding
CombinatorialEmbedding(Graph &G)
Creates a combinatorial embedding of graph G.
Definition: CombinatorialEmbedding.h:420
ogdf::FaceElement
Faces in a combinatorial embedding.
Definition: CombinatorialEmbedding.h:109
ogdf::FaceElement::succ
face succ() const
Returns the successor in the list of all faces.
Definition: CombinatorialEmbedding.h:145
ogdf::CombinatorialEmbedding::CombinatorialEmbedding
CombinatorialEmbedding()
Creates a combinatorial embedding associated with no graph.
Definition: CombinatorialEmbedding.h:412