83 lines
2.7 KiB
Python
Executable File
83 lines
2.7 KiB
Python
Executable File
import unittest
|
|
import numpy as np
|
|
from prml import bayesnet as bn
|
|
|
|
|
|
class TestDiscrete(unittest.TestCase):
|
|
|
|
def test_discrete(self):
|
|
a = bn.discrete([0.2, 0.8])
|
|
b = bn.discrete([[0.1, 0.2], [0.9, 0.8]], a)
|
|
self.assertTrue(np.allclose(b.proba, [0.18, 0.82]))
|
|
a.observe(0)
|
|
self.assertTrue(np.allclose(b.proba, [0.1, 0.9]))
|
|
|
|
a = bn.discrete([0.1, 0.9])
|
|
b = bn.discrete([[0.7, 0.2], [0.3, 0.8]], a)
|
|
c = bn.discrete([[0.8, 0.4], [0.2, 0.6]], b)
|
|
self.assertTrue(np.allclose(a.proba, [0.1, 0.9]))
|
|
self.assertTrue(np.allclose(b.proba, [0.25, 0.75]))
|
|
self.assertTrue(np.allclose(c.proba, [0.5, 0.5]))
|
|
c.observe(0)
|
|
self.assertTrue(np.allclose(a.proba, [0.136, 0.864]))
|
|
self.assertTrue(np.allclose(b.proba, [0.4, 0.6]))
|
|
self.assertTrue(np.allclose(c.proba, [1, 0]))
|
|
|
|
a = bn.discrete([0.1, 0.9], name="p(a)")
|
|
b = bn.discrete([0.1, 0.9], name="p(b)")
|
|
c = bn.discrete(
|
|
[[[0.9, 0.8],
|
|
[0.8, 0.2]],
|
|
[[0.1, 0.2],
|
|
[0.2, 0.8]]],
|
|
a, b, name="p(c|a,b)"
|
|
)
|
|
c.observe(0)
|
|
self.assertTrue(np.allclose(a.proba, [0.25714286, 0.74285714]))
|
|
b.observe(0)
|
|
self.assertTrue(np.allclose(a.proba, [0.11111111, 0.88888888]))
|
|
|
|
a = bn.discrete([0.1, 0.9], name="p(a)")
|
|
b = bn.discrete([0.1, 0.9], name="p(b)")
|
|
c = bn.discrete(
|
|
[[[0.9, 0.8],
|
|
[0.8, 0.2]],
|
|
[[0.1, 0.2],
|
|
[0.2, 0.8]]],
|
|
a, b, name="p(c|a,b)"
|
|
)
|
|
c.observe(0, proprange=0)
|
|
self.assertTrue(np.allclose(a.proba, [0.1, 0.9]))
|
|
b.observe(0, proprange=1)
|
|
self.assertTrue(np.allclose(a.proba, [0.1, 0.9]))
|
|
b.send_message(proprange=2)
|
|
self.assertTrue(np.allclose(a.proba, [0.11111111, 0.88888888]))
|
|
a.send_message()
|
|
c.send_message()
|
|
self.assertTrue(np.allclose(a.proba, [0.11111111, 0.88888888]), a.message_from)
|
|
|
|
a = bn.discrete([0.1, 0.9], name="p(a)")
|
|
b = bn.discrete([0.1, 0.9], name="p(b)")
|
|
c = bn.discrete(
|
|
[[[0.9, 0.8],
|
|
[0.8, 0.2]],
|
|
[[0.1, 0.2],
|
|
[0.2, 0.8]]],
|
|
a, b, name="p(c|a,b)"
|
|
)
|
|
b.observe(0)
|
|
self.assertTrue(np.allclose(a.proba, [0.1, 0.9]))
|
|
c.send_message()
|
|
self.assertTrue(np.allclose(a.proba, [0.1, 0.9]), a.message_from)
|
|
|
|
def test_joint_discrete(self):
|
|
a = bn.DiscreteVariable(2)
|
|
b = bn.DiscreteVariable(2)
|
|
bn.discrete([[0.1, 0.2], [0.3, 0.4]], out=[a, b])
|
|
b.observe(1)
|
|
self.assertTrue(np.allclose(a.proba, [1/3, 2/3]))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|