Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

MultilevelGraph.h
Go to the documentation of this file.
1 
32 #pragma once
33 
34 #include <ogdf/basic/Graph.h>
36 
37 #include <map>
38 #include <vector>
39 
40 namespace ogdf {
41 
42 //Stores info on merging for a refinement level
43 struct NodeMerge {
44  // Node/Edge IDs instead of pointers as the nodes themselves may be nonexistent.
45  std::vector<int> m_deletedEdges;
46  std::vector<int> m_changedEdges;
47  std::map<int, double> m_doubleWeight; // for changed and deleted edges
48  std::map<int, int> m_source;
49  std::map<int, int> m_target;
50 
52  // optional information <target, distance>.
53  // mergedNode will be placed at average of relative distances to target.
54  std::vector<std::pair<int, double>> m_position;
55 
56  std::vector<int> m_changedNodes; // there may be placement strategies that use more than one reference-node.
57  std::map<int, double> m_radius; // for changed nodes and the merged node
58 
59  int m_level;
60 
61  explicit NodeMerge(int level) : m_mergedNode(-1), m_level(level) { }
62 
63  ~NodeMerge() { }
64 };
65 
67 private:
68  bool m_createdGraph; //used in destructor, TODO: check if it is needed
70  GraphAttributes* m_GA; //<! Keeps layout info in replacement of information below (todo: remove them)
71  std::vector<NodeMerge*> m_changes;
73  double m_avgRadius; //stores average node radius for scaling and random layout purposes
74 
76 
77  // Associations to index only as the node/edge may be nonexistent
80 
81  std::vector<node> m_reverseNodeIndex;
82  std::vector<int> m_reverseNodeMergeWeight; //<! Keeps number of vertices represented by vertex with given index
83  std::vector<edge> m_reverseEdgeIndex;
84 
85  MultilevelGraph* removeOneCC(std::vector<node>& componentSubArray);
86  void copyFromGraph(const Graph& G, NodeArray<int>& nodeAssociations,
87  EdgeArray<int>& edgeAssociations);
88  void prepareGraphAttributes(GraphAttributes& GA) const;
89 
90  void initReverseIndizes();
91  void initInternal();
92 
93 public:
94  ~MultilevelGraph();
96  explicit MultilevelGraph(Graph& G);
97  explicit MultilevelGraph(GraphAttributes& GA);
98  // if the Graph is available without const, no copy needs to be created.
100 
101  // creates MultilevelGraph directly from GML file.
102  explicit MultilevelGraph(std::istream& is);
103  explicit MultilevelGraph(const char* filename);
104 
105  NodeArray<double>& getRArray() { return m_radius; }
106 
107  EdgeArray<double>& getWArray() { return m_weight; }
108 
109  edge getEdge(unsigned int index);
110  node getNode(unsigned int index);
111 
112  double radius(node v) { return m_radius[v]; }
113 
114  void radius(node v, double r) { m_radius[v] = r; }
115 
116  double averageRadius() const { return m_avgRadius; }
117 
118  double x(node v) { return m_GA->x(v); }
119 
120  double y(node v) { return m_GA->y(v); }
121 
122  void x(node v, double x) { m_GA->x(v) = x; }
123 
124  void y(node v, double y) { m_GA->y(v) = y; }
125 
126  void weight(edge e, double weight) { m_weight[e] = weight; }
127 
128  double weight(edge e) { return m_weight[e]; }
129 
130  //returns the merge weight, i.e. the number of nodes represented by v on the current level
131  int mergeWeight(node v) { return m_reverseNodeMergeWeight[v->index()]; }
132 
133  void moveToZero();
134 
135  int getLevel();
136 
137  Graph& getGraph() { return *m_G; }
138 
140  GraphAttributes& getGraphAttributes() const { return *m_GA; }
141 
142  void exportAttributes(GraphAttributes& GA) const;
143  void exportAttributesSimple(GraphAttributes& GA) const;
144  void importAttributes(const GraphAttributes& GA);
145  void importAttributesSimple(const GraphAttributes& GA);
146  void reInsertGraph(MultilevelGraph& MLG);
147  void reInsertAll(std::vector<MultilevelGraph*>& components);
148  void copyNodeTo(node v, MultilevelGraph& MLG, std::map<node, node>& tempNodeAssociations,
149  bool associate, int index = -1);
150  void copyEdgeTo(edge e, MultilevelGraph& MLG, std::map<node, node>& tempNodeAssociations,
151  bool associate, int index = -1);
152  void writeGML(std::ostream& os);
153  void writeGML(const char* fileName);
154 
155  // the original graph will be cleared to save Memory
156  OGDF_DEPRECATED("Use ComponentSplitterLayout instead.")
157  std::vector<MultilevelGraph*> splitIntoComponents();
158 
159  bool postMerge(NodeMerge* NM, node merged);
160  //\a merged is the node now represented by \a theNode
161  bool changeNode(NodeMerge* NM, node theNode, double newRadius, node merged);
162  bool changeEdge(NodeMerge* NM, edge theEdge, double newWeight, node newSource, node newTarget);
163  bool deleteEdge(NodeMerge* NM, edge theEdge);
164  std::vector<edge> moveEdgesToParent(NodeMerge* NM, node theNode, node parent,
165  bool deleteDoubleEndges, int adjustEdgeLengths);
166  NodeMerge* getLastMerge();
167  node undoLastMerge();
168 
169  void updateReverseIndizes();
170  //sets the merge weights back to initial values
171  void updateMergeWeights();
172 };
173 
174 }
ogdf::MultilevelGraph::m_GA
GraphAttributes * m_GA
Definition: MultilevelGraph.h:70
ogdf
The namespace for all OGDF objects.
Definition: AugmentationModule.h:36
ogdf::MultilevelGraph::radius
void radius(node v, double r)
Definition: MultilevelGraph.h:114
ogdf::GraphAttributes
Stores additional attributes of a graph (like layout information).
Definition: GraphAttributes.h:66
GraphAttributes.h
Declaration of class GraphAttributes which extends a Graph by additional attributes.
ogdf::NodeMerge::m_position
std::vector< std::pair< int, double > > m_position
Definition: MultilevelGraph.h:54
Graph.h
Includes declaration of graph class.
OGDF_DEPRECATED
#define OGDF_DEPRECATED(reason)
Mark a class / member / function as deprecated.
Definition: config.h:120
ogdf::NodeMerge::m_mergedNode
int m_mergedNode
Definition: MultilevelGraph.h:51
ogdf::NodeElement::index
int index() const
Returns the (unique) node index.
Definition: Graph_d.h:267
ogdf::MultilevelGraph::m_changes
std::vector< NodeMerge * > m_changes
Definition: MultilevelGraph.h:71
ogdf::MultilevelGraph::getGraphAttributes
GraphAttributes & getGraphAttributes() const
Returns attributes of current level graph as GraphAttributes.
Definition: MultilevelGraph.h:140
ogdf::MultilevelGraph::getGraph
Graph & getGraph()
Definition: MultilevelGraph.h:137
ogdf::GraphAttributes::x
double x(node v) const
Returns the x-coordinate of node v.
Definition: GraphAttributes.h:241
ogdf::NodeMerge::m_level
int m_level
Definition: MultilevelGraph.h:59
ogdf::MultilevelGraph::averageRadius
double averageRadius() const
Definition: MultilevelGraph.h:116
ogdf::MultilevelGraph
Definition: MultilevelGraph.h:66
ogdf::NodeMerge::m_radius
std::map< int, double > m_radius
Definition: MultilevelGraph.h:57
ogdf::MultilevelGraph::m_nodeAssociations
NodeArray< int > m_nodeAssociations
Definition: MultilevelGraph.h:78
ogdf::MultilevelGraph::radius
double radius(node v)
Definition: MultilevelGraph.h:112
ogdf::NodeMerge::m_changedEdges
std::vector< int > m_changedEdges
Definition: MultilevelGraph.h:46
ogdf::GraphAttributes::y
double y(node v) const
Returns the y-coordinate of node v.
Definition: GraphAttributes.h:259
ogdf::NodeMerge::m_doubleWeight
std::map< int, double > m_doubleWeight
Definition: MultilevelGraph.h:47
ogdf::MultilevelGraph::getRArray
NodeArray< double > & getRArray()
Definition: MultilevelGraph.h:105
ogdf::NodeMerge
Definition: MultilevelGraph.h:43
r
int r[]
Definition: hierarchical-ranking.cpp:8
ogdf::MultilevelGraph::m_createdGraph
bool m_createdGraph
Definition: MultilevelGraph.h:68
ogdf::MultilevelGraph::m_reverseNodeIndex
std::vector< node > m_reverseNodeIndex
Definition: MultilevelGraph.h:81
ogdf::MultilevelGraph::m_avgRadius
double m_avgRadius
Definition: MultilevelGraph.h:73
ogdf::internal::GraphRegisteredArray
RegisteredArray for nodes, edges and adjEntries of a graph.
Definition: Graph_d.h:651
ogdf::NodeMerge::NodeMerge
NodeMerge(int level)
Definition: MultilevelGraph.h:61
ogdf::Graph
Data type for general directed graphs (adjacency list representation).
Definition: Graph_d.h:862
ogdf::MultilevelGraph::getWArray
EdgeArray< double > & getWArray()
Definition: MultilevelGraph.h:107
ogdf::MultilevelGraph::m_reverseNodeMergeWeight
std::vector< int > m_reverseNodeMergeWeight
Definition: MultilevelGraph.h:82
ogdf::MultilevelGraph::m_reverseEdgeIndex
std::vector< edge > m_reverseEdgeIndex
Definition: MultilevelGraph.h:83
ogdf::MultilevelGraph::x
void x(node v, double x)
Definition: MultilevelGraph.h:122
ogdf::MultilevelGraph::weight
void weight(edge e, double weight)
Definition: MultilevelGraph.h:126
std
Definition: GML.h:110
ogdf::MultilevelGraph::y
double y(node v)
Definition: MultilevelGraph.h:120
ogdf::NodeMerge::m_source
std::map< int, int > m_source
Definition: MultilevelGraph.h:48
OGDF_EXPORT
#define OGDF_EXPORT
Specifies that a function or class is exported by the OGDF DLL.
Definition: config.h:101
ogdf::MultilevelGraph::m_radius
NodeArray< double > m_radius
Definition: MultilevelGraph.h:72
ogdf::MultilevelGraph::mergeWeight
int mergeWeight(node v)
Definition: MultilevelGraph.h:131
ogdf::MultilevelGraph::x
double x(node v)
Definition: MultilevelGraph.h:118
ogdf::NodeMerge::~NodeMerge
~NodeMerge()
Definition: MultilevelGraph.h:63
ogdf::MultilevelGraph::weight
double weight(edge e)
Definition: MultilevelGraph.h:128
ogdf::EdgeElement
Class for the representation of edges.
Definition: Graph_d.h:356
ogdf::NodeMerge::m_deletedEdges
std::vector< int > m_deletedEdges
Definition: MultilevelGraph.h:45
ogdf::MultilevelGraph::m_edgeAssociations
EdgeArray< int > m_edgeAssociations
Definition: MultilevelGraph.h:79
ogdf::MultilevelGraph::m_weight
EdgeArray< double > m_weight
Definition: MultilevelGraph.h:75
ogdf::MultilevelGraph::y
void y(node v, double y)
Definition: MultilevelGraph.h:124
ogdf::NodeElement
Class for the representation of nodes.
Definition: Graph_d.h:233
ogdf::NodeMerge::m_target
std::map< int, int > m_target
Definition: MultilevelGraph.h:49
ogdf::NodeMerge::m_changedNodes
std::vector< int > m_changedNodes
Definition: MultilevelGraph.h:56
ogdf::internal::EdgeArrayBase2
RegisteredArray for edges of a graph, specialized for EdgeArray<edge>.
Definition: Graph_d.h:709
ogdf::MultilevelGraph::m_G
Graph * m_G
Definition: MultilevelGraph.h:69