Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

ModifiedNibbleClusterer.h
Go to the documentation of this file.
1 
32 #pragma once
33 
34 #include <ogdf/basic/Graph.h>
35 #include <ogdf/basic/GraphCopy.h>
36 #include <ogdf/basic/geometry.h>
37 
38 #include <vector>
39 
40 namespace ogdf {
41 
43 
56 public:
59  , m_maxClusterSize(100)
60  , maxClusterNum(100)
61  , m_spreadProbability(0.8)
62  , m_pG(nullptr)
63  , m_pGC(nullptr)
64  , m_sns(StartNodeStrategy::MaxDeg) { }
65 
67 #if 0
68  delete m_pGC;
69 #endif
70  }
71 
72  //TODO add a call with GraphAttributes and store in intweight
73 
76  long call(Graph& G, NodeArray<long>& clusterNum);
77 
84  long call(Graph& G, NodeArray<long>& clusterNum, NodeArray<long>& topLevelNum);
85 
88  // TODO long call(ClusterGraph &C, Graph & G) {}
89  void setMaxClusterNum(int i) { maxClusterNum = i; }
90 
91  void setMaxClusterSize(long i) { m_maxClusterSize = i; }
92 
93  // Smaller clusters are joint with a neighbor (non-recursive) as a postprocessing
94  void setClusterSizeThreshold(int threshold) {
95  if (threshold > 0) {
96  m_clusterThreshold = threshold;
97  }
98  }
99 
101 
102 protected:
103  void initialize(); //1< Initialize values for calculation before first step
105  void modifiedNibble(node snode,
106  std::vector<node>& bestCluster);
107  double findBestCluster(NodeArray<bool>& isActive, std::vector<node>& activeNodes,
108  std::vector<node>& cluster);
109  void spreadValues(NodeArray<bool>& isActive, std::vector<node>& activeNodes,
110  NodeArray<double>& probUpdate);
111 
112  inline long maxClusterSize() { return m_maxClusterSize; }
113 
114  // Arithmetic plus Geometric Progression
115  int aPGP(int i) {
116  const int a = 2;
117  const int d = 7;
118  const double r = 1.5;
119  return static_cast<int>(ceil(a * pot(r, i))) + i * d + a;
120  }
121 
122  // TODO we expect i to be very small, but do this efficiently anyway
123  double pot(double r, long i) { return pow(r, static_cast<double>(i)); }
124 
126  const int factor = 25;
127  //does not make sense to set it to 500 as they did, as we want less clusters.
128  return factor * m_maxClusterSize;
129  }
130 
131  void postProcess();
132 
133 private:
134  int m_steps;
135  int m_clusterThreshold; // Below that size all remaining nodes are just packed in a cluster
137  long m_maxActiveNodes; // Bound on number of nodes in active set
139  double m_spreadProbability; //how much is spread, i.e. 1-val is the prob to stay at the node
140  node m_startNode; // Node to start a walk from
141  NodeArray<double> m_prob; // Probability of a node along the walk
145 
146  // Tests
147  bool testSpreadSum() {
148  double sum = 0.0;
149  for (node v : m_pGC->nodes) {
150  sum += m_prob[v];
151  }
152  return OGDF_GEOM_ET.equal(sum, 1.0);
153  }
154 };
155 
156 }
ogdf::ModifiedNibbleClusterer::m_spreadProbability
double m_spreadProbability
Definition: ModifiedNibbleClusterer.h:139
ogdf
The namespace for all OGDF objects.
Definition: AugmentationModule.h:36
ogdf::ModifiedNibbleClusterer::m_maxClusterSize
long m_maxClusterSize
Definition: ModifiedNibbleClusterer.h:136
Graph.h
Includes declaration of graph class.
ogdf::ModifiedNibbleClusterer::maxClusterNum
int maxClusterNum
Definition: ModifiedNibbleClusterer.h:138
geometry.h
Declaration of classes GenericPoint, GenericPolyline, GenericLine, GenericSegment,...
ogdf::ModifiedNibbleClusterer::setMaxClusterSize
void setMaxClusterSize(long i)
Definition: ModifiedNibbleClusterer.h:91
ogdf::ModifiedNibbleClusterer::initialize
void initialize()
ogdf::ModifiedNibbleClusterer::StartNodeStrategy::MaxDeg
@ MaxDeg
ogdf::ModifiedNibbleClusterer::findBestCluster
double findBestCluster(NodeArray< bool > &isActive, std::vector< node > &activeNodes, std::vector< node > &cluster)
ogdf::ModifiedNibbleClusterer::StartNodeStrategy::Random
@ Random
ogdf::ModifiedNibbleClusterer::call
long call(Graph &G, NodeArray< long > &clusterNum)
Call method: Creates a clustering of G Returns number of created clusters and sets cluster index for ...
ogdf::GraphCopy
Copies of graphs supporting edge splitting.
Definition: GraphCopy.h:384
ogdf::ModifiedNibbleClusterer
The modified nibble clustering algorithm.
Definition: ModifiedNibbleClusterer.h:55
ogdf::ModifiedNibbleClusterer::m_startNode
node m_startNode
Definition: ModifiedNibbleClusterer.h:140
ogdf::ClusterElement
Representation of clusters in a clustered graph.
Definition: ClusterGraph.h:55
r
int r[]
Definition: hierarchical-ranking.cpp:8
ogdf::Graph::nodes
internal::GraphObjectContainer< NodeElement > nodes
The container containing all node objects.
Definition: Graph_d.h:924
ogdf::ModifiedNibbleClusterer::m_maxActiveNodes
long m_maxActiveNodes
Definition: ModifiedNibbleClusterer.h:137
ogdf::OGDF_GEOM_ET
const EpsilonTest OGDF_GEOM_ET
ogdf::ModifiedNibbleClusterer::pot
double pot(double r, long i)
Definition: ModifiedNibbleClusterer.h:123
ogdf::ModifiedNibbleClusterer::m_pG
Graph * m_pG
Definition: ModifiedNibbleClusterer.h:142
ogdf::ModifiedNibbleClusterer::StartNodeStrategy::MinDeg
@ MinDeg
ogdf::ModifiedNibbleClusterer::maxClusterSize
long maxClusterSize()
Definition: ModifiedNibbleClusterer.h:112
ogdf::ModifiedNibbleClusterer::m_prob
NodeArray< double > m_prob
Definition: ModifiedNibbleClusterer.h:141
GraphCopy.h
Declaration of graph copy classes.
ogdf::ModifiedNibbleClusterer::StartNodeStrategy
StartNodeStrategy
Definition: ModifiedNibbleClusterer.h:100
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::ModifiedNibbleClusterer::setClusterSizeThreshold
void setClusterSizeThreshold(int threshold)
Definition: ModifiedNibbleClusterer.h:94
ogdf::ModifiedNibbleClusterer::m_sns
StartNodeStrategy m_sns
Definition: ModifiedNibbleClusterer.h:144
ogdf::ModifiedNibbleClusterer::selectStartNode
node selectStartNode()
select start node according to some strategy
ogdf::ModifiedNibbleClusterer::modifiedNibble
void modifiedNibble(node snode, std::vector< node > &bestCluster)
main step with walks starting from snode
ogdf::EpsilonTest::equal
std::enable_if< std::is_integral< T >::value, bool >::type equal(const T &x, const T &y) const
Compare if x is EQUAL to y for integral types.
Definition: EpsilonTest.h:109
ogdf::ModifiedNibbleClusterer::testSpreadSum
bool testSpreadSum()
Definition: ModifiedNibbleClusterer.h:147
ogdf::ModifiedNibbleClusterer::spreadValues
void spreadValues(NodeArray< bool > &isActive, std::vector< node > &activeNodes, NodeArray< double > &probUpdate)
ogdf::ModifiedNibbleClusterer::m_pGC
GraphCopy * m_pGC
Definition: ModifiedNibbleClusterer.h:143
ogdf::ModifiedNibbleClusterer::setMaxClusterNum
void setMaxClusterNum(int i)
Call method: Creates a clustering of G in C Returns number of created clusters.
Definition: ModifiedNibbleClusterer.h:89
ogdf::ModifiedNibbleClusterer::~ModifiedNibbleClusterer
~ModifiedNibbleClusterer()
Definition: ModifiedNibbleClusterer.h:66
ogdf::ModifiedNibbleClusterer::activeNodeBound
long activeNodeBound()
Definition: ModifiedNibbleClusterer.h:125
ogdf::ModifiedNibbleClusterer::postProcess
void postProcess()
ogdf::ModifiedNibbleClusterer::m_steps
int m_steps
Definition: ModifiedNibbleClusterer.h:134
ogdf::ModifiedNibbleClusterer::ModifiedNibbleClusterer
ModifiedNibbleClusterer()
Definition: ModifiedNibbleClusterer.h:57
ogdf::ModifiedNibbleClusterer::aPGP
int aPGP(int i)
Definition: ModifiedNibbleClusterer.h:115
ogdf::ModifiedNibbleClusterer::m_clusterThreshold
int m_clusterThreshold
Definition: ModifiedNibbleClusterer.h:135
ogdf::NodeElement
Class for the representation of nodes.
Definition: Graph_d.h:233