Пример #1
0
    def test_ep_tight(self):
        theta = DirichletParameterNode(
            'theta',
            Factor(['X', 'ZDummy'], {
                'X': ['same', 'diff'],
                'ZDummy': ['dummy']
            }, {
                ('same', 'dummy'): 1,
                ('diff', 'dummy'): 1,
            },
                   logarithmetic=False))

        X = DiscreteVariableNode('X', ['same', 'diff'], logarithmetic=False)
        D = DiscreteVariableNode('ZDummy', ['dummy'], logarithmetic=False)
        f = DirichletFactorNode('f')

        X.observed({('same', ): 0.50001, ('diff', ): 0.49999})

        f.connect(theta)
        f.connect(X, parent=False)
        f.connect(D)

        # Add nodes to lbp.
        lbp = LBP(strategy='tree')
        lbp.add_nodes([f, X, D, theta])

        for i in range(50):
            lbp.run()
            #print theta.alpha.pretty_print(precision=5)
            lbp.init_messages()
        print theta.alpha.pretty_print(precision=5)
Пример #2
0
    def test_ep_tight(self):
        theta = DirichletParameterNode('theta', Factor(
            ['X', 'ZDummy'],
            {
                'X': ['same', 'diff'],
                'ZDummy': ['dummy']
            },
            {
                ('same', 'dummy'): 1,
                ('diff', 'dummy'): 1,
            }, logarithmetic=False))

        X = DiscreteVariableNode('X', ['same', 'diff'], logarithmetic=False)
        D = DiscreteVariableNode('ZDummy', ['dummy'], logarithmetic=False)
        f = DirichletFactorNode('f')

        X.observed({('same',): 0.50001, ('diff',): 0.49999})

        f.connect(theta)
        f.connect(X, parent=False)
        f.connect(D)

        # Add nodes to lbp.
        lbp = LBP(strategy='tree')
        lbp.add_nodes([
            f, X, D, theta
        ])

        for i in range(50):
            lbp.run()
            #print theta.alpha.pretty_print(precision=5)
            lbp.init_messages()
Пример #3
0
    def test_parameter_simple(self):
        alpha = DirichletParameterNode('theta', Factor(
            ['X0', 'X1'],
            {
                'X0': ['x0_0', 'x0_1'],
                'X1': ['x1_0'],
            },
            {
                ('x0_0', 'x1_0'): 3,
                ('x0_1', 'x1_0'): 1,
            }
        ))

        factor = DirichletFactorNode('factor')
        x0 = DiscreteVariableNode('X0', ['x0_0', 'x0_1'])
        x1 = DiscreteVariableNode('X1', ['x1_0'])

        x1.observed({('x1_0',): 1})

        factor.connect(alpha)
        factor.connect(x0, parent=False)
        factor.connect(x1, parent=True)

        x0.message_to(factor)
        x1.message_to(factor)

        factor.update()
        self.assertAlmostEqual(factor.belief[('x0_0', 'x1_0')], 0.5)

        factor.message_to(x0)
        factor.message_to(x1)

        x0.update()
        self.assertAlmostEqual(x0.belief[('x0_0',)], 3.0/4)

        factor.message_to(alpha)
        print alpha.alpha
Пример #4
0
    def test_observed_complex(self):
        s1 = DiscreteVariableNode('s1', ['a', 'b'])
        s2 = DiscreteVariableNode('s2', ['a', 'b'])
        f = DiscreteFactorNode('f', Factor(
            ['s1', 's2'],
            {
                's1': ['a', 'b'],
                's2': ['a', 'b'],
            },
            {
                ('a', 'a'): 1,
                ('a', 'b'): 0.5,
                ('b', 'a'): 0,
                ('b', 'b'): 0.5
            }))

        s1.connect(f)
        s2.connect(f)

        s2.observed({
            ('a',): 0.7,
            ('b',): 0.3
        })

        s1.send_messages()
        s2.send_messages()

        f.update()
        f.normalize()

        f.send_messages()

        s1.update()
        s1.normalize()

        self.assertClose(s1.belief[('a',)], 0.85)
        self.assertClose(s1.belief[('b',)], 0.15)
        self.assertClose(s2.belief[('a',)], 0.7)
Пример #5
0
    def test_dir_tight(self):
        theta = DirichletParameterNode('theta', Factor(
            ['X', 'ZDummy'],
            {
                'X': ['same', 'diff'],
                'ZDummy': ['dummy']
            },
            {
                ('same', 'dummy'): 1,
                ('diff', 'dummy'): 1,
            },
            logarithmetic=False
        ))

        X = DiscreteVariableNode('X', ['same', 'diff'], logarithmetic=False)
        D = DiscreteVariableNode('ZDummy', ['dummy'], logarithmetic=False)
        f = DirichletFactorNode('f')

        X.observed({('same',): 0.8, ('diff',): 0.2})

        f.connect(theta)
        f.connect(X, parent=False)
        f.connect(D)

        X.message_to(f)
        D.message_to(f)
        f.update()
        f.message_to(theta)
        print theta.alpha

        theta.message_to(f)

        X.observed({('same',): 0.5, ('diff',): 0.7})
        X.message_to(f)
        f.update()
        f.message_to(theta)
        print theta.alpha
