Don't import ogdf namespace
[TortoiseGit.git] / ext / OGDF / src / energybased / GalaxyMultilevel.h
blob248c40bff3ac2bca228d82a9b563c6edb375a910
1 /*
2 * $Revision: 2559 $
4 * last checkin:
5 * $Author: gutwenger $
6 * $Date: 2012-07-06 15:04:28 +0200 (Fr, 06. Jul 2012) $
7 ***************************************************************/
9 /** \file
10 * \brief Declaration of class GalaxyMultilevelBuilder.
12 * \author Martin Gronemann
14 * \par License:
15 * This file is part of the Open Graph Drawing Framework (OGDF).
17 * \par
18 * Copyright (C)<br>
19 * See README.txt in the root directory of the OGDF installation for details.
21 * \par
22 * This program is free software; you can redistribute it and/or
23 * modify it under the terms of the GNU General Public License
24 * Version 2 or 3 as published by the Free Software Foundation;
25 * see the file LICENSE.txt included in the packaging of this file
26 * for details.
28 * \par
29 * This program is distributed in the hope that it will be useful,
30 * but WITHOUT ANY WARRANTY; without even the implied warranty of
31 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
32 * GNU General Public License for more details.
34 * \par
35 * You should have received a copy of the GNU General Public
36 * License along with this program; if not, write to the Free
37 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
38 * Boston, MA 02110-1301, USA.
40 * \see http://www.gnu.org/copyleft/gpl.html
41 ***************************************************************/
43 #ifdef _MSC_VER
44 #pragma once
45 #endif
47 #ifndef OGDF_GALAXY_MULTILEVEL_H
48 #define OGDF_GALAXY_MULTILEVEL_H
50 #include <ogdf/basic/GraphAttributes.h>
51 #include <ogdf/basic/tuples.h>
52 #include <ogdf/basic/simple_graph_alg.h>
53 #include "ArrayGraph.h"
54 #include "FastUtils.h"
55 #include <algorithm>
57 namespace ogdf {
59 class GalaxyMultilevel
61 public:
62 typedef List<Tuple2< node, int > > NearSunList;
64 struct LevelNodeInfo
66 float mass;
67 float radius;
68 node parent;
69 NearSunList nearSuns;
72 struct LevelEdgeInfo
74 float length;
77 GalaxyMultilevel(Graph* pGraph)
79 m_pFinerMultiLevel = 0;
80 m_pCoarserMultiLevel = 0;
81 m_pGraph = pGraph;
82 m_pNodeInfo = new NodeArray<LevelNodeInfo>(*m_pGraph);
83 m_pEdgeInfo = new EdgeArray<LevelEdgeInfo>(*m_pGraph);
84 node v;
85 forall_nodes(v, *m_pGraph)
87 (*m_pNodeInfo)[v].mass = 1.0;
89 levelNumber = 0;
92 GalaxyMultilevel(GalaxyMultilevel* prev)
94 m_pCoarserMultiLevel = 0;
95 m_pFinerMultiLevel = prev;
96 m_pFinerMultiLevel->m_pCoarserMultiLevel = this;
97 m_pGraph = 0;
98 m_pNodeInfo = 0;
99 levelNumber = prev->levelNumber + 1;
102 ~GalaxyMultilevel() { }
104 GalaxyMultilevel* m_pFinerMultiLevel;
105 GalaxyMultilevel* m_pCoarserMultiLevel;
106 Graph* m_pGraph;
107 NodeArray<LevelNodeInfo>* m_pNodeInfo;
108 EdgeArray<LevelEdgeInfo>* m_pEdgeInfo;
109 int levelNumber;
113 class GalaxyMultilevelBuilder
115 public:
116 struct LevelNodeState
118 node lastVisitor;
119 double sysMass;
120 int label;
121 float edgeLengthFromSun;
124 struct NodeOrderInfo
126 node theNode;
129 GalaxyMultilevel* build(GalaxyMultilevel* pMultiLevel);
131 private:
132 void computeSystemMass();
133 void sortNodesBySystemMass();
134 void createResult(GalaxyMultilevel* pMultiLevelResult);
135 void labelSystem(node u, node v, int d, float df);
136 void labelSystem();
137 Graph* m_pGraph;
138 Graph* m_pGraphResult;
139 List<node> m_sunNodeList;
140 List<edge> m_interSystemEdges;
141 NodeArray<GalaxyMultilevel::LevelNodeInfo>* m_pNodeInfo;
142 EdgeArray<GalaxyMultilevel::LevelEdgeInfo>* m_pEdgeInfo;
143 NodeArray<GalaxyMultilevel::LevelNodeInfo>* m_pNodeInfoResult;
144 EdgeArray<GalaxyMultilevel::LevelEdgeInfo>* m_pEdgeInfoResult;
145 NodeArray<LevelNodeState> m_nodeState;
146 NodeOrderInfo* m_nodeMassOrder;
147 RandomNodeSet* m_pRandomSet;
148 int m_dist;
152 class NodeMassComparer
154 public:
155 NodeMassComparer(const NodeArray< GalaxyMultilevelBuilder::LevelNodeState>& nodeState) : m_nodeState(nodeState) { }
157 // used for std::sort
158 inline bool operator()(const GalaxyMultilevelBuilder::NodeOrderInfo& a, const GalaxyMultilevelBuilder::NodeOrderInfo& b) const
160 return m_nodeState[a.theNode].sysMass < m_nodeState[b.theNode].sysMass;
163 private:
164 const NodeArray< GalaxyMultilevelBuilder::LevelNodeState >& m_nodeState;
167 } // end of namespace ogdf
169 #endif