package i5.las2peer.services.ocd.graphs;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import i5.las2peer.services.ocd.adapters.AdapterException;
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.metrics.ExtendedModularityMetric;
import i5.las2peer.services.ocd.metrics.OcdMetricException;
import i5.las2peer.services.ocd.metrics.StatisticalMeasure;
import i5.las2peer.services.ocd.testsUtils.OcdTestGraphFactory;
import java.io.FileNotFoundException;
import java.util.List;
import org.junit.Before;
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 CoverTest {
private Cover cover;
/*
* Creates a cover for the sawmill graph
*/
@Before
public void sawmillCoverSetUp() throws AdapterException, FileNotFoundException {
CustomGraph graph = OcdTestGraphFactory.getSawmillGraph();
Matrix memberships = new Basic2DMatrix(graph.nodeCount(), 5);
for(int i=0; i<memberships.rows(); i++) {
for(int j=0; j<memberships.columns(); j++) {
memberships.set(i, j, i*j);
}
}
cover = new Cover(graph, memberships);
System.out.println(cover);
}
/*
* Tests cover normalization.
*/
@Test
public void testMembershipNormalization() {
Matrix memberships = cover.getMemberships();
double rowSum;
for(int i=0; i<memberships.rows(); i++) {
rowSum = 0;
for(int j=0; j<memberships.columns(); j++) {
//////////// TODO test
System.out.println("(" + i + ", " + j + ") = " + memberships.get(i, j));
/////////
rowSum += memberships.get(i, j);
}
assertEquals(1.0, rowSum, 0.00001);
}
}
/*
* Tests membership filtering.
*/
@Test
public void testFilterMemberships() throws OcdMetricException, InterruptedException, OcdAlgorithmException {
StatisticalMeasure metric = new ExtendedModularityMetric();
metric.measure(cover);
/*
* First row must remain unchanged and sum up to zero precisely.
*/
System.out.println(cover.toString());
cover.filterMembershipsbyThreshold(0.25);
System.out.println(cover.toString());
assertEquals(0, cover.getMetrics().size());
assertEquals(3, cover.communityCount());
}
/*
* Tests return values of the belonging factors.
*/
@Test
public void testGetBelongingFactor() {
CustomGraph graph = cover.getGraph();
Node[] nodes = graph.getNodeArray();
for(int i=0; i<graph.nodeCount(); i++) {
double rowSum = 0;
for(int j=0; j<cover.communityCount() - 1; j++) {
rowSum += i*j;
}
if(rowSum == 0) {
rowSum = 1;
}
for(int j=0; j<cover.communityCount(); j++) {
if(j<cover.communityCount() - 1) {
assertEquals(i*j / rowSum, cover.getBelongingFactor(nodes[i], j), 0.001);
}
else if (i>0) {
assertEquals(0, cover.getBelongingFactor(nodes[i], j), 0.001);
}
else {
assertEquals(1, cover.getBelongingFactor(nodes[i], j), 0.001);
}
}
}
}
/*
* Tests the return value of the community count.
*/
@Test
public void testCommunityCount() {
assertEquals(cover.communityCount(), 6);
}
/*
* Tests the return value of the community indices of a node.
*/
@Test
public void testGetCommunityIndices() {
CustomGraph graph = cover.getGraph();
Node[] nodes = graph.getNodeArray();
List<Integer> indices = cover.getCommunityIndices(nodes[0]);
assertEquals(1, indices.size());
assertEquals(5, (int)indices.get(0));
indices = cover.getCommunityIndices(nodes[1]);
assertEquals(4, indices.size());
for(int i=1; i<= 4; i++) {
assertTrue(indices.contains(i));
}
}
@Test
public void testSetEntriesBelowThresholdToZero() {
Matrix memberships = new CCSMatrix(1, 5);
memberships.set(0, 1, 1);
memberships.set(0, 2, 2);
memberships.set(0, 3, 3);
memberships.set(0, 4, 3);
CustomGraph graph = new CustomGraph();
graph.createNode();
Cover cover = new Cover(graph, memberships);
System.out.println(cover);
cover.setRowEntriesBelowThresholdToZero(memberships, 0, 0.3);
assertEquals(0, memberships.get(0, 0), 0);
assertEquals(0, memberships.get(0, 1), 0);
assertEquals(0, memberships.get(0, 2), 0);
assertEquals(0.3333, memberships.get(0, 3), 0.001);
assertEquals(0.3333, memberships.get(0, 4), 0.001);
System.out.println(memberships);
}
}