Пример #6
0
    def test_two_factors_one_theta2(self):
        alpha = DirichletParameterNode('theta', Factor(
            ['X0', 'X1'],
            {
                'X0': ['x0_0', 'x0_1'],
                'X1': ['x1_0', 'x1_1', 'x1_2'],
            },
            {
                ('x0_0', 'x1_0'): 1,
                ('x0_0', 'x1_1'): 8,
                ('x0_0', 'x1_2'): 1,
                ('x0_1', 'x1_0'): 1,
                ('x0_1', 'x1_1'): 2,
                ('x0_1', 'x1_2'): 1,
            }
        ))

        f1 = DirichletFactorNode('f1', aliases={'X0': 'X0_a', 'X1': 'X1_a'})
        x0 = DiscreteVariableNode('X0_a', ['x0_0', 'x0_1'])
        x1 = DiscreteVariableNode('X1_a', ['x1_0', 'x1_1', 'x1_2'])

        f2 = DirichletFactorNode('f2', aliases={'X0': 'X0_b', 'X1': 'X1_b'})
        x2 = DiscreteVariableNode('X0_b', ['x0_0', 'x0_1'])
        x3 = DiscreteVariableNode('X1_b', ['x1_0', 'x1_1', 'x1_2'])

        f1.connect(x0, parent=False)
        f1.connect(x1)

        f2.connect(x2, parent=False)
        f2.connect(x3)

        f1.connect(alpha)
        f2.connect(alpha)

        alpha.aliases = {'X0_a': 'X0', 'X0_b': 'X0', 'X1_a': 'X1', 'X1_b': 'X1'}

        x0.observed({('x0_0',): 1})
        x1.observed({('x1_0',): 1})

        x2.observed({('x0_1',): 1})
        x3.observed({('x1_0',): 1})

        x0.message_to(f1)
        x1.message_to(f1)
        x2.message_to(f2)
        x3.message_to(f2)

        f1.update()
        f2.update()

        f1.message_to(alpha)
        f2.message_to(alpha)

        print alpha.alpha
        self.assertAlmostEqual(alpha.alpha[('x0_0', 'x1_0')], 2, places=5)
        self.assertAlmostEqual(alpha.alpha[('x0_1', 'x1_0')], 2, places=5)
Пример #7
0
    def test_network(self):
        # Create network.
        hid = DiscreteVariableNode("hid", ["save", "del"])
        obs = DiscreteVariableNode("obs", ["osave", "odel"])
        fact_h1_o1 = DiscreteFactorNode("fact_h1_o1", Factor(
            ['hid', 'obs'],
            {
                "hid": ["save", "del"],
                "obs": ["osave", "odel"]
            },
            {
                ("save", "osave"): 0.3,
                ("save", "odel"): 0.6,
                ("del", "osave"): 0.7,
                ("del", "odel"): 0.4
            }))

        # Add edges.
        obs.connect(fact_h1_o1)
        fact_h1_o1.connect(hid)

        # 1. Without observations, send_messages used.
        obs.send_messages()
        fact_h1_o1.send_messages()

        hid.update()
        hid.normalize()
        self.assertClose(hid.belief[("save",)], 0.45)

        # 2. Observed value, message_to and update_belief used.
        obs.observed({("osave",): 1})
        obs.message_to(fact_h1_o1)
        fact_h1_o1.update()
        fact_h1_o1.message_to(hid)
        hid.update()

        hid.normalize()
        self.assertClose(hid.belief[("save",)], 0.3)

        # 3. Without observations, send_messages used.
        obs.observed(None)
        obs.send_messages()
        fact_h1_o1.send_messages()

        hid.update()
        hid.normalize()
        self.assertClose(hid.belief[("save",)], 0.45)
