package i5.las2peer.services.ocd.algorithms;
import static org.junit.Assert.*;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.junit.Test;
import org.la4j.matrix.Matrix;
import org.la4j.matrix.dense.Basic2DMatrix;
import org.la4j.vector.Vector;
import org.la4j.vector.dense.BasicVector;
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.testsUtils.OcdTestGraphFactory;
import y.base.Node;
public class SignedDMIDAlgorithmTest {
@Test
public void testGetLeadershipVector() throws FileNotFoundException, AdapterException, InterruptedException {
CustomGraph graph = OcdTestGraphFactory.getSignedLfrSixNodesGraph();
int nodeCount = graph.nodeCount();
SignedDMIDAlgorithm algo = new SignedDMIDAlgorithm();
Vector leadershipVector = algo.getLeadershipVector(graph);
Vector expectedVector = new BasicVector(nodeCount);
expectedVector.set(0, 0.535714286);
expectedVector.set(1, 0.48);
expectedVector.set(2, -0.02);
expectedVector.set(3, 0.568181818);
expectedVector.set(4, -0.071428571);
expectedVector.set(5, 0.428571429);
double controlSum = 0;
/*
* compute the difference between the known entry and the calculated
* entry the cumulative sum of all differences should be near to 0.
*/
for (int i = 0; i < nodeCount; i++) {
controlSum += leadershipVector.get(i) - expectedVector.get(i);
}
System.out.println(controlSum);
assertEquals(0, controlSum, 0.01);
}
@Test
public void testGetLocalLeader() throws FileNotFoundException, AdapterException, InterruptedException {
CustomGraph graph = OcdTestGraphFactory.getSignedLfrGraph();
int nodeCount = graph.nodeCount();
SignedDMIDAlgorithm algo = new SignedDMIDAlgorithm();
Vector leadershipVector = new BasicVector(nodeCount);
leadershipVector.set(0, 0.465116279);
leadershipVector.set(1, 0.480769231);
leadershipVector.set(2, 0.166666667);
leadershipVector.set(3, 0.573770492);
leadershipVector.set(4, 0.462962963);
leadershipVector.set(5, 0.305555556);
leadershipVector.set(6, 0.352631579);
leadershipVector.set(7, -0.037037037);
leadershipVector.set(8, 0.465116279);
leadershipVector.set(9, 0.441176471);
leadershipVector.set(10, 0.471698113);
leadershipVector.set(11, 0.486486486);
Map<Integer, Integer> expectedMap = new HashMap<Integer, Integer>();
Map<Node, Integer> followerMap = algo.getLocalLeader(graph, leadershipVector);
expectedMap.put(3, 5);
expectedMap.put(11, 3);
System.out.println("Expected: " + expectedMap.toString());
System.out.println("Result: " + followerMap.toString());
assertEquals(expectedMap.entrySet().size(), followerMap.entrySet().size());
assertTrue(followerMap.keySet().contains(graph.getNodeArray()[3]));
assertTrue(followerMap.keySet().contains(graph.getNodeArray()[11]));
assertEquals(5, (int) followerMap.get(graph.getNodeArray()[3]));
assertEquals(3, (int) followerMap.get(graph.getNodeArray()[11]));
}
@Test
public void testGetGlobalLeader() throws FileNotFoundException, AdapterException, InterruptedException {
CustomGraph graph = new CustomGraph();
Map<Node, Integer> LeadershipMap = new HashMap<Node, Integer>();
Node n[] = new Node[5];
for (int i = 0; i < 5; i++) {
n[i] = graph.createNode();
LeadershipMap.put(n[i], i + 1);
}
SignedDMIDAlgorithm algo = new SignedDMIDAlgorithm();
List<Node> globalLeader = algo.getGlobalLeader(LeadershipMap);
int leaderCount = globalLeader.size();
/*
* number of global leaders=3
*/
assertEquals(3, leaderCount);
assertTrue(globalLeader.contains(graph.getNodeArray()[2]));
assertTrue(globalLeader.contains(graph.getNodeArray()[3]));
assertTrue(globalLeader.contains(graph.getNodeArray()[4]));
// assertEquals(expectedLeader,globalLeader);
}
@Test
public void testExecuteLabelPropagation() throws FileNotFoundException, AdapterException, InterruptedException {
CustomGraph graph = OcdTestGraphFactory.getSignedLfrGraph();
SignedDMIDAlgorithm algo = new SignedDMIDAlgorithm();
Vector leadershipVector = new BasicVector(graph.nodeCount());
leadershipVector.set(0, 0.465116279);
leadershipVector.set(1, 0.480769231);
leadershipVector.set(2, 0.166666667);
leadershipVector.set(3, 0.573770492);
leadershipVector.set(4, 0.462962963);
leadershipVector.set(5, 0.305555556);
leadershipVector.set(6, 0.352631579);
leadershipVector.set(7, -0.037037037);
leadershipVector.set(8, 0.465116279);
leadershipVector.set(9, 0.441176471);
leadershipVector.set(10, 0.471698113);
leadershipVector.set(11, 0.486486486);
Map<Node, Integer> map = algo.executeLabelPropagation(graph, graph.getNodeArray()[3], leadershipVector);
Map<Node, Integer> expectedMap = new HashMap<Node, Integer>();
// expectedMap.put(graph.getNodeArray()[3], 0);
// expectedMap.put(graph.getNodeArray()[0], 1);
// expectedMap.put(graph.getNodeArray()[1], 1);
// expectedMap.put(graph.getNodeArray()[2], 1);
// expectedMap.put(graph.getNodeArray()[9], 1);
// expectedMap.put(graph.getNodeArray()[10], 1);
// expectedMap.put(graph.getNodeArray()[4], 2);
// expectedMap.put(graph.getNodeArray()[5], 2);
// expectedMap.put(graph.getNodeArray()[8], 2);
// expectedMap.put(graph.getNodeArray()[7], 2);
// expectedMap.put(graph.getNodeArray()[11], 3);
expectedMap.put(graph.getNodeArray()[3], 1);
expectedMap.put(graph.getNodeArray()[0], 2);
expectedMap.put(graph.getNodeArray()[1], 2);
expectedMap.put(graph.getNodeArray()[2], 2);
expectedMap.put(graph.getNodeArray()[9], 2);
expectedMap.put(graph.getNodeArray()[10], 2);
expectedMap.put(graph.getNodeArray()[4], 3);
expectedMap.put(graph.getNodeArray()[5], 3);
expectedMap.put(graph.getNodeArray()[8], 3);
expectedMap.put(graph.getNodeArray()[7], 3);
expectedMap.put(graph.getNodeArray()[11], 4);
System.out.println(map.toString());
assertEquals(expectedMap, map);
}
@Test
public void testGetMembershipDegrees() throws FileNotFoundException, AdapterException, InterruptedException {
CustomGraph graph = OcdTestGraphFactory.getSignedLfrGraph();
int nodeCount = graph.nodeCount();
SignedDMIDAlgorithm algo = new SignedDMIDAlgorithm();
Map<Node, Map<Node, Integer>> communities = new HashMap<Node, Map<Node, Integer>>();
Map<Node, Integer> community = new HashMap<Node, Integer>();
community.put(graph.getNodeArray()[0], 2);
community.put(graph.getNodeArray()[1], 2);
community.put(graph.getNodeArray()[2], 2);
community.put(graph.getNodeArray()[9], 2);
community.put(graph.getNodeArray()[10], 2);
community.put(graph.getNodeArray()[4], 3);
community.put(graph.getNodeArray()[5], 3);
community.put(graph.getNodeArray()[8], 3);
community.put(graph.getNodeArray()[7], 3);
community.put(graph.getNodeArray()[11], 4);
communities.put(graph.getNodeArray()[3], community);
Map<Node, Integer> communityTwo = new HashMap<Node, Integer>();
communityTwo.put(graph.getNodeArray()[5], 2);
communityTwo.put(graph.getNodeArray()[6], 2);
communityTwo.put(graph.getNodeArray()[8], 2);
communityTwo.put(graph.getNodeArray()[9], 3);
communityTwo.put(graph.getNodeArray()[7], 3);
communityTwo.put(graph.getNodeArray()[1], 3);
communityTwo.put(graph.getNodeArray()[0], 4);
communityTwo.put(graph.getNodeArray()[3], 4);
communities.put(graph.getNodeArray()[11], communityTwo);
Cover cover = algo.getMembershipDegrees(graph, communities);
Matrix matrix = cover.getMemberships();
System.out.println(matrix.toString());
Matrix expectedMatrix = new Basic2DMatrix(12, 2);
expectedMatrix.set(0, 0, 0.8);
expectedMatrix.set(0, 1, 0.2);
expectedMatrix.set(1, 0, 0.692307692);
expectedMatrix.set(1, 1, 0.307692308);
expectedMatrix.set(2, 0, 1.0);
expectedMatrix.set(2, 1, 0);
expectedMatrix.set(3, 0, 0.941176471);
expectedMatrix.set(3, 1, 0.058823529);
expectedMatrix.set(4, 0, 1.0);
expectedMatrix.set(4, 1, 0);
expectedMatrix.set(5, 0, 0.307692308);
expectedMatrix.set(5, 1, 0.692307692);
expectedMatrix.set(6, 0, 0);
expectedMatrix.set(6, 1, 1);
expectedMatrix.set(7, 0, 0.5);
expectedMatrix.set(7, 1, 0.5);
expectedMatrix.set(8, 0, 0.307692308);
expectedMatrix.set(8, 1, 0.692307692);
expectedMatrix.set(9, 0, 0.692307692);
expectedMatrix.set(9, 1, 0.307692308);
expectedMatrix.set(10, 0, 1);
expectedMatrix.set(10, 1, 0);
expectedMatrix.set(11, 0, 0.058823529);
expectedMatrix.set(11, 1, 0.941176471);
double controlSum = 0;
for (int i = 0; i < nodeCount; i++) {
controlSum += expectedMatrix.get(i, 0) - matrix.get(i, 0) + expectedMatrix.get(i, 1) - matrix.get(i, 1);
}
assertEquals(0, controlSum, 0.1);
}
@Test
public void testDetectOverlappingCommunities()
throws FileNotFoundException, AdapterException, OcdAlgorithmException, InterruptedException {
CustomGraph graph = OcdTestGraphFactory.getSignedLfrGraph();
int nodeCount = graph.nodeCount();
SignedDMIDAlgorithm algo = new SignedDMIDAlgorithm();
Cover cover = algo.detectOverlappingCommunities(graph);
Matrix matrix = cover.getMemberships();
Matrix expectedMatrix = new Basic2DMatrix(12, 2);
expectedMatrix.set(0, 0, 0.8);
expectedMatrix.set(0, 1, 0.2);
expectedMatrix.set(1, 0, 0.692307692);
expectedMatrix.set(1, 1, 0.307692308);
expectedMatrix.set(2, 0, 1.0);
expectedMatrix.set(2, 1, 0);
expectedMatrix.set(3, 0, 0.941176471);
expectedMatrix.set(3, 1, 0.058823529);
expectedMatrix.set(4, 0, 1.0);
expectedMatrix.set(4, 1, 0);
expectedMatrix.set(5, 0, 0.307692308);
expectedMatrix.set(5, 1, 0.692307692);
expectedMatrix.set(6, 0, 0);
expectedMatrix.set(6, 1, 1);
expectedMatrix.set(7, 0, 0.5);
expectedMatrix.set(7, 1, 0.5);
expectedMatrix.set(8, 0, 0.307692308);
expectedMatrix.set(8, 1, 0.692307692);
expectedMatrix.set(9, 0, 0.692307692);
expectedMatrix.set(9, 1, 0.307692308);
expectedMatrix.set(10, 0, 1);
expectedMatrix.set(10, 1, 0);
expectedMatrix.set(11, 0, 0.058823529);
expectedMatrix.set(11, 1, 0.941176471);
double controlSum = 0;
for (int i = 0; i < nodeCount; i++) {
controlSum += expectedMatrix.get(i, 0) - matrix.get(i, 0) + expectedMatrix.get(i, 1) - matrix.get(i, 1);
}
assertEquals(graph, cover.getGraph());
assertEquals(0, controlSum, 0.1);
}
@Test
public void testGetPosNodesWithNewLabel() throws FileNotFoundException, AdapterException, InterruptedException {
CustomGraph graph = OcdTestGraphFactory.getSignedLfrGraph();
SignedDMIDAlgorithm algo = new SignedDMIDAlgorithm();
Set<Node> nodesWithNewBehavior = new HashSet<Node>();
nodesWithNewBehavior.add(graph.getNodeArray()[5]);
nodesWithNewBehavior.add(graph.getNodeArray()[6]);
nodesWithNewBehavior.add(graph.getNodeArray()[8]);
nodesWithNewBehavior.add(graph.getNodeArray()[11]);
int posNeihboursWithNewBehavior = algo.getPosNodesWithNewLabel(graph, graph.getNodeArray()[7],
nodesWithNewBehavior);
assertEquals(3, posNeihboursWithNewBehavior);
}
@Test
public void testGetNegNodesWithNewLabel() throws FileNotFoundException, AdapterException, InterruptedException {
CustomGraph graph = OcdTestGraphFactory.getSignedLfrGraph();
SignedDMIDAlgorithm algo = new SignedDMIDAlgorithm();
Set<Node> nodesWithNewBehavior = new HashSet<Node>();
nodesWithNewBehavior.add(graph.getNodeArray()[5]);
nodesWithNewBehavior.add(graph.getNodeArray()[6]);
nodesWithNewBehavior.add(graph.getNodeArray()[8]);
nodesWithNewBehavior.add(graph.getNodeArray()[11]);
int negNeihboursWithNewBehavior = algo.getNegNodesWithNewLabel(graph, graph.getNodeArray()[4],
nodesWithNewBehavior);
assertEquals(2, negNeihboursWithNewBehavior);
}
}