예제 #1
0
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
예제 #2
0
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 "=="