Пример #8
0
    def test_layers(self):
        f_h_o = {
            ("save", "osave"): 0.8,
            ("del", "osave"): 0.2,
            ("save", "odel"): 0.2,
            ("del", "odel"): 0.8,
        }

        f_h_h = {
            ("save", "save"): 0.9,
            ("del", "save"): 0.1,
            ("save", "del"): 0.1,
            ("del", "del"): 0.9
        }
        # Create nodes.
        hid1 = DiscreteVariableNode("hid1", ["save", "del"])
        obs1 = DiscreteVariableNode("obs1", ["osave", "odel"])
        fact_h1_o1 = DiscreteFactorNode(
            "fact_h1_o1",
            Factor(['hid1', 'obs1'], {
                "hid1": ["save", "del"],
                "obs1": ["osave", "odel"]
            }, f_h_o))

        hid2 = DiscreteVariableNode("hid2", ["save", "del"])
        obs2 = DiscreteVariableNode("obs2", ["osave", "odel"])
        fact_h2_o2 = DiscreteFactorNode(
            "fact_h2_o2",
            Factor(['hid2', 'obs2'], {
                "hid2": ["save", "del"],
                "obs2": ["osave", "odel"]
            }, f_h_o))

        fact_h1_h2 = DiscreteFactorNode(
            "fact_h1_h2",
            Factor(['hid1', 'hid2'], {
                "hid1": ["save", "del"],
                "hid2": ["save", "del"],
            }, f_h_h))

        hid3 = DiscreteVariableNode("hid3", ["save", "del"])
        obs3 = DiscreteVariableNode("obs3", ["osave", "odel"])
        fact_h3_o3 = DiscreteFactorNode(
            "fact_h3_o3",
            Factor(['hid3', 'obs3'], {
                "hid3": ["save", "del"],
                "obs3": ["osave", "odel"]
            }, f_h_o))

        fact_h2_h3 = DiscreteFactorNode(
            "fact_h2_h3",
            Factor(['hid2', 'hid3'], {
                "hid2": ["save", "del"],
                "hid3": ["save", "del"],
            }, f_h_h))

        # Connect nodes.
        obs1.connect(fact_h1_o1)
        obs2.connect(fact_h2_o2)
        obs3.connect(fact_h3_o3)

        fact_h1_o1.connect(hid1)
        fact_h2_o2.connect(hid2)
        fact_h3_o3.connect(hid3)

        hid1.connect(fact_h1_h2)
        hid2.connect(fact_h1_h2)

        hid2.connect(fact_h2_h3)
        hid3.connect(fact_h2_h3)

        # Set observations.
        obs1.observed({('osave', ): 1})

        # Add nodes to lbp.
        lbp = LBP(strategy='layers')
        lbp.add_layers([
            [obs1, hid1, fact_h1_o1],
            [obs2, hid2, fact_h2_o2, fact_h1_h2],
            [obs3, hid3, fact_h3_o3, fact_h2_h3],
        ])

        lbp.run()

        self.assertAlmostEqual(hid1.belief[('save', )], 0.8)
        self.assertAlmostEqual(hid2.belief[('save', )],
                               0.8 * 0.9 + 0.2 * 0.1,
                               places=6)
        # @DM: The original test that fails at my computer.
        # self.assertAlmostEqual(hid3.belief[('save',)], hid2.belief[('save',)] * 0.9 + hid2.belief[('del',)] * 0.1)
        # MK: This one passes.
        self.assertAlmostEqual(hid3.belief[('save', )],
                               hid2.belief[('save', )] * 0.9 +
                               hid2.belief[('del', )] * 0.1,
                               places=6)

        lbp = LBP(strategy='layers')
        lbp.add_layers([[obs1, hid1, fact_h1_o1]])

        lbp.run()
        self.assertAlmostEqual(hid1.belief[('save', )], 0.8)

        lbp.add_layer([obs2, hid2, fact_h2_o2, fact_h1_h2])
        lbp.run(from_layer=0)
        self.assertAlmostEqual(hid2.belief[('save', )],
                               0.8 * 0.9 + 0.2 * 0.1,
                               places=6)

        lbp.add_layers([[obs3, hid3, fact_h3_o3, fact_h2_h3]])
        lbp.run(from_layer='last')
        self.assertAlmostEqual(
            hid3.belief[('save', )],
            hid2.belief[('save', )] * 0.9 + hid2.belief[('del', )] * 0.1)
Пример #9
0
    def test_dir_tight(self):
        theta = DirichletParameterNode(
            'theta',
            Factor(['X', 'ZDummy'], {
                'X': ['same', 'diff'],
                'ZDummy': ['dummy']
            }, {
                ('same', 'dummy'): 1,
                ('diff', 'dummy'): 1,
            },
                   logarithmetic=False))

        X = DiscreteVariableNode('X', ['same', 'diff'], logarithmetic=False)
        D = DiscreteVariableNode('ZDummy', ['dummy'], logarithmetic=False)
        f = DirichletFactorNode('f')

        X.observed({('same', ): 0.8, ('diff', ): 0.2})

        f.connect(theta)
        f.connect(X, parent=False)
        f.connect(D)

        X.message_to(f)
        D.message_to(f)
        f.update()
        f.message_to(theta)

        theta.message_to(f)

        X.observed({('same', ): 0.5, ('diff', ): 0.7})
        X.message_to(f)
        f.update()
        f.message_to(theta)
Пример #10
0
    def test_network(self):
        # Create network.
        hid = DiscreteVariableNode("hid", ["save", "del"])
        obs = DiscreteVariableNode("obs", ["osave", "odel"])
        fact_h1_o1 = DiscreteFactorNode(
            "fact_h1_o1",
            Factor(['hid', 'obs'], {
                "hid": ["save", "del"],
                "obs": ["osave", "odel"]
            }, {
                ("save", "osave"): 0.3,
                ("save", "odel"): 0.6,
                ("del", "osave"): 0.7,
                ("del", "odel"): 0.4
            }))

        # Add edges.
        obs.connect(fact_h1_o1)
        fact_h1_o1.connect(hid)

        # 1. Without observations, send_messages used.
        obs.send_messages()
        fact_h1_o1.send_messages()

        hid.update()
        hid.normalize()
        self.assertClose(hid.belief[("save", )], 0.45)

        # 2. Observed value, message_to and update_belief used.
        obs.observed({("osave", ): 1})
        obs.message_to(fact_h1_o1)
        fact_h1_o1.update()
        fact_h1_o1.message_to(hid)
        hid.update()

        hid.normalize()
        self.assertClose(hid.belief[("save", )], 0.3)

        # 3. Without observations, send_messages used.
        obs.observed(None)
        obs.send_messages()
        fact_h1_o1.send_messages()

        hid.update()
        hid.normalize()
        self.assertClose(hid.belief[("save", )], 0.45)
