def createCliqueTree(factorList, E=[]): """ return a Clique Tree object given a list of factors it peforms VE and returns the clique tree the VE ordering defines. See Chapter 9 of Friedman and Koller Probabilistic Graphical Models""" V = getUniqueVar(factorList) totalVars = len(V) cardinality = np.zeros(len(V)).tolist() for i in range(len(V)): for j in range(len(factorList)): try: indx = factorList[j].getVar().tolist().index(V[i]) cardinality[i] = factorList[j].getCard().tolist()[indx] break except: continue edges = np.zeros((totalVars, totalVars)) """ Set up adjacency matrix: for each factor, get the list of variables in its scope and create an edge between each variable in the factor """ for f in factorList: variableList = f.getVar() for j in range(len(variableList)): for k in range(len(variableList)): edges[variableList[j] - 1, variableList[k] - 1] = 1 (nrows, nedges) = np.shape(edges) C = CliqueTree() C.setCard(cardinality) C.setEdges(np.zeros((totalVars, totalVars))) C.setFactorList(factorList) C.setEvidence(E) C.setNodeList([]) #print 'length of factorList: ', len(factorList) #print C.toString() cliquesConsidered = 0 #pdb.set_trace() while cliquesConsidered < len(V): bestClique = 0 bestScore = sys.maxint for i in range(nrows): score = np.sum(edges[i, :]) if score > 0 and score < bestScore: bestScore = score bestClique = i + 1 cliquesConsidered += 1 (edges, factorList) = C.eliminateVar(bestClique, edges, factorList) return C
from Factor import * from PGMcommon import * from CliqueTree import * from CliqueTreeOperations import * from FactorOperations import * import scipy.io as sio import numpy as np import pprint import pdb matfile='/Users/amit/BC_Classes/PGM/Prog4/PA4Sample.mat' mat_contents=sio.loadmat(matfile) mat_struct=mat_contents['SumProdCalibrate'] val=mat_struct[0,0] input_edges = val['INPUT']['edges'][0][0] input_cliqueList= val['INPUT']['cliqueList'][0][0][0] clique_list_factorObj=[] for tpl in input_cliqueList: (var, card, values)=tpl f= Factor( var[0].tolist(), card[0].tolist(), values[0].tolist(), 'factor' ) clique_list_factorObj.append(f) P=CliqueTree( clique_list_factorObj , input_edges, clique_list_factorObj, []) P=CliqueTreeCalibrate(P) for f in P.getNodeList(): print f print "=="