package extra;
import java.util.Vector;
import edu.uci.ics.jung.graph.Graph;
/**
*
Q(undirected)= 1/2m Sum(i,j){Aij - (K(i)-K(j))/2m } Delta(i,j)
* where m is number of links, K(i) is degree of node i: # of links for node i
* Delta(i,j) is one if i and j are in the same cluster, otherwise 0
*
Aij is 1 for un-weighted networks: can be any number for weighted networks
*/
public class Modularity extends RelativeCommunityCriteria {
public Modularity(Graph graph) {
super(graph);
}
//TODO: make it weighted !!!! edge count = sum W, size = sum W, 1 = W
@Override
public double evaluateCommunities(Vector> communities){
double modularity = 0;
double m; // edges_within_cluster, edges_between_cluster
m = graph.getEdgeCount();
for (Graph cluster : communities) {
for (V v1 : cluster.getVertices()) {
for (V v2 : cluster.getVertices()) {
if (cluster.getNeighbors(v1).contains(v2))
modularity += 1;
modularity -= graph.getNeighbors(v1).size() * graph.getNeighbors(v2).size() / (2 * m);
}
}
}
modularity /= 2 * m;
return modularity;
}
@Override
public String toString(){
return "Modularity";
}
@Override
public String getName() {
return "Q" ;
}
}