Пример #11
0
    def test_ep(self):
        # Create nodes.
        hid1 = DiscreteVariableNode("hid1", ["save", "del"])
        obs1 = DiscreteVariableNode("obs1", ["osave", "odel"])
        fact_h1_o1 = DirichletFactorNode("fact_h1_o1")
        theta_h1_o1 = DirichletParameterNode('theta_h1_o1', Factor(
            ['hid1', 'obs1'],
            {
                "hid1": ["save", "del"],
                "obs1": ["osave", "odel"]
            },
            {
                ("save", "osave"): 1,
                ("save", "odel"): 1,
                ("del", "osave"): 1,
                ("del", "odel"): 1,
            }))

        hid2 = DiscreteVariableNode("hid2", ["save", "del"])
        obs2 = DiscreteVariableNode("obs2", ["osave", "odel"])
        fact_h2_o2 = DirichletFactorNode("fact_h2_o2")
        theta_h2_o2 = DirichletParameterNode('theta_h2_o2', Factor(
            ['hid2', 'obs2'],
            {
                "hid2": ["save", "del"],
                "obs2": ["osave", "odel"]
            },
            {
                ("save", "osave"): 1,
                ("save", "odel"): 1,
                ("del", "osave"): 1,
                ("del", "odel"): 1,
            }))

        fact_h1_h2 = DiscreteFactorNode("fact_h1_h2", Factor(
            ['hid1', 'hid2'],
            {
                "hid1": ["save", "del"],
                "hid2": ["save", "del"],
            },
            {
                ("save", "save"): 0.9,
                ("save", "del"): 0.1,
                ("del", "save"): 0,
                ("del", "del"): 1
            }))

        # Connect nodes.
        obs1.connect(fact_h1_o1, parent=False)
        fact_h1_o1.connect(hid1)
        fact_h1_o1.connect(theta_h1_o1)

        obs2.connect(fact_h2_o2, parent=False)
        fact_h2_o2.connect(hid2)
        fact_h2_o2.connect(theta_h2_o2)

        hid1.connect(fact_h1_h2)
        hid2.connect(fact_h1_h2)

        # Add nodes to lbp.
        lbp = LBP(strategy='tree')
        lbp.add_nodes([
            obs1, obs2,
            fact_h1_o1, fact_h2_o2,
            theta_h1_o1, theta_h2_o2,
            hid1, hid2,
            fact_h1_h2
        ])

        obs1.observed({('osave',): 1})
        obs2.observed({('osave',): 1})
        hid1.observed({('save',): 1})
        hid2.observed({('save',): 1})

        for i in range(100):
            lbp.run()
            #print theta_h1_o1.alpha.pretty_print(precision=5)
            lbp.init_messages()
Пример #12
0
    def test_layers(self):
        f_h_o = {
            ("save", "osave"): 0.8,
            ("del",  "osave"): 0.2,
            ("save", "odel"): 0.2,
            ("del",  "odel"): 0.8,
        }

        f_h_h = {
            ("save", "save"): 0.9,
            ("del",  "save"): 0.1,
            ("save", "del"): 0.1,
            ("del",  "del"): 0.9
        }
        # Create nodes.
        hid1 = DiscreteVariableNode("hid1", ["save", "del"])
        obs1 = DiscreteVariableNode("obs1", ["osave", "odel"])
        fact_h1_o1 = DiscreteFactorNode("fact_h1_o1", Factor(
            ['hid1', 'obs1'],
            {
                "hid1": ["save", "del"],
                "obs1": ["osave", "odel"]
            },
            f_h_o))

        hid2 = DiscreteVariableNode("hid2", ["save", "del"])
        obs2 = DiscreteVariableNode("obs2", ["osave", "odel"])
        fact_h2_o2 = DiscreteFactorNode("fact_h2_o2", Factor(
            ['hid2', 'obs2'],
            {
                "hid2": ["save", "del"],
                "obs2": ["osave", "odel"]
            },
            f_h_o))

        fact_h1_h2 = DiscreteFactorNode("fact_h1_h2", Factor(
            ['hid1', 'hid2'],
            {
                "hid1": ["save", "del"],
                "hid2": ["save", "del"],
            },
            f_h_h))

        hid3 = DiscreteVariableNode("hid3", ["save", "del"])
        obs3 = DiscreteVariableNode("obs3", ["osave", "odel"])
        fact_h3_o3 = DiscreteFactorNode("fact_h3_o3", Factor(
            ['hid3', 'obs3'],
            {
                "hid3": ["save", "del"],
                "obs3": ["osave", "odel"]
            },
            f_h_o))

        fact_h2_h3 = DiscreteFactorNode("fact_h2_h3", Factor(
            ['hid2', 'hid3'],
            {
                "hid2": ["save", "del"],
                "hid3": ["save", "del"],
            },
            f_h_h))

        # Connect nodes.
        obs1.connect(fact_h1_o1)
        obs2.connect(fact_h2_o2)
        obs3.connect(fact_h3_o3)

        fact_h1_o1.connect(hid1)
        fact_h2_o2.connect(hid2)
        fact_h3_o3.connect(hid3)

        hid1.connect(fact_h1_h2)
        hid2.connect(fact_h1_h2)

        hid2.connect(fact_h2_h3)
        hid3.connect(fact_h2_h3)

        # Set observations.
        obs1.observed({('osave',): 1})

        # Add nodes to lbp.
        lbp = LBP(strategy='layers')
        lbp.add_layers([
            [obs1, hid1, fact_h1_o1],
            [obs2, hid2, fact_h2_o2, fact_h1_h2],
            [obs3, hid3, fact_h3_o3, fact_h2_h3],
        ])

        lbp.run()

        self.assertAlmostEqual(hid1.belief[('save',)], 0.8)
        self.assertAlmostEqual(hid2.belief[('save',)], 0.8 * 0.9 + 0.2 * 0.1, places=6)
        # @DM: The original test that fails at my computer.
        # self.assertAlmostEqual(hid3.belief[('save',)], hid2.belief[('save',)] * 0.9 + hid2.belief[('del',)] * 0.1)
        # MK: This one passes.
        self.assertAlmostEqual(
            hid3.belief[('save',)],
            hid2.belief[('save',)] * 0.9 + hid2.belief[('del',)] * 0.1,
            places=6)

        lbp = LBP(strategy='layers')
        lbp.add_layers([
            [obs1, hid1, fact_h1_o1]
        ])

        lbp.run()
        self.assertAlmostEqual(hid1.belief[('save',)], 0.8)

        lbp.add_layer([obs2, hid2, fact_h2_o2, fact_h1_h2])
        lbp.run(from_layer=0)
        self.assertAlmostEqual(hid2.belief[('save',)], 0.8 * 0.9 + 0.2 * 0.1, places=6)

        lbp.add_layers([
            [obs3, hid3, fact_h3_o3, fact_h2_h3]
        ])
        lbp.run(from_layer='last')
        self.assertAlmostEqual(hid3.belief[('save',)], hid2.belief[('save',)] * 0.9 + hid2.belief[('del',)] * 0.1)
