Example #1
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)
Example #2
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)