@Test
public void testPriorityQueueWithMaximalCliqueWeight() {

    Graph<BayesVariable> graph = new BayesNetwork();
    GraphNode x0 = addNode(graph);
    GraphNode x1 = addNode(graph);
    GraphNode x2 = addNode(graph);
    GraphNode x3 = addNode(graph);
    GraphNode x4 = addNode(graph);
    GraphNode x5 = addNode(graph);
    GraphNode x6 = addNode(graph);
    GraphNode x7 = addNode(graph);
    GraphNode x8 = addNode(graph);
    GraphNode x9 = addNode(graph);
    GraphNode x10 = addNode(graph);
    GraphNode x11 = addNode(graph);
    GraphNode x12 = addNode(graph);
    connectParentToChildren(x2, x1);
    connectParentToChildren(x3, x1);
    connectParentToChildren(x4, x1);
    x1.setContent(new BayesVariable<String>("x1", x0.getId(), new String[]{"a", "b"}, new double[][]{{0.1, 0.1}}));
    x2.setContent(new BayesVariable<String>("x2", x0.getId(), new String[]{"a", "b"}, new double[][]{{0.1, 0.1}}));
    x3.setContent(new BayesVariable<String>("x3", x0.getId(), new String[]{"a", "b"}, new double[][]{{0.1, 0.1}}));
    x4.setContent(new BayesVariable<String>("x4", x0.getId(), new String[]{"a", "b"}, new double[][]{{0.1, 0.1}}));
    connectParentToChildren(x6, x5);
    connectParentToChildren(x7, x5);
    connectParentToChildren(x8, x5);
    x5.setContent(new BayesVariable<String>("x5", x0.getId(), new String[]{"a", "b", "c"}, new double[][]{{0.1, 0.1, 0.1}}));
    x6.setContent(new BayesVariable<String>("x6", x0.getId(), new String[]{"a", "b", "c"}, new double[][]{{0.1, 0.1, 0.1}}));
    x7.setContent(new BayesVariable<String>("x7", x0.getId(), new String[]{"a", "b", "c"}, new double[][]{{0.1, 0.1, 0.1}}));
    x8.setContent(new BayesVariable<String>("x8", x0.getId(), new String[]{"a", "b", "c"}, new double[][]{{0.1, 0.1, 0.1}}));
    connectParentToChildren(x10, x9);
    connectParentToChildren(x11, x9);
    connectParentToChildren(x12, x9);
    x9.setContent(new BayesVariable<String>("x9", x0.getId(), new String[]{"a"}, new double[][]{{0.1}}));
    x10.setContent(new BayesVariable<String>("x10", x0.getId(), new String[]{"a"}, new double[][]{{0.1}}));
    x11.setContent(new BayesVariable<String>("x11", x0.getId(), new String[]{"a", "b"}, new double[][]{{0.1, 0.1}}));
    x12.setContent(new BayesVariable<String>("x12", x0.getId(), new String[]{"a", "b"}, new double[][]{{0.1, 0.1}}));
    JunctionTreeBuilder jtBuilder = new JunctionTreeBuilder( graph );
    //jtBuilder.moralize(); // don't moralize, as we want to force a simpler construction for required edges, for the purposes of testing
    PriorityQueue<EliminationCandidate> p = new PriorityQueue<EliminationCandidate>(graph.size());
    EliminationCandidate elmCandVert = new EliminationCandidate(graph, jtBuilder.getAdjacencyMatrix(), x1);
    p.add( elmCandVert );
    elmCandVert = new EliminationCandidate(graph, jtBuilder.getAdjacencyMatrix(), x5);
    p.add( elmCandVert );
    elmCandVert = new EliminationCandidate(graph, jtBuilder.getAdjacencyMatrix(), x9);
    p.add( elmCandVert );
    EliminationCandidate v = p.remove();
    int id = v.getV().getId();
    assertEquals( 9, id );
    assertEquals( 4, v.getWeightRequired() );
    v = p.remove();
    id = v.getV().getId();
    assertEquals( 1, id );
    assertEquals( 16, v.getWeightRequired() );
    v = p.remove();
    id = v.getV().getId();
    assertEquals( 5, id );
    assertEquals( 81, v.getWeightRequired() );
    assertEquals( 0, p.size() );
}