class SimpleDiscreteCPTBN(CPTWrapper): def __init__(self, nodeOrder, map, stateSpace, jft): ''' nodeOrder: [node1, node2, node3, ...] map: {node1:[], node2:[node1], node3:[node1, node2], ...} stateSpace: {node1:['a', 'b', 'c'], node2:[1, 3, 5, 7], node3:['high', 'low'], ...} jft: {node1:[0, 2, 3, 1, 1, ...], node2:[3, 3, 1, 1, 2, ...], node3:[1, 1, 0, 0, 0, ...], ...} ''' self.__nodeMap = map; self.__orderedNodeList = nodeOrder; self.__stateSpace = stateSpace; self.__cfts = self.__JFTtoCFT(nodeOrder, map, jft); self.dataPoints = len(jft[nodeOrder[0]]); def __JFTtoCFT(self, nodeOrder, map, jft): ''' return: {"{node3:1, node1:0, node2:3}":1, "{node3:1, node1:2, node2:3}":1, ...] ''' #return: {node1:[{node3:1, node1:0, node2:3}, {node3:1, node1:2, node2:3}, ...] retVal = defaultdict(int); # Cycle through each node in order for node in nodeOrder: parents = map[node]; #retVal[node] = []; # Cycle through each data point for i in range(len(jft[node])): # Define the state space for this CFT entry state = {}; state[node] = jft[node][i]; for parent in parents: state[parent] = jft[parent][i]; # Define the CFT entry #retVal[node].append(state); retVal[repr(state)] += 1; return retVal; def stateFreq(self, state, node): return (self.__cfts[repr(state)] + 1, self.dataPoints + len(self.__stateSpace[node]));