package uk.ac.rhul.cs.cl1.quality;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import uk.ac.rhul.cs.cl1.MutableNodeSet;
import uk.ac.rhul.cs.cl1.quality.LogLikelihoodFunction;
import uk.ac.rhul.cs.graph.Graph;
public class LogLikelihoodFunctionTest {
Graph graph = null;
LogLikelihoodFunction func = null;
@Before
public void setUp() {
graph = new Graph();
graph.createNodes(6);
graph.createEdge(0, 1);
graph.createEdge(1, 2);
graph.createEdge(2, 0);
graph.createEdge(0, 3);
graph.createEdge(1, 4);
graph.createEdge(2, 5);
func = new LogLikelihoodFunction();
}
@Test
public void testCalculate() {
MutableNodeSet nodeSet = new MutableNodeSet(graph);
double expected;
/* p = 0 */
assertEquals(Double.NEGATIVE_INFINITY, func.calculate(nodeSet), 0);
/* p = 1/6, p1 = 0, p2 = 3/5, n = 1, N = 6 */
/* maxInternal = 0, maxBoundary = 5 */
nodeSet.add(0);
expected = 6 * ((1.0 / 6) * Math.log(1.0/6) + (5.0 / 6) * Math.log(5.0/6)) +
5 * ((3.0 / 5) * Math.log(3.0/5) + (2.0 / 5) * Math.log(2.0/5));
assertEquals(expected, func.calculate(nodeSet), 1e-4);
/* p = 1/2, p1 = 1, p2 = 1/3, n = 3, N = 6 */
/* maxInternal = 3, maxBoundary = 9 */
nodeSet.add(1); nodeSet.add(2);
expected = 6 * Math.log(0.5) + 3 * Math.log(1) +
9 * ((1/3.0) * Math.log(1/3.0) + (2/3.0) * Math.log(2/3.0));
assertEquals(expected, func.calculate(nodeSet), 1e-4);
/* p = 1/2, p1 = 0, p2 = 1/3, n = 3, N = 6 */
/* maxInternal = 3, maxBoundary = 9 */
nodeSet.clear(); nodeSet.add(3); nodeSet.add(4); nodeSet.add(5);
expected = 6 * Math.log(0.5) + 3 * Math.log(1) +
9 * ((1/3.0) * Math.log(1/3.0) + (2/3.0) * Math.log(2/3.0));
assertEquals(expected, func.calculate(nodeSet), 1e-4);
}
@Test
public void testGetAdditionAffinity() {
MutableNodeSet nodeSet = new MutableNodeSet(graph);
double expected;
nodeSet.add(0); nodeSet.add(1);
/* p = 1/2, p1 = 1, p2 = 1/3, n = 3, N = 6 */
/* maxInternal = 3, maxBoundary = 9 */
expected = 6 * Math.log(0.5) + 3 * Math.log(1) +
9 * ((1/3.0) * Math.log(1/3.0) + (2/3.0) * Math.log(2/3.0));
assertEquals(expected, func.getAdditionAffinity(nodeSet, 2), 1e-4);
/* p = 1/3, p1 = 1, p2 = 1/2, n = 2, N = 6 */
/* maxInternal = 1, maxBoundary = 8 */
expected = 6 * ((1/3.0) * Math.log(1/3.0) + (2/3.0) * Math.log(2/3.0)) +
1 * Math.log(1) +
8 * ((1/2.0) * Math.log(1/2.0) + (1/2.0) * Math.log(1/2.0));
assertEquals(expected, func.getAdditionAffinity(nodeSet, 1), 1e-4);
}
@Test
public void testGetRemovalAffinity() {
MutableNodeSet nodeSet = new MutableNodeSet(graph);
double expected;
nodeSet.add(0); nodeSet.add(1); nodeSet.add(2);
/* p = 1/2, p1 = 1, p2 = 1/3, n = 3, N = 6 */
/* maxInternal = 3, maxBoundary = 9 */
expected = 6 * Math.log(0.5) + 3 * Math.log(1) +
9 * ((1/3.0) * Math.log(1/3.0) + (2/3.0) * Math.log(2/3.0));
assertEquals(expected, func.getRemovalAffinity(nodeSet, 4), 1e-4);
/* p = 1/3, p1 = 1, p2 = 1/2, n = 2, N = 6 */
/* maxInternal = 1, maxBoundary = 8 */
expected = 6 * ((1/3.0) * Math.log(1/3.0) + (2/3.0) * Math.log(2/3.0)) +
1 * Math.log(1) +
8 * ((1/2.0) * Math.log(1/2.0) + (1/2.0) * Math.log(1/2.0));
assertEquals(expected, func.getRemovalAffinity(nodeSet, 0), 1e-4);
}
}