def __init__(self, check_array):
     self._factornodes = []
     self._variablenodes = []
     n = check_array.shape[0]
     m = check_array.shape[1]
     for i in xrange(m):
         self._variablenodes.append(VariableNode('v' + str(i)))
     for i in xrange(n):
         fnode = FactorNode('f' + str(i))
         self._factornodes.append(fnode)
         check_array_row = check_array[i, :]
         for j, a in enumerate(check_array_row):
             if a:
                 vnode = self._variablenodes[j]
                 fnode.add_undirected_connection(vnode)
예제 #2
0
 def __init__(self, check_array):
     self._factornodes = []
     self._variablenodes = []
     n = check_array.shape[0]
     m = check_array.shape[1]
     for i in xrange(m):
         self._variablenodes.append(VariableNode('v' + str(i)))
     for i in xrange(n):
         fnode = FactorNode('f' + str(i))
         self._factornodes.append(fnode)
         check_array_row = check_array[i, :]
         for j, a in enumerate(check_array_row):
             if a:
                 vnode = self._variablenodes[j]
                 fnode.add_undirected_connection(vnode)
예제 #3
0
def createExerciseGraph():
    C = VariableNode("C")
    T = VariableNode("T")
    A = VariableNode("A")
    M = VariableNode("M")
    J = VariableNode("J")

    fC = FactorNode("fC", [0.999, 0.001], C)
    fCTA = FactorNode(
        "fACT", [[[0.999, 0.71], [0.06, 0.05]], [[0.001, 0.29], [0.94, 0.95]]],
        A, C, T)
    fT = FactorNode("fT", [0.998, 0.002], T)

    fMA = FactorNode("fMA", [[0.95, 0.1], [0.05, 0.9]], M, A)

    fJA = FactorNode("fJA", [[0.99, 0.3], [0.01, 0.7]], J, A)

    graph = Graph()

    graph.addVariableNode(C)

    graph.addFactorNode(fCTA)

    graph.addVariableNode(T)

    graph.addVariableNode(A)

    graph.addFactorNode(fMA)

    graph.addVariableNode(M)

    graph.addFactorNode(fJA)

    graph.addVariableNode(J)

    graph.addFactorNode(fC)

    graph.addFactorNode(fT)

    return graph
예제 #4
0
    def test_factornode_message_generation_BEC(self):
        f1 = FactorNode()
        m1 = BinaryMessage(1, 'a')
        m2 = BinaryMessage(-1, 'b')
        m3 = BinaryMessage(0, 'c')

        f1._recieve_message(m1)
        f1._recieve_message(m2)
        f1._recieve_message(m3)

        b1 = f1.generate_BEC_message_for('a')
        b2 = f1.generate_BEC_message_for('b')
        b3 = f1.generate_BEC_message_for('c')

        self.assertEquals(0, b1.data)
        self.assertEquals(0, b2.data)
        self.assertEquals(-1, b3.data)
예제 #5
0
 def test_factornode_message_generation_BEC(self):
     f1 = FactorNode()
     m1 = BinaryMessage(1, 'a')
     m2 = BinaryMessage(-1, 'b')
     m3 = BinaryMessage(0, 'c')
     
     f1._recieve_message(m1)
     f1._recieve_message(m2)
     f1._recieve_message(m3)
     
     b1 = f1.generate_BEC_message_for('a')
     b2 = f1.generate_BEC_message_for('b')
     b3 = f1.generate_BEC_message_for('c')
     
     self.assertEquals(0, b1.data)
     self.assertEquals(0, b2.data)
     self.assertEquals(-1, b3.data)
예제 #6
0
import numpy as np

fg = FactorGraph()
a = VarNode(name='a', graph=fg)
b = VarNode(name='b', graph=fg)
c = VarNode(name='c', init=[1., 1., 1.], graph=fg)

f1_cpd = np.array([[2, 3],
                   [6, 4]])

f2_cpd = np.array([[7, 2, 3],
                   [1, 5, 2]])
f3_cpd = np.array([[7, 9, 3],
                   [6, 4, 2]])

f1 = FactorNode(cpd=f1_cpd, graph=fg, name='f1', ordered_variables=(a, b))
f2 = FactorNode(cpd=f2_cpd, graph=fg, name='f2', ordered_variables=(a, c))
f3 = FactorNode(cpd=f3_cpd, graph=fg, name='f3', ordered_variables=(b, c))

fg.add_var_nodes([a, b, c])
fg.add_factor_nodes([f1, f2, f3])
fg.add_edge(a, f1)
fg.add_edge(f1, b)
fg.add_edge(b, f3)
fg.add_edge(f3, c)
fg.add_edge(a, f2)
fg.add_edge(f2, c)
pos = {a: (-3, 0), b: (0, 3), c: (3, 0), f1: (-1.5, 1.5), f2: (0, 0), f3: (1.5, 1.5)}
fg.save_graph_fig(num=1, pos=pos)
# fg.sum_product(node=b)
fg.loopy_sum_product(iterations=20, epsilon=1e-5, plot_errors=True)
예제 #7
0
 def addFactorNode(self, id, array, *args):
     factorNode = FactorNode(id, array, *args)
     self.factorNodes.append(factorNode)
예제 #8
0
    def add_factor_node(self, P, *args):
        factor_id = len(self.factors)
        factor = FactorNode(P, factor_id, *args)
        self.factors.append(factor)

        return factor
예제 #9
0
from factor_graph import FactorGraph
from node import VarNode, FactorNode
import numpy as np

fg = FactorGraph()

params = {'graph': fg}
x1 = VarNode(name='x1', **params)
x2 = VarNode(name='x2', **params)
x3 = VarNode(name='x3', **params)
x4 = VarNode(name='x4', **params)

cpd_a = np.array([[3, 4], [3, 9]])
cpd_b = np.array([[3, 4], [5, 1]])
cpd_c = np.array([[7, 8], [3, 9]])
fa = FactorNode(cpd_a, (x1, x2), name='fa', **params)
fb = FactorNode(cpd_b, (x2, x3), name='fb', **params)
fc = FactorNode(cpd_c, (x2, x4), name='fc', **params)

fg.add_var_nodes([x1, x2, x3, x4])
fg.add_factor_nodes([fa, fb, fc])

fg.add_edge(x1, fa)
fg.add_edge(fa, x2)
fg.add_edge(x2, fb)
fg.add_edge(fb, x3)
fg.add_edge(x2, fc)
fg.add_edge(fc, x4)

print(fg.nodes)
print(fg.neighbors(x4))
예제 #10
0
    def add_factor_node(self, joint_prob, *args):
        factor_id = len(self.factors)
        factorNode = FactorNode(joint_prob, factor_id, *args)
        self.factors.append(factorNode)

        return factorNode