Пример #13
0
    def test_network(self):
        # Create nodes.
        hid1 = DiscreteVariableNode("hid1", ["save", "del"])
        obs1 = DiscreteVariableNode("obs1", ["osave", "odel"])
        fact_h1_o1 = DiscreteFactorNode("fact_h1_o1", Factor(
            ['hid1', 'obs1'],
            {
                "hid1": ["save", "del"],
                "obs1": ["osave", "odel"]
            },
            {
                ("save", "osave"): 0.8,
                ("save", "odel"): 0.3,
                ("del", "osave"): 0.2,
                ("del", "odel"): 0.7,
            }))

        hid2 = DiscreteVariableNode("hid2", ["save", "del"])
        obs2 = DiscreteVariableNode("obs2", ["osave", "odel"])
        fact_h2_o2 = DiscreteFactorNode("fact_h2_o2", Factor(
            ['hid2', 'obs2'],
            {
                "hid2": ["save", "del"],
                "obs2": ["osave", "odel"]
            },
            {
                ("save", "osave"): 0.8,
                ("save", "odel"): 0.2,
                ("del", "osave"): 0.2,
                ("del", "odel"): 0.8,
            }))

        fact_h1_h2 = DiscreteFactorNode("fact_h1_h2", Factor(
            ['hid1', 'hid2'],
            {
                "hid1": ["save", "del"],
                "hid2": ["save", "del"],
            },
            {
                ("save", "save"): 0.9,
                ("save", "del"): 0.1,
                ("del", "save"): 0,
                ("del", "del"): 1
            }))

        # Connect nodes.
        obs1.connect(fact_h1_o1)
        fact_h1_o1.connect(hid1)

        obs2.connect(fact_h2_o2)
        fact_h2_o2.connect(hid2)

        hid1.connect(fact_h1_h2)
        hid2.connect(fact_h1_h2)

        # Add nodes to lbp.
        lbp = LBP()
        lbp.add_nodes([
            obs1, fact_h1_o1, hid1,
            obs2, fact_h2_o2, hid2,
            fact_h1_h2
        ])

        obs1.observed({('osave',): 1})
        lbp.run(n_iterations=1)
        self.assertAlmostEqual(hid1.belief[('save',)], 0.8)

        obs2.observed({('odel',): 1})
        lbp.run(n_iterations=1)
        self.assertAlmostEqual(hid1.belief[('save',)], 0.56521738)
Пример #14
0
    def test_single_linked(self):
        f_h_o = {
            ("save", "osave"): 0.8,
            ("del", "osave"): 0.2,
            ("save", "odel"): 0.2,
            ("del", "odel"): 0.8,
        }

        f_h_h = {
            ("save", "save"): 0.9,
            ("del", "save"): 0.1,
            ("save", "del"): 0.1,
            ("del", "del"): 0.9
        }
        # Create nodes.
        hid1 = DiscreteVariableNode("hid1", ["save", "del"])
        obs1 = DiscreteVariableNode("obs1", ["osave", "odel"])
        fact_h1_o1 = DiscreteFactorNode(
            "fact_h1_o1",
            Factor(['hid1', 'obs1'], {
                "hid1": ["save", "del"],
                "obs1": ["osave", "odel"]
            }, f_h_o))

        hid2 = DiscreteVariableNode("hid2", ["save", "del"])
        obs2 = DiscreteVariableNode("obs2", ["osave", "odel"])
        fact_h2_o2 = DiscreteFactorNode(
            "fact_h2_o2",
            Factor(['hid2', 'obs2'], {
                "hid2": ["save", "del"],
                "obs2": ["osave", "odel"]
            }, f_h_o))

        fact_h1_h2 = DiscreteFactorNode(
            "fact_h1_h2",
            Factor(['hid1', 'hid2'], {
                "hid1": ["save", "del"],
                "hid2": ["save", "del"],
            }, f_h_h))

        hid3 = DiscreteVariableNode("hid3", ["save", "del"])
        obs3 = DiscreteVariableNode("obs3", ["osave", "odel"])
        fact_h3_o3 = DiscreteFactorNode(
            "fact_h3_o3",
            Factor(['hid3', 'obs3'], {
                "hid3": ["save", "del"],
                "obs3": ["osave", "odel"]
            }, f_h_o))

        fact_h2_h3 = DiscreteFactorNode(
            "fact_h2_h3",
            Factor(['hid2', 'hid3'], {
                "hid2": ["save", "del"],
                "hid3": ["save", "del"],
            }, f_h_h))

        # Connect nodes.
        obs1.connect(fact_h1_o1)
        obs2.connect(fact_h2_o2)
        obs3.connect(fact_h3_o3)

        fact_h1_o1.connect(hid1)
        fact_h2_o2.connect(hid2)
        fact_h3_o3.connect(hid3)

        hid1.connect(fact_h1_h2)
        hid2.connect(fact_h1_h2)

        hid2.connect(fact_h2_h3)
        hid3.connect(fact_h2_h3)

        # Add nodes to lbp.
        lbp = LBP(strategy='tree')
        lbp.add_nodes([
            obs1, obs2, obs3, fact_h1_o1, fact_h2_o2, fact_h3_o3, hid1, hid2,
            hid3, fact_h1_h2, fact_h2_h3
        ])

        obs1.observed({('osave', ): 1})
        lbp.run()

        self.assertAlmostEqual(hid1.belief[('save', )], 0.8)
        self.assertAlmostEqual(hid2.belief[('save', )],
                               0.8 * 0.9 + 0.2 * 0.1,
                               places=6)
        self.assertAlmostEqual(hid3.belief[('save', )],
                               hid2.belief[('save', )] * 0.9 +
                               hid2.belief[('del', )] * 0.1,
                               places=6)
