package i5.las2peer.services.ocd.metrics; import java.util.LinkedList; import org.la4j.matrix.Matrix; import org.la4j.vector.Vector; import com.sun.corba.se.impl.orbutil.graph.Graph; import i5.las2peer.services.ocd.graphs.Cover; import i5.las2peer.services.ocd.graphs.CustomGraph; import y.base.Node; import y.base.NodeCursor; public class CoverData { public CoverData(){ } /** * computes the number of overlapping nodes (nodes that belong to more than one community) * @param cover * @return number of overlapping nodes */ public double noOverlappNodes(Cover cover){ double res = 0; int j = 0; Matrix m = cover.getMemberships(); int rows = m.rows(); for(int i = 0; i < rows; i++){ Vector v = m.getRow(i); while(j < v.length()){ while(v.get(j) == 0 && j < v.length()){ j++; } if(v.get(j) < 1 && v.get(j) > 0){ res++; j = 0; break; }else{ j = 0; break; } } } return res; } public double avgCommunitySize(Cover cover){ int comSum = 0; for(int i = 0; i < cover.communityCount(); i++){ comSum += cover.getCommunitySize(i); } return comSum/((double)cover.communityCount()); } public Integer[] degreeDist(CustomGraph graph){ Integer[] r = new Integer[graph.edgeCount()+1]; NodeCursor nodes = graph.nodes(); while(nodes.ok()){ Node n = nodes.node(); if(r[n.degree()] == null){ r[n.degree()] = 1; }else{ int deg = r[n.degree()]; deg++; r[n.degree()] = deg; } nodes.next(); } /*for(int i = 0; i < res.size(); i++){ if(res.get(i) == null){ res.set(i, 0); } }*/ return r; } public Integer[] communitySizeDist(Cover cover){ Integer[] res = new Integer[cover.getGraph().nodeCount()+1]; for(int i = 0; i < cover.communityCount(); i++){ if(res[cover.getCommunitySize(i)] == null){ res[cover.getCommunitySize(i)] = 1; }else{ int sizeCount = res[cover.getCommunitySize(i)]; sizeCount++; res[cover.getCommunitySize(i)] = sizeCount; } } /*for(int i = 0; i < res.size(); i++){ if(res.get(i) == null){ res.set(i, 0); } }*/ return res; } }