package i5.las2peer.services.ocd.metrics; import static org.junit.Assert.assertEquals; import i5.las2peer.services.ocd.adapters.AdapterException; import i5.las2peer.services.ocd.algorithms.OcdAlgorithm; import i5.las2peer.services.ocd.algorithms.SpeakerListenerLabelPropagationAlgorithm; import i5.las2peer.services.ocd.algorithms.utils.OcdAlgorithmException; import i5.las2peer.services.ocd.graphs.Cover; import i5.las2peer.services.ocd.graphs.CustomGraph; import i5.las2peer.services.ocd.graphs.GraphProcessor; import i5.las2peer.services.ocd.graphs.GraphType; import i5.las2peer.services.ocd.testsUtils.OcdTestGraphFactory; import java.io.FileNotFoundException; import java.util.HashSet; import org.junit.Ignore; import org.junit.Test; import org.la4j.matrix.Matrix; import org.la4j.matrix.dense.Basic2DMatrix; import org.la4j.matrix.sparse.CCSMatrix; import y.base.Node; public class ExtendedModularityMetricTest { /* * Assures that modularity is 0 if only one community exists. */ @Test public void testExtendedModularityWithOneCommunity() throws AdapterException, FileNotFoundException, InterruptedException { CustomGraph graph = OcdTestGraphFactory.getSawmillGraph(); Matrix memberships = new Basic2DMatrix(graph.nodeCount(), 1); for(int i=0; i<memberships.rows(); i++) { memberships.set(i, 0, 1); } Cover cover = new Cover(graph, memberships); ExtendedModularityMetric metric = new ExtendedModularityMetric(); double value = metric.measure(cover); assertEquals(0, value, 0.0001); System.out.println("1 Community"); System.out.println(value); } @Ignore @Test public void testExtendedModularityOnSawmillSLPA() throws OcdAlgorithmException, AdapterException, FileNotFoundException, InterruptedException { CustomGraph graph = OcdTestGraphFactory.getSawmillGraph(); OcdAlgorithm algo = new SpeakerListenerLabelPropagationAlgorithm(); Cover cover = algo.detectOverlappingCommunities(graph); ExtendedModularityMetric metric = new ExtendedModularityMetric(); double value = metric.measure(cover); System.out.println("Sawmill SLPA"); System.out.println(value); } @Test public void testExtendedModularityOnDirectedAperiodicTwoCommunities() throws OcdAlgorithmException, InterruptedException { CustomGraph graph = OcdTestGraphFactory.getDirectedAperiodicTwoCommunitiesGraph(); Matrix memberships = new CCSMatrix(graph.nodeCount(), 3); memberships.set(0, 0, 1); memberships.set(1, 0, 0.7); memberships.set(1, 1, 0.3); memberships.set(2, 0, 1); memberships.set(3, 0, 1); memberships.set(4, 0, 0.8); memberships.set(4, 1, 0.2); memberships.set(5, 1, 0.4); memberships.set(5, 2, 0.6); memberships.set(6, 2, 1); memberships.set(7, 2, 1); memberships.set(8, 2, 1); memberships.set(9, 1, 0.1); memberships.set(9, 2, 0.9); memberships.set(10, 0, 0.4); memberships.set(10, 1, 0.4); memberships.set(10, 2, 0.2); Cover cover = new Cover(graph, memberships); ExtendedModularityMetric metric = new ExtendedModularityMetric(); double value = metric.measure(cover); assertEquals(0.581, value, 0.01); System.out.println(value); } @Test public void testEqualsZero() throws OcdAlgorithmException, InterruptedException { for(int m_prime = 0; m_prime < 10; m_prime += 10) { CustomGraph graph = new CustomGraph(); Matrix memberships = new CCSMatrix(2*m_prime + 2, m_prime + 1); Node nodeA = graph.createNode(); Node nodeB = graph.createNode(); graph.createEdge(nodeA, nodeB); memberships.set(nodeA.index(), 0, 1); memberships.set(nodeB.index(), 0, 1); for(int i=0; i<m_prime; i++) { Node aNeighbor = graph.createNode(); graph.createEdge(nodeA, aNeighbor); memberships.set(aNeighbor.index(), 1+i, 1); Node bNeighbor = graph.createNode(); graph.createEdge(nodeB, bNeighbor); memberships.set(bNeighbor.index(), 1+i, 1); } graph.addType(GraphType.DIRECTED); GraphProcessor processor = new GraphProcessor(); processor.makeCompatible(graph, new HashSet<GraphType>()); Cover cover = new Cover(graph, memberships); ExtendedModularityMetric metric = new ExtendedModularityMetric(); double value = metric.measure(cover); assertEquals(0, value, 0.0001); System.out.println("m'=" + m_prime +": " + value); } } }