Пример #15
0
    def test_ep(self):
        # Create nodes.
        hid1 = DiscreteVariableNode("hid1", ["save", "del"])
        obs1 = DiscreteVariableNode("obs1", ["osave", "odel"])
        fact_h1_o1 = DirichletFactorNode("fact_h1_o1")
        theta_h1_o1 = DirichletParameterNode(
            'theta_h1_o1',
            Factor(['hid1', 'obs1'], {
                "hid1": ["save", "del"],
                "obs1": ["osave", "odel"]
            }, {
                ("save", "osave"): 1,
                ("save", "odel"): 1,
                ("del", "osave"): 1,
                ("del", "odel"): 1,
            }))

        hid2 = DiscreteVariableNode("hid2", ["save", "del"])
        obs2 = DiscreteVariableNode("obs2", ["osave", "odel"])
        fact_h2_o2 = DirichletFactorNode("fact_h2_o2")
        theta_h2_o2 = DirichletParameterNode(
            'theta_h2_o2',
            Factor(['hid2', 'obs2'], {
                "hid2": ["save", "del"],
                "obs2": ["osave", "odel"]
            }, {
                ("save", "osave"): 1,
                ("save", "odel"): 1,
                ("del", "osave"): 1,
                ("del", "odel"): 1,
            }))

        fact_h1_h2 = DiscreteFactorNode(
            "fact_h1_h2",
            Factor(['hid1', 'hid2'], {
                "hid1": ["save", "del"],
                "hid2": ["save", "del"],
            }, {
                ("save", "save"): 0.9,
                ("save", "del"): 0.1,
                ("del", "save"): 0,
                ("del", "del"): 1
            }))

        # Connect nodes.
        obs1.connect(fact_h1_o1, parent=False)
        fact_h1_o1.connect(hid1)
        fact_h1_o1.connect(theta_h1_o1)

        obs2.connect(fact_h2_o2, parent=False)
        fact_h2_o2.connect(hid2)
        fact_h2_o2.connect(theta_h2_o2)

        hid1.connect(fact_h1_h2)
        hid2.connect(fact_h1_h2)

        # Add nodes to lbp.
        lbp = LBP(strategy='tree')
        lbp.add_nodes([
            obs1, obs2, fact_h1_o1, fact_h2_o2, theta_h1_o1, theta_h2_o2, hid1,
            hid2, fact_h1_h2
        ])

        obs1.observed({('osave', ): 1})
        obs2.observed({('osave', ): 1})
        hid1.observed({('save', ): 1})
        hid2.observed({('save', ): 1})

        for i in range(100):
            lbp.run()
            print theta_h1_o1.alpha.pretty_print(precision=5)
            lbp.init_messages()
Пример #16
0
    def test_parameter_simple(self):
        alpha = DirichletParameterNode(
            'theta',
            Factor(['X0', 'X1'], {
                'X0': ['x0_0', 'x0_1'],
                'X1': ['x1_0'],
            }, {
                ('x0_0', 'x1_0'): 3,
                ('x0_1', 'x1_0'): 1,
            }))

        factor = DirichletFactorNode('factor')
        x0 = DiscreteVariableNode('X0', ['x0_0', 'x0_1'])
        x1 = DiscreteVariableNode('X1', ['x1_0'])

        x1.observed({('x1_0', ): 1})

        factor.connect(alpha)
        factor.connect(x0, parent=False)
        factor.connect(x1, parent=True)

        x0.message_to(factor)
        x1.message_to(factor)

        factor.update()
        self.assertAlmostEqual(factor.belief[('x0_0', 'x1_0')], 0.5)

        factor.message_to(x0)
        factor.message_to(x1)

        x0.update()
        self.assertAlmostEqual(x0.belief[('x0_0', )], 3.0 / 4)

        factor.message_to(alpha)
Пример #17
0
    def test_parameter(self):
        alpha = DirichletParameterNode(
            'theta',
            Factor(['X0', 'X1'], {
                'X0': ['x0_0', 'x0_1'],
                'X1': ['x1_0', 'x1_1', 'x1_2'],
            }, {
                ('x0_0', 'x1_0'): 1,
                ('x0_0', 'x1_1'): 8,
                ('x0_0', 'x1_2'): 1,
                ('x0_1', 'x1_0'): 1,
                ('x0_1', 'x1_1'): 2,
                ('x0_1', 'x1_2'): 1,
            }))

        factor = DirichletFactorNode('factor')
        x0 = DiscreteVariableNode('X0', ['x0_0', 'x0_1'])
        x1 = DiscreteVariableNode('X1', ['x1_0', 'x1_1', 'x1_2'])

        x0.observed({('x0_0', ): 1})
        x1.observed({('x1_0', ): 0.7, ('x1_1', ): 0.2, ('x1_2', ): 0.1})

        factor.connect(alpha)
        factor.connect(x0, parent=False)
        factor.connect(x1, parent=True)

        x0.message_to(factor)
        x1.message_to(factor)

        factor.update()

        factor.message_to(x0)
        factor.message_to(x1)

        x0.update()

        factor.message_to(alpha)

        alpha.message_to(factor)

        factor.update()
        factor.message_to(alpha)
