/**
* Adds edges to graph until it is triangulated.
*/
private void triangulate(final UndirectedGraph mdl)
{
UndirectedGraph mdl2 = dupGraph (mdl);
ArrayList vars = new ArrayList(mdl.vertexSet());
Alphabet varMap = makeVertexMap(vars);
cliques = new ArrayList();
// debug
if (logger.isLoggable (Level.FINER)) {
logger.finer ("Triangulating model: "+mdl);
String ret = "";
for (int i = 0; i < vars.size(); i++) {
Variable next = (Variable) vars.get(i);
ret += next.toString() + "\n"; // " (" + mdl.getIndex(next) + ")\n ";
}
logger.finer(ret);
}
while (!vars.isEmpty()) {
Variable v = (Variable) pickVertexToRemove (mdl2, vars);
logger.finer("Triangulating vertex " + v);
VarSet varSet = new BitVarSet (v.getUniverse (), GraphHelper.neighborListOf (mdl2, v));
varSet.add(v);
if (!findSuperClique(cliques, varSet)) {
cliques.add(varSet);
if (logger.isLoggable (Level.FINER)) {
logger.finer (" Elim clique " + varSet + " size " + varSet.size () + " weight " + varSet.weight ());
}
}
// must remove V from graph first, because adding the edges
// will change the rating of other vertices
connectNeighbors (mdl2, v);
vars.remove(v);
mdl2.removeVertex (v);
}
if (logger.isLoggable(Level.FINE)) {
logger.fine("Triangulation done. Cliques are: ");
int totSize = 0, totWeight = 0, maxSize = 0, maxWeight = 0;