Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

SPQRTree.h
Go to the documentation of this file.
1 
32 #pragma once
33 
34 #include <ogdf/basic/SList.h>
37 
38 namespace ogdf {
39 
71 public:
73  enum class NodeType { SNode, PNode, RNode };
74 
75  // destructor
76  virtual ~SPQRTree() { }
77 
78  SPQRTree() {};
79  SPQRTree(const SPQRTree& copy) = delete;
80  SPQRTree(SPQRTree&& move) = delete;
81  SPQRTree& operator=(const SPQRTree& copy) = delete;
82  SPQRTree& operator=(SPQRTree&& move) = delete;
83 
86 
88  virtual const Graph& originalGraph() const = 0;
89 
91  virtual const Graph& tree() const = 0;
92 
94  virtual edge rootEdge() const = 0;
95 
97  virtual node rootNode() const = 0;
98 
100  virtual int numberOfSNodes() const = 0;
101 
103  virtual int numberOfPNodes() const = 0;
104 
106  virtual int numberOfRNodes() const = 0;
107 
112  virtual NodeType typeOf(node v) const = 0;
113 
115  virtual List<node> nodesOfType(NodeType t) const = 0;
116 
121  virtual Skeleton& skeleton(node v) const = 0;
122 
127  virtual const Skeleton& skeletonOfReal(edge e) const = 0;
128 
133  virtual edge copyOfReal(edge e) const = 0;
134 
139  void pertinentGraph(node v, PertinentGraph& Gp) const {
140  if (m_cpV == nullptr) {
141  m_cpV = new NodeArray<node>(originalGraph(), nullptr);
142  }
143  NodeArray<node>& cpV = *m_cpV;
144 
145  Gp.init(v);
146  cpRec(v, Gp);
147 
148  const Skeleton& S = skeleton(v);
149 
150  edge e = Gp.m_skRefEdge = S.referenceEdge();
151  if (e != nullptr) {
152  e = Gp.m_P.newEdge(cpV[S.original(e->source())], cpV[S.original(e->target())]);
153  }
154  Gp.m_vEdge = e;
155 
156  while (!m_cpVAdded.empty()) {
157  cpV[m_cpVAdded.popFrontRet()] = nullptr;
158  }
159  }
160 
164 
169  virtual node rootTreeAt(edge e) = 0;
170 
175  virtual node rootTreeAt(node v) = 0;
176 
177  void directSkEdge(node vT, edge e, node src) {
178  OGDF_ASSERT(e != nullptr);
179  OGDF_ASSERT(src == e->source() || src == e->target());
180 
181  if (e->source() != src) {
182  skeleton(vT).getGraph().reverseEdge(e);
183  }
184  }
185 
187  Graph& M = skeleton(vT).getGraph();
188  M.reverseEdge(M.split(e));
189  }
190 
191  // !@}
192 
193 protected:
198  virtual void cpRec(node v, PertinentGraph& Gp) const = 0;
199 
201  edge cpAddEdge(edge eOrig, PertinentGraph& Gp) const {
202  edge eP = Gp.m_P.newEdge(cpAddNode(eOrig->source(), Gp), cpAddNode(eOrig->target(), Gp));
203  Gp.m_origE[eP] = eOrig;
204  return eP;
205  }
206 
208  node cpAddNode(node vOrig, PertinentGraph& Gp) const {
209  node& vP = (*m_cpV)[vOrig];
210  if (vP == nullptr) {
211  m_cpVAdded.pushBack(vOrig);
212  Gp.m_origV[vP = Gp.m_P.newNode()] = vOrig;
213  }
214  return vP;
215  }
216 
217  // auxiliary members used for computing pertinent graphs
220 };
221 
222 }
ogdf
The namespace for all OGDF objects.
Definition: AugmentationModule.h:36
ogdf::SPQRTree::m_cpVAdded
SList< node > m_cpVAdded
list of added nodes (auxiliary member)
Definition: SPQRTree.h:219
PertinentGraph.h
Declaration of class PertinentGraph.
OGDF_ASSERT
#define OGDF_ASSERT(expr)
Assert condition expr. See doc/build.md for more information.
Definition: basic.h:54
ogdf::Graph::split
virtual edge split(edge e)
Splits edge e into two edges introducing a new node.
ogdf::PertinentGraph::m_P
Graph m_P
actual graph
Definition: PertinentGraph.h:120
ogdf::SList
Singly linked lists (maintaining the length of the list).
Definition: SList.h:833
ogdf::SPQRTree
Linear-time implementation of static SPQR-trees.
Definition: SPQRTree.h:70
ogdf::Graph::reverseEdge
void reverseEdge(edge e)
Reverses the edge e, i.e., exchanges source and target node.
Skeleton.h
Declaration of class Skeleton.
Minisat::Internal::copy
static void copy(const T &from, T &to)
Definition: Alg.h:61
ogdf::SPQRTree::cpAddEdge
edge cpAddEdge(edge eOrig, PertinentGraph &Gp) const
Add an edge to Gp corresponding to eOrig.
Definition: SPQRTree.h:201
ogdf::Skeleton::referenceEdge
edge referenceEdge() const
Returns the reference edge of S in M.
Definition: Skeleton.h:86
ogdf::SPQRTree::replaceSkEdgeByPeak
void replaceSkEdgeByPeak(node vT, edge e)
Definition: SPQRTree.h:186
backward::details::move
const T & move(const T &v)
Definition: backward.hpp:243
SList.h
Declaration of singly linked lists and iterators.
ogdf::PertinentGraph::m_skRefEdge
edge m_skRefEdge
reference edge (in skeleton(m_vT))
Definition: PertinentGraph.h:122
ogdf::PertinentGraph::m_vEdge
edge m_vEdge
reference edge (in m_P)
Definition: PertinentGraph.h:121
ogdf::PertinentGraph::m_origV
NodeArray< node > m_origV
corresp.
Definition: PertinentGraph.h:124
ogdf::EdgeElement::source
node source() const
Returns the source node of the edge.
Definition: Graph_d.h:391
ogdf::List
Doubly linked lists (maintaining the length of the list).
Definition: List.h:42
ogdf::internal::GraphRegisteredArray
RegisteredArray for nodes, edges and adjEntries of a graph.
Definition: Graph_d.h:651
ogdf::Graph
Data type for general directed graphs (adjacency list representation).
Definition: Graph_d.h:862
ogdf::EdgeStandardType::tree
@ tree
for every hyperedge e a minimal subcubic tree connecting all hypernodes incident with e together is a...
ogdf::SPQRTree::pertinentGraph
void pertinentGraph(node v, PertinentGraph &Gp) const
Returns the pertinent graph of tree node v in Gp.
Definition: SPQRTree.h:139
ogdf::SPQRTree::SPQRTree
SPQRTree()
Definition: SPQRTree.h:78
OGDF_EXPORT
#define OGDF_EXPORT
Specifies that a function or class is exported by the OGDF DLL.
Definition: config.h:101
ogdf::SPQRTree::NodeType
NodeType
The type of a tree node in T.
Definition: SPQRTree.h:73
ogdf::Graph::newNode
node newNode(int index=-1)
Creates a new node and returns it.
Definition: Graph_d.h:1056
ogdf::PertinentGraph::init
void init(node vT)
Initialization of a pertinent graph of tree node vT.
Definition: PertinentGraph.h:75
ogdf::EdgeElement
Class for the representation of edges.
Definition: Graph_d.h:356
ogdf::Skeleton
Skeleton graphs of nodes in an SPQR-tree.
Definition: Skeleton.h:59
ogdf::Skeleton::original
virtual node original(node v) const =0
Returns the vertex in the original graph G that corresponds to v.
ogdf::PertinentGraph
Pertinent graphs of nodes in an SPQR-tree.
Definition: PertinentGraph.h:59
ogdf::SPQRTree::~SPQRTree
virtual ~SPQRTree()
Definition: SPQRTree.h:76
ogdf::SPQRTree::cpAddNode
node cpAddNode(node vOrig, PertinentGraph &Gp) const
Add a node to Gp corresponding to vOrig if required.
Definition: SPQRTree.h:208
ogdf::EdgeElement::target
node target() const
Returns the target node of the edge.
Definition: Graph_d.h:394
ogdf::Graph::newEdge
edge newEdge(node v, node w, int index=-1)
Creates a new edge (v,w) and returns it.
Definition: Graph_d.h:1075
ogdf::SPQRTree::m_cpV
NodeArray< node > * m_cpV
node in pertinent graph corresponding to an original node (auxiliary member)
Definition: SPQRTree.h:218
ogdf::NodeElement
Class for the representation of nodes.
Definition: Graph_d.h:233
ogdf::PertinentGraph::m_origE
EdgeArray< edge > m_origE
corresp.
Definition: PertinentGraph.h:125
ogdf::SPQRTree::directSkEdge
void directSkEdge(node vT, edge e, node src)
Definition: SPQRTree.h:177