Пример #18
0
    def test_single_linked(self):
        f_h_o = {
            ("save", "osave"): 0.8,
            ("del",  "osave"): 0.2,
            ("save", "odel"): 0.2,
            ("del",  "odel"): 0.8,
        }

        f_h_h = {
            ("save", "save"): 0.9,
            ("del",  "save"): 0.1,
            ("save", "del"): 0.1,
            ("del",  "del"): 0.9
        }
        # Create nodes.
        hid1 = DiscreteVariableNode("hid1", ["save", "del"])
        obs1 = DiscreteVariableNode("obs1", ["osave", "odel"])
        fact_h1_o1 = DiscreteFactorNode("fact_h1_o1", Factor(
            ['hid1', 'obs1'],
            {
                "hid1": ["save", "del"],
                "obs1": ["osave", "odel"]
            },
            f_h_o))

        hid2 = DiscreteVariableNode("hid2", ["save", "del"])
        obs2 = DiscreteVariableNode("obs2", ["osave", "odel"])
        fact_h2_o2 = DiscreteFactorNode("fact_h2_o2", Factor(
            ['hid2', 'obs2'],
            {
                "hid2": ["save", "del"],
                "obs2": ["osave", "odel"]
            },
            f_h_o))

        fact_h1_h2 = DiscreteFactorNode("fact_h1_h2", Factor(
            ['hid1', 'hid2'],
            {
                "hid1": ["save", "del"],
                "hid2": ["save", "del"],
            },
            f_h_h))

        hid3 = DiscreteVariableNode("hid3", ["save", "del"])
        obs3 = DiscreteVariableNode("obs3", ["osave", "odel"])
        fact_h3_o3 = DiscreteFactorNode("fact_h3_o3", Factor(
            ['hid3', 'obs3'],
            {
                "hid3": ["save", "del"],
                "obs3": ["osave", "odel"]
            },
            f_h_o))

        fact_h2_h3 = DiscreteFactorNode("fact_h2_h3", Factor(
            ['hid2', 'hid3'],
            {
                "hid2": ["save", "del"],
                "hid3": ["save", "del"],
            },
            f_h_h))

        # Connect nodes.
        obs1.connect(fact_h1_o1)
        obs2.connect(fact_h2_o2)
        obs3.connect(fact_h3_o3)

        fact_h1_o1.connect(hid1)
        fact_h2_o2.connect(hid2)
        fact_h3_o3.connect(hid3)

        hid1.connect(fact_h1_h2)
        hid2.connect(fact_h1_h2)

        hid2.connect(fact_h2_h3)
        hid3.connect(fact_h2_h3)

        # Add nodes to lbp.
        lbp = LBP(strategy='tree')
        lbp.add_nodes([
            obs1, obs2, obs3,
            fact_h1_o1, fact_h2_o2, fact_h3_o3,
            hid1, hid2, hid3,
            fact_h1_h2, fact_h2_h3
        ])

        obs1.observed({('osave',): 1})
        lbp.run()

        self.assertAlmostEqual(hid1.belief[('save',)], 0.8)
        self.assertAlmostEqual(hid2.belief[('save',)], 0.8 * 0.9 + 0.2 * 0.1, places=6)
        self.assertAlmostEqual(hid3.belief[('save',)],
                               hid2.belief[('save',)] * 0.9 + hid2.belief[('del',)] * 0.1,
                               places=6)
Пример #19
0
    def test_two_factors_one_theta2(self):
        alpha = DirichletParameterNode(
            'theta',
            Factor(['X0', 'X1'], {
                'X0': ['x0_0', 'x0_1'],
                'X1': ['x1_0', 'x1_1', 'x1_2'],
            }, {
                ('x0_0', 'x1_0'): 1,
                ('x0_0', 'x1_1'): 8,
                ('x0_0', 'x1_2'): 1,
                ('x0_1', 'x1_0'): 1,
                ('x0_1', 'x1_1'): 2,
                ('x0_1', 'x1_2'): 1,
            }))

        f1 = DirichletFactorNode('f1', aliases={'X0': 'X0_a', 'X1': 'X1_a'})
        x0 = DiscreteVariableNode('X0_a', ['x0_0', 'x0_1'])
        x1 = DiscreteVariableNode('X1_a', ['x1_0', 'x1_1', 'x1_2'])

        f2 = DirichletFactorNode('f2', aliases={'X0': 'X0_b', 'X1': 'X1_b'})
        x2 = DiscreteVariableNode('X0_b', ['x0_0', 'x0_1'])
        x3 = DiscreteVariableNode('X1_b', ['x1_0', 'x1_1', 'x1_2'])

        f1.connect(x0, parent=False)
        f1.connect(x1)

        f2.connect(x2, parent=False)
        f2.connect(x3)

        f1.connect(alpha)
        f2.connect(alpha)

        alpha.aliases = {
            'X0_a': 'X0',
            'X0_b': 'X0',
            'X1_a': 'X1',
            'X1_b': 'X1'
        }

        x0.observed({('x0_0', ): 1})
        x1.observed({('x1_0', ): 1})

        x2.observed({('x0_1', ): 1})
        x3.observed({('x1_0', ): 1})

        x0.message_to(f1)
        x1.message_to(f1)
        x2.message_to(f2)
        x3.message_to(f2)

        f1.update()
        f2.update()

        f1.message_to(alpha)
        f2.message_to(alpha)

        self.assertAlmostEqual(alpha.alpha[('x0_0', 'x1_0')], 2, places=5)
        self.assertAlmostEqual(alpha.alpha[('x0_1', 'x1_0')], 2, places=5)
