Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

BlockOrder.h
Go to the documentation of this file.
1 
32 #pragma once
33 
34 #include <ogdf/basic/EdgeArray.h>
35 #include <ogdf/basic/Graph.h>
36 #include <ogdf/basic/GraphCopy.h>
37 #include <ogdf/basic/NodeArray.h>
39 
40 namespace ogdf {
41 
43 class ArrayLevel : public LevelBase {
44 private:
46 
47 public:
48  explicit ArrayLevel(unsigned int size) : m_nodes(size) { }
49 
50  explicit ArrayLevel(const Array<node>& nodes) : m_nodes(nodes) { }
51 
52  const node& operator[](int i) const override { return m_nodes[i]; }
53 
54  node& operator[](int i) override { return m_nodes[i]; }
55 
56  int size() const override { return m_nodes.size(); }
57 
58  int high() const override { return m_nodes.high(); }
59 };
60 
61 
62 class BlockOrder;
63 
71  friend class BlockOrder;
72 
73 private:
74  int m_index = 0;
75 
76  int m_upper = 0;
77 
78  int m_lower = 0;
79 
81 
83 
85 
87 
89 
90  // exactly one of those below is non null!
91  node m_Node = nullptr;
92  edge m_Edge = nullptr;
93 
96 
97 public:
98  ~Block() { }
99 
100  bool isEdgeBlock() { return m_isEdgeBlock; }
101 
102  bool isVertexBlock() { return m_isNodeBlock; }
103 
105  explicit Block(node v);
106 
108  explicit Block(edge e);
109 };
110 
123 private:
124  enum class Direction { Plus, Minus };
125 
127 
129 
130  // Block X -> pi(X)
134 
135  // int i -> Block X s.t. pi(X) = i
137 
140 
141 #if 0
142  unsigned int m_storedCrossings;
143  unsigned int m_currentCrossings;
144 #endif
145 
149 
151 
152 #if 0
153  unsigned int m_blocksCount;
154 #endif
156 
158 
159  void deconstruct();
160 
162 
164 
167 
169 
170 public:
173 
175  const ArrayLevel& operator[](int i) const override { return *(m_levels[i]); }
176 
178  int pos(node v) const override { return m_pos[v]; }
179 
181  int size() const override { return m_levels.size(); }
182 
183  const Hierarchy& hierarchy() const override { return m_hierarchy; }
184 
186  const Array<node>& adjNodes(node v, TraversingDir dir) const override {
187  if (dir == TraversingDir::upward) {
188  return m_upperAdjNodes[v];
189  } else {
190  return m_lowerAdjNodes[v];
191  }
192  }
193 
195 
196  // destruction
197  ~BlockOrder() { deconstruct(); }
198 
200  int blocksCount() { return m_Blocks.size(); }
201 
202 #if 0
203  BlockOrder(const Graph &G, const NodeArray<int> &rank);
204 #endif
205 
206  explicit BlockOrder(Hierarchy& hierarchy, bool longEdgesOnly = true);
207 
209  void globalSifting(int rho = 1, int nRepeats = 10, int* pNumCrossings = nullptr);
210 
211 private:
213  void doInit(bool longEdgesOnly = true);
214 #if 0
215  void doInit( bool longEdgesOnly = true, const NodeArray<int> &ranks);
216 #endif
217 
223  void sortAdjacencies();
224 
233  void updateAdjacencies(Block* blockOfA, Block* blockOfB, Direction d);
234 
242  int uswap(Block* blockOfA, Block* blockOfB, Direction d, int level);
243 
249  int siftingSwap(Block* blockOfA, Block* blockOfB);
250 
256  int siftingStep(Block* blockOfA);
257 
261  void buildLevels();
262 
266  void buildDummyNodesLists();
267 
271  void buildAdjNodes();
272 
276  void buildHierarchy() {
277  buildDummyNodesLists();
278  buildLevels();
279  buildAdjNodes();
280  m_storedCrossings = calculateCrossings();
281  }
282 
285 
289  int verticalSwap(Block* b, int level);
290 
292  int localCountCrossings(const Array<int>& levels);
293 
299  void verticalStep(Block* b);
300 
302 
303 public:
305 
309  void gridSifting(int nRepeats = 10);
310 
312 };
313 
314 }
ogdf
The namespace for all OGDF objects.
Definition: AugmentationModule.h:36
ogdf::BlockOrder::m_hierarchy
Hierarchy & m_hierarchy
The hierarchy on grid- and globalsifting operates.
Definition: BlockOrder.h:157
ogdf::BlockOrder::m_Blocks
Array< Block * > m_Blocks
The array of all blocks.
Definition: BlockOrder.h:146
ogdf::Block::~Block
~Block()
Definition: BlockOrder.h:98
ogdf::BlockOrder::m_GC
GraphCopy m_GC
The graph copy representing the topology of the proper hierarchy.
Definition: BlockOrder.h:126
ogdf::Direction
Direction
Definition: basic.h:148
Graph.h
Includes declaration of graph class.
ogdf::Block::m_isNodeBlock
bool m_isNodeBlock
Definition: BlockOrder.h:95
ogdf::BlockOrder::m_storedCrossings
int m_storedCrossings
Numebr of crossings stored in the sifting step.
Definition: BlockOrder.h:138
ogdf::BlockOrder::m_NodeBlocks
NodeArray< Block * > m_NodeBlocks
The array of all vertex blocks.
Definition: BlockOrder.h:147
ogdf::BlockOrder::hierarchy
const Hierarchy & hierarchy() const override
Definition: BlockOrder.h:183
ogdf::Array::high
INDEX high() const
Returns the maximal array index.
Definition: Array.h:294
ogdf::Block
Class representing idea of Blocks used in GlobalSifting and GridSifting algorithms.
Definition: BlockOrder.h:70
ogdf::GraphCopy
Copies of graphs supporting edge splitting.
Definition: GraphCopy.h:384
ogdf::Hierarchy
Representation of proper hierarchies used by Sugiyama-layout.
Definition: Hierarchy.h:43
ogdf::BlockOrder::m_lowerAdjNodes
NodeArray< Array< node > > m_lowerAdjNodes
(Sorted) adjacent nodes on lower level.
Definition: BlockOrder.h:165
ogdf::HierarchyLevelsBase
Definition: CrossingMinInterfaces.h:61
ogdf::BlockOrder::m_bestCrossings
int m_bestCrossings
The lowest number of crossing found in the sifting step.
Definition: BlockOrder.h:139
ogdf::ArrayLevel::operator[]
node & operator[](int i) override
Returns the node at position i.
Definition: BlockOrder.h:54
ogdf::Block::m_NeighboursOutgoing
Array< int > m_NeighboursOutgoing
Indices of neighbouring outgoing blocks.
Definition: BlockOrder.h:86
ogdf::BlockOrder::m_levels
Array< ArrayLevel * > m_levels
The array of all levels.
Definition: BlockOrder.h:163
ogdf::BlockOrder::m_nSet
NodeArray< int > m_nSet
(Only used by buildAdjNodes().)
Definition: BlockOrder.h:168
ogdf::BlockOrder::blocksCount
int blocksCount()
Returns the number of blocks.
Definition: BlockOrder.h:200
ogdf::BlockOrder::m_currentPerm
Array< int > m_currentPerm
The permutation modified in the sifting step.
Definition: BlockOrder.h:132
ogdf::BlockOrder::m_upperAdjNodes
NodeArray< Array< node > > m_upperAdjNodes
(Sorted) adjacent nodes on upper level.
Definition: BlockOrder.h:166
ogdf::Block::m_nodes
Array< node > m_nodes
Vertices from the proper hierarchy corresponding to this block.
Definition: BlockOrder.h:80
ogdf::HierarchyLevelsBase::TraversingDir
TraversingDir
Definition: CrossingMinInterfaces.h:71
ogdf::BlockOrder::m_bestPerm
Array< int > m_bestPerm
The best found permutation in the sifting step.
Definition: BlockOrder.h:133
ogdf::Block::m_InvertedIncoming
Array< int > m_InvertedIncoming
Positions of this block in m_NeighboursOutgoing of neighbours.
Definition: BlockOrder.h:84
ogdf::Block::isEdgeBlock
bool isEdgeBlock()
Definition: BlockOrder.h:100
ogdf::Array< node >
EdgeArray.h
Declaration and implementation of EdgeArray class.
ogdf::ArrayLevel
The simple implementation of LevelBase interface.
Definition: BlockOrder.h:43
ogdf::BlockOrder::m_EdgeBlocks
EdgeArray< Block * > m_EdgeBlocks
The array of all edge blocks.
Definition: BlockOrder.h:148
ogdf::ArrayLevel::ArrayLevel
ArrayLevel(unsigned int size)
Definition: BlockOrder.h:48
GraphCopy.h
Declaration of graph copy classes.
ogdf::BlockOrder::m_currentPermInv
Array< int > m_currentPermInv
Inversion of m_currenPerm.
Definition: BlockOrder.h:136
ogdf::BlockOrder::adjNodes
const Array< node > & adjNodes(node v, TraversingDir dir) const override
Returns the adjacent nodes of v.
Definition: BlockOrder.h:186
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::Block::m_isEdgeBlock
bool m_isEdgeBlock
Definition: BlockOrder.h:94
CrossingMinInterfaces.h
Declaration of interfaces used in Sugiyama framework.
NodeArray.h
Declaration and implementation of NodeArray class.
ogdf::Block::m_InvertedOutgoing
Array< int > m_InvertedOutgoing
Positions of this block in m_NeighboursIncoming of neighbours.
Definition: BlockOrder.h:88
ogdf::BlockOrder::m_storedPerm
Array< int > m_storedPerm
The permutation from which the sifting step starts.
Definition: BlockOrder.h:131
ogdf::BlockOrder::size
int size() const override
Returns the number of levels.
Definition: BlockOrder.h:181
ogdf::BlockOrder::pos
int pos(node v) const override
Returns the position of node v on its level.
Definition: BlockOrder.h:178
ogdf::BlockOrder::m_verticalStepsBound
int m_verticalStepsBound
Definition: BlockOrder.h:304
OGDF_EXPORT
#define OGDF_EXPORT
Specifies that a function or class is exported by the OGDF DLL.
Definition: config.h:101
ogdf::ArrayLevel::m_nodes
Array< node > m_nodes
Definition: BlockOrder.h:45
ogdf::BlockOrder::Direction
Direction
Definition: BlockOrder.h:124
ogdf::ArrayLevel::operator[]
const node & operator[](int i) const override
Returns the node at position i.
Definition: BlockOrder.h:52
ogdf::BlockOrder::m_pos
NodeArray< int > m_pos
The position of a node on its level.
Definition: BlockOrder.h:161
ogdf::ArrayLevel::ArrayLevel
ArrayLevel(const Array< node > &nodes)
Definition: BlockOrder.h:50
ogdf::EdgeElement
Class for the representation of edges.
Definition: Graph_d.h:356
ogdf::BlockOrder::~BlockOrder
~BlockOrder()
Definition: BlockOrder.h:197
ogdf::Block::isVertexBlock
bool isVertexBlock()
Definition: BlockOrder.h:102
ogdf::BlockOrder
Hierarchical graph representation used by GlobalSifting and GridSifting algorithms.
Definition: BlockOrder.h:122
ogdf::Array::size
INDEX size() const
Returns the size (number of elements) of the array.
Definition: Array.h:297
ogdf::BlockOrder::operator[]
const ArrayLevel & operator[](int i) const override
Returns the i-th level.
Definition: BlockOrder.h:175
ogdf::BlockOrder::m_activeBlocksCount
int m_activeBlocksCount
Definition: BlockOrder.h:155
ogdf::BlockOrder::m_isActiveEdge
EdgeArray< bool > m_isActiveEdge
Stores information about active edge blocks.
Definition: BlockOrder.h:150
ogdf::LevelBase
Representation of levels in hierarchies.
Definition: CrossingMinInterfaces.h:43
ogdf::NodeElement
Class for the representation of nodes.
Definition: Graph_d.h:233
ogdf::BlockOrder::m_ranks
NodeArray< int > m_ranks
The rank (level) of a node.
Definition: BlockOrder.h:128
ogdf::BlockOrder::m_nNodesOnLvls
Array< int > m_nNodesOnLvls
Definition: BlockOrder.h:301
ogdf::internal::EdgeArrayBase2
RegisteredArray for edges of a graph, specialized for EdgeArray<edge>.
Definition: Graph_d.h:709
ogdf::Block::m_NeighboursIncoming
Array< int > m_NeighboursIncoming
Indices of neighbouring incoming blocks.
Definition: BlockOrder.h:82
ogdf::ArrayLevel::high
int high() const override
Returns the maximal array index (= size()-1).
Definition: BlockOrder.h:58
ogdf::ArrayLevel::size
int size() const override
Returns the number of nodes on this level.
Definition: BlockOrder.h:56
ogdf::BlockOrder::buildHierarchy
void buildHierarchy()
Builds arrays that allow using BlockOrder as HierarchyLevelsBase implementation.
Definition: BlockOrder.h:276