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" ; } }