Пример #20
0
    def test_parameter(self):
        alpha = DirichletParameterNode('theta', Factor(
            ['X0', 'X1'],
            {
                'X0': ['x0_0', 'x0_1'],
                'X1': ['x1_0', 'x1_1', 'x1_2'],
            },
            {
                ('x0_0', 'x1_0'): 1,
                ('x0_0', 'x1_1'): 8,
                ('x0_0', 'x1_2'): 1,
                ('x0_1', 'x1_0'): 1,
                ('x0_1', 'x1_1'): 2,
                ('x0_1', 'x1_2'): 1,
            }
        ))

        factor = DirichletFactorNode('factor')
        x0 = DiscreteVariableNode('X0', ['x0_0', 'x0_1'])
        x1 = DiscreteVariableNode('X1', ['x1_0', 'x1_1', 'x1_2'])

        x0.observed({('x0_0',): 1})
        x1.observed({('x1_0',): 0.7, ('x1_1',): 0.2, ('x1_2',): 0.1})

        factor.connect(alpha)
        factor.connect(x0, parent=False)
        factor.connect(x1, parent=True)

        x0.message_to(factor)
        x1.message_to(factor)

        factor.update()

        factor.message_to(x0)
        factor.message_to(x1)

        x0.update()

        factor.message_to(alpha)
        print alpha.alpha

        alpha.message_to(factor)

        factor.update()
        factor.message_to(alpha)
        print alpha.alpha
Пример #21
0
    def test_observed_complex(self):
        s1 = DiscreteVariableNode('s1', ['a', 'b'])
        s2 = DiscreteVariableNode('s2', ['a', 'b'])
        f = DiscreteFactorNode(
            'f',
            Factor(['s1', 's2'], {
                's1': ['a', 'b'],
                's2': ['a', 'b'],
            }, {
                ('a', 'a'): 1,
                ('a', 'b'): 0.5,
                ('b', 'a'): 0,
                ('b', 'b'): 0.5
            }))

        s1.connect(f)
        s2.connect(f)

        s2.observed({('a', ): 0.7, ('b', ): 0.3})

        s1.send_messages()
        s2.send_messages()

        f.update()
        f.normalize()

        f.send_messages()

        s1.update()
        s1.normalize()

        self.assertClose(s1.belief[('a', )], 0.85)
        self.assertClose(s1.belief[('b', )], 0.15)
        self.assertClose(s2.belief[('a', )], 0.7)
Пример #22
0
    def test_network(self):
        # Create nodes.
        hid1 = DiscreteVariableNode("hid1", ["save", "del"])
        obs1 = DiscreteVariableNode("obs1", ["osave", "odel"])
        fact_h1_o1 = DiscreteFactorNode(
            "fact_h1_o1",
            Factor(['hid1', 'obs1'], {
                "hid1": ["save", "del"],
                "obs1": ["osave", "odel"]
            }, {
                ("save", "osave"): 0.8,
                ("save", "odel"): 0.3,
                ("del", "osave"): 0.2,
                ("del", "odel"): 0.7,
            }))

        hid2 = DiscreteVariableNode("hid2", ["save", "del"])
        obs2 = DiscreteVariableNode("obs2", ["osave", "odel"])
        fact_h2_o2 = DiscreteFactorNode(
            "fact_h2_o2",
            Factor(['hid2', 'obs2'], {
                "hid2": ["save", "del"],
                "obs2": ["osave", "odel"]
            }, {
                ("save", "osave"): 0.8,
                ("save", "odel"): 0.2,
                ("del", "osave"): 0.2,
                ("del", "odel"): 0.8,
            }))

        fact_h1_h2 = DiscreteFactorNode(
            "fact_h1_h2",
            Factor(['hid1', 'hid2'], {
                "hid1": ["save", "del"],
                "hid2": ["save", "del"],
            }, {
                ("save", "save"): 0.9,
                ("save", "del"): 0.1,
                ("del", "save"): 0,
                ("del", "del"): 1
            }))

        # Connect nodes.
        obs1.connect(fact_h1_o1)
        fact_h1_o1.connect(hid1)

        obs2.connect(fact_h2_o2)
        fact_h2_o2.connect(hid2)

        hid1.connect(fact_h1_h2)
        hid2.connect(fact_h1_h2)

        # Add nodes to lbp.
        lbp = LBP()
        lbp.add_nodes(
            [obs1, fact_h1_o1, hid1, obs2, fact_h2_o2, hid2, fact_h1_h2])

        obs1.observed({('osave', ): 1})
        lbp.run(n_iterations=1)
        self.assertAlmostEqual(hid1.belief[('save', )], 0.8)

        obs2.observed({('odel', ): 1})
        lbp.run(n_iterations=1)
        self.assertAlmostEqual(hid1.belief[('save', )], 0.56521738)