package i5.las2peer.services.ocd.metrics;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import i5.las2peer.services.ocd.graphs.Cover;
import i5.las2peer.services.ocd.graphs.GraphType;
import y.base.Graph;
import y.base.Node;
import y.base.NodeCursor;
public class ExtendedModularityMetricCoMembership implements StatisticalMeasure {
public ExtendedModularityMetricCoMembership() {
}
@Override
public void setParameters(Map<String, String> parameters) {
}
@Override
public Map<String, String> getParameters() {
return new HashMap<String, String>();
}
@Override
public Set<GraphType> compatibleGraphTypes() {
Set<GraphType> compatibleTypes = new HashSet<GraphType>();
compatibleTypes.add(GraphType.DIRECTED);
compatibleTypes.add(GraphType.ZERO_WEIGHTS);
return compatibleTypes;
}
public double measure(Cover cover) throws InterruptedException {
double metricValue = 0;
Graph graph = cover.getGraph();
NodeCursor nodesA = graph.nodes();
NodeCursor nodesB = graph.nodes();
Node nodeA;
Node nodeB;
while(nodesA.ok()) {
nodeA = nodesA.node();
nodesB.toFirst();
while(nodesB.ok()) {
nodeB = nodesB.node();
metricValue +=
getNodePairModularityContribution(cover, nodeA, nodeB);
nodesB.next();
}
nodesA.next();
}
if(graph.edgeCount() > 0) {
metricValue /= (graph.edgeCount() * 2);
}
return metricValue;
}
private double getNodePairModularityContribution(Cover cover, Node nodeA, Node nodeB){
double cont = 0;
double edgeCont = 0;
double degreeProd;
double coMembership = 0;
for(Integer comId: cover.getCommunityIndices(nodeA)){
if(cover.getCommunityIndices(nodeB).contains(comId)){
coMembership += (cover.getBelongingFactor(nodeA, comId) * cover.getBelongingFactor(nodeB, comId));
}
}
double adjacencyEntry = 0;
if(cover.getGraph().containsEdge(nodeA, nodeB)){
adjacencyEntry = 1;
}
degreeProd = nodeA.inDegree() * nodeB.inDegree();
edgeCont = (adjacencyEntry - (degreeProd / (cover.getGraph().edgeCount() * 2)));
cont = edgeCont * coMembership;
return cont;
}
}