Graph-NewmanGirvan
view release on metacpan or search on metacpan
NewmanGirvan.xs view on Meta::CPAN
nodeToCluster.insert(std::pair<node, int>(i->first, contrNodeToCluster[nodeToContr[i->first]]));
}
// refine decontracted clustering
std::map< node, std::list<edge> > nodeToEdge;
for (std::list<node>::const_iterator i = nodes.begin(); i != nodes.end(); ++i) {
nodeToEdge.insert(std::pair<node, std::list<edge> >(*i, std::list<edge>()));
}
for (std::list<edge>::const_iterator i = edges.begin(); i != edges.end(); ++i) {
nodeToEdge[i->src].push_back(*i);
}
refine(nodeToCluster, nodeToEdge, atedges, atpairs);
return nodeToCluster;
}
std::map<node, int>
NewmanGirvan::execute(std::list<node>& nodes, std::list<edge>& edges, bool ignoreLoops) {
// compute atedgeCnt and atpairCnt
double atedgeCnt = 0.0;
for (std::list<edge>::const_iterator i = edges.begin(); i != edges.end(); ++i) {
if (!ignoreLoops || !(i->src == i->dst)) {
atedgeCnt += i->weight;
}
}
double atpairCnt = 0.0;
for (std::list<node>::const_iterator i = nodes.begin(); i != nodes.end(); ++i) {
atpairCnt += i->weight;
}
atpairCnt *= atpairCnt;
if (ignoreLoops) {
for (std::list<node>::const_iterator i = nodes.begin(); i != nodes.end(); ++i) {
atpairCnt -= i->weight * i->weight;
}
}
// compute clustering
return cluster(nodes, edges, atedgeCnt, atpairCnt);
}
MODULE = Graph::NewmanGirvan PACKAGE = Graph::NewmanGirvan
NewmanGirvan *
NewmanGirvan::new()
void
NewmanGirvan::add_edge(const char* src, const char* dst, double weight)
void
NewmanGirvan::set_vertex_weight(const char* vertex, double weight)
void
NewmanGirvan::compute()
PREINIT:
PPCODE:
std::map<std::string, int> result = THIS->run();
for (std::map<std::string, int>::const_iterator i = result.begin(); i != result.end(); ++i) {
mXPUSHs(newSVpvn(i->first.c_str(), i->first.size()));
mXPUSHs(newSVnv(i->second));
}
void
NewmanGirvan::DESTROY()
( run in 2.687 seconds using v1.01-cache-2.11-cpan-71847e10f99 )