Files
2026-07-13 13:30:25 +08:00

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()