def setUp(self): # Create BayesNet self.bn = BayesianNetwork() # Create Nodes weather0 = DiscreteNode("Weather0", ["Sun", "Rain"]) weather = DiscreteNode("Weather", ["Sun", "Rain"]) ice_cream_eaten = DiscreteNode("Ice Cream Eaten", [True, False]) # Add nodes self.bn.add_node(weather0) self.bn.add_node(weather) self.bn.add_node(ice_cream_eaten) # Add edges self.bn.add_edge(weather, ice_cream_eaten) self.bn.add_edge(weather0, weather) # Set probabilities cpt_weather0 = numpy.array([.6, .4]) weather0.set_probability_table(cpt_weather0, [weather0]) cpt_weather = numpy.array([[.7, .5], [.3, .5]]) weather.set_probability_table(cpt_weather, [weather0, weather]) ice_cream_eaten.set_probability(.9, [(ice_cream_eaten, True), (weather, "Sun")]) ice_cream_eaten.set_probability(.1, [(ice_cream_eaten, False), (weather, "Sun")]) ice_cream_eaten.set_probability(.2, [(ice_cream_eaten, True), (weather, "Rain")]) ice_cream_eaten.set_probability(.8, [(ice_cream_eaten, False), (weather, "Rain")])
def setUp(self): # Create BayesNet self.bn = BayesianNetwork() # Create Nodes weather0 = DiscreteNode("Weather0", ["Sun", "Rain"]) weather = DiscreteNode("Weather", ["Sun", "Rain"]) ice_cream_eaten = DiscreteNode("Ice Cream Eaten", [True, False]) # Add nodes self.bn.add_node(weather0) self.bn.add_node(weather) self.bn.add_node(ice_cream_eaten) # Add edges self.bn.add_edge(weather, ice_cream_eaten) self.bn.add_edge(weather0, weather) # Set probabilities cpt_weather0 = numpy.array([0.6, 0.4]) weather0.set_probability_table(cpt_weather0, [weather0]) cpt_weather = numpy.array([[0.7, 0.5], [0.3, 0.5]]) weather.set_probability_table(cpt_weather, [weather0, weather]) ice_cream_eaten.set_probability(0.9, [(ice_cream_eaten, True), (weather, "Sun")]) ice_cream_eaten.set_probability(0.1, [(ice_cream_eaten, False), (weather, "Sun")]) ice_cream_eaten.set_probability(0.2, [(ice_cream_eaten, True), (weather, "Rain")]) ice_cream_eaten.set_probability(0.8, [(ice_cream_eaten, False), (weather, "Rain")])
class ImportExportTest(unittest.TestCase): def setUp(self): # Create BayesNet self.bn = BayesianNetwork() # Create Nodes weather0 = DiscreteNode("Weather0", ["Sun", "Rain"]) weather = DiscreteNode("Weather", ["Sun", "Rain"]) ice_cream_eaten = DiscreteNode("Ice Cream Eaten", [True, False]) # Add nodes self.bn.add_node(weather0) self.bn.add_node(weather) self.bn.add_node(ice_cream_eaten) # Add edges self.bn.add_edge(weather, ice_cream_eaten) self.bn.add_edge(weather0, weather) # Set probabilities cpt_weather0 = numpy.array([0.6, 0.4]) weather0.set_probability_table(cpt_weather0, [weather0]) cpt_weather = numpy.array([[0.7, 0.5], [0.3, 0.5]]) weather.set_probability_table(cpt_weather, [weather0, weather]) ice_cream_eaten.set_probability(0.9, [(ice_cream_eaten, True), (weather, "Sun")]) ice_cream_eaten.set_probability(0.1, [(ice_cream_eaten, False), (weather, "Sun")]) ice_cream_eaten.set_probability(0.2, [(ice_cream_eaten, True), (weather, "Rain")]) ice_cream_eaten.set_probability(0.8, [(ice_cream_eaten, False), (weather, "Rain")]) def test_import_export(self): # write BN xmlbif = XMLBIF(self.bn, "Test Net") xmlbif.write("test_out.xmlbif") # read BN bn2 = XMLBIF.read("test_out.xmlbif") for node1 in self.bn.get_nodes(): name_found = False cpd_equal = False value_range_equal = False str_equal = False pos_equal = False for node2 in bn2.get_nodes(): print(node2.name) print(node2.get_cpd()) # Test node names print(node2.name) if node1.name == node2.name: name_found = True cpd_equal = node1.get_cpd() == node2.get_cpd() value_range_equal = node1.get_value_range() == node2.get_value_range() str_equal = str(node1) == str(node2) pos_equal = node1.pos == node2.pos self.assertTrue(name_found) self.assertTrue(cpd_equal) self.assertTrue(value_range_equal) self.assertTrue(str_equal) self.assertTrue(pos_equal) # remove file os.remove("test_out.xmlbif")
#About this example: #This example shows how approximate inference can be used query a purely continuous #bayesian network. At first that network is being constructed and afterwards it #is passed to an MCMC object that is used to answer several kinds of questions: #-Prior marginal #-Posterior marginal #-Probability of evidence #-Maximum a-posteriori hypothesis #Construct some simple BayesianNetwork. #topology bn = BayesianNetwork() cnf=ContinuousNodeFactory() age = cnf.createExponentialNode("Plant_age") height = cnf.createGaussNode("Plant_height") diameter = cnf.createBetaNode("Plant_diameter") bn.add_node(age) bn.add_node(height) bn.add_node(diameter) bn.add_edge(age,height) bn.add_edge(age,diameter) #parameterization #Semantics: Many young plants and the higher the age the lower the probabilty #->lambda=2.0
from primo.densities import BetaParameters from primo.densities import GaussParameters from primo.densities import NDGauss from primo.inference.mcmc import MCMC from primo.evidence import EvidenceEqual as EvEqual from primo.evidence import EvidenceInterval as EvInterval import numpy # Construct some simple BayesianNetwork. In this example it models # the linear relationship between the age of a plant and the height that # it has grown up to (+noise) bn = BayesianNetwork() cnf = ContinuousNodeFactory() # create the nodes age = cnf.createExponentialNode("Age") sun = cnf.createBetaNode("Sun") ground = cnf.createGaussNode("Ground") growth = cnf.createGaussNode("Growth") height = cnf.createBetaNode("Height") diameter = cnf.createExponentialNode("Diameter") children = cnf.createExponentialNode("Children") # add the nodes to the network bn.add_node(age) bn.add_node(sun) bn.add_node(ground)
from primo.densities import ExponentialParameters from primo.densities import BetaParameters from primo.densities import GaussParameters from primo.densities import NDGauss from primo.inference.mcmc import MCMC from primo.evidence import EvidenceEqual as EvEqual from primo.evidence import EvidenceInterval as EvInterval import numpy #Construct some simple BayesianNetwork. In this example it models #the linear relationship between the age of a plant and the height that #it has grown up to (+noise) bn = BayesianNetwork() cnf = ContinuousNodeFactory() #create the nodes age = cnf.createExponentialNode("Age") sun = cnf.createBetaNode("Sun") ground = cnf.createGaussNode("Ground") growth = cnf.createGaussNode("Growth") height = cnf.createBetaNode("Height") diameter = cnf.createExponentialNode("Diameter") children = cnf.createExponentialNode("Children") #add the nodes to the network bn.add_node(age) bn.add_node(sun) bn.add_node(ground)
#!/usr/bin/env python # -*- coding: utf-8 -*- from primo.networks import BayesianNetwork from primo.nodes import DiscreteNode import numpy bn = BayesianNetwork() burglary = DiscreteNode("Burglary", ["Intruder","Safe"]) alarm = DiscreteNode("Alarm", ["Ringing", "Silent","Kaputt"]) earthquake = DiscreteNode("Earthquake", ["Shaking", "Calm"]) john_calls = DiscreteNode("John calls", ["Calling", "Not Calling"]) mary_calls = DiscreteNode("Mary calls", ["Calling", "Not Calling"]) bn.add_node(burglary) bn.add_node(alarm) bn.add_node(earthquake) bn.add_node(john_calls) bn.add_node(mary_calls) bn.add_edge(burglary,alarm) bn.add_edge(earthquake, alarm) bn.add_edge(alarm, john_calls) bn.add_edge(alarm, mary_calls) burglary.set_probability(0.2,[(burglary,"Intruder")]) alarm.set_probability(0.1,[(alarm,"Ringing"),(burglary,"Safe"),(earthquake,"Calm")])
#!/usr/bin/env python # -*- coding: utf-8 -*- """ This example shows how to create a BayesNet @author: djohn """ import numpy from primo.networks import BayesianNetwork from primo.nodes import DiscreteNode #initialize a new BayesNet bn = BayesianNetwork() #create Nodes with Name and the possible values burglary = DiscreteNode("Burglary", ["Intruder","Safe"]) alarm = DiscreteNode("Alarm", ["Ringing", "Silent"]) earthquake = DiscreteNode("Earthquake", ["Shaking", "Calm"]) john_calls = DiscreteNode("John calls", ["Calling", "Not Calling"]) baum_calls = DiscreteNode("Baum calls", ["Calling", "Not Calling"]) # add Nodes to BayesNet bn.add_node(burglary) bn.add_node(alarm) bn.add_node(earthquake) bn.add_node(john_calls) bn.add_node(baum_calls)
from primo.evidence import EvidenceEqual as EvEq from primo.inference.mcmc import GibbsTransitionModel import numpy import pdb #About this example: #This example shows how approximate inference can be used query a purely discrete #bayesian network. At first that network is being constructed and afterwards it #is passed to an MCMC object that is used to answer several kinds of questions: #-Prior marginal #-Posterior marginal #-Probability of evidence #-Maximum a-posteriori hypothesis #Construct some simple BayesianNetwork bn = BayesianNetwork() burglary = DiscreteNode("Burglary", ["Intruder", "Safe"]) alarm = DiscreteNode("Alarm", ["Ringing", "Silent", "Destroyed"]) bn.add_node(burglary) bn.add_node(alarm) bn.add_edge(burglary, alarm) #Parametrize the network burglary_cpt = numpy.array([0.2, 0.8]) burglary.set_probability_table(burglary_cpt, [burglary]) alarm_cpt = numpy.array([[0.8, 0.15, 0.05], [0.05, 0.9, 0.05]]) alarm.set_probability_table(alarm_cpt, [burglary, alarm])
""" This example show how to calculate Marginals and the probability of evidence. @author: djohn """ from primo.networks import BayesianNetwork from primo.nodes import DiscreteNode from primo.inference.factor import EasiestFactorElimination from primo.inference.factor import FactorTreeFactory import numpy #============================================================================== #Builds the example BayesNet bn = BayesianNetwork() burglary = DiscreteNode("Burglary", ["Intruder","Safe"]) alarm = DiscreteNode("Alarm", ["Ringing", "Silent"]) earthquake = DiscreteNode("Earthquake", ["Shaking", "Calm"]) john_calls = DiscreteNode("John calls", ["Calling", "Not Calling"]) baum_calls = DiscreteNode("Baum calls", ["Calling", "Not Calling"]) bn.add_node(burglary) bn.add_node(alarm) bn.add_node(earthquake) bn.add_node(john_calls) bn.add_node(baum_calls) bn.add_edge(burglary,alarm) bn.add_edge(earthquake, alarm) bn.add_edge(alarm, john_calls)
#!/usr/bin/env python # -*- coding: utf-8 -*- import random import numpy from primo.networks import BayesianNetwork from primo.networks import DynamicBayesianNetwork from primo.networks import TwoTBN from primo.nodes import DiscreteNode import primo.inference.particlefilter as pf from primo.io import XMLBIF # Construct a DynmaicBayesianNetwork dbn = DynamicBayesianNetwork() B0 = BayesianNetwork() twoTBN = TwoTBN(XMLBIF.read("Robot_Localization.xmlbif")) # Configure TwoTBN x0 = twoTBN.get_node("x0") x = twoTBN.get_node("x") door = twoTBN.get_node("door") twoTBN.set_initial_node(x0.name, x.name) # Configure initial distribution x0_init = DiscreteNode( x0.name, ["p0", "p1", "p2", "p3", "p4", "p5", "p6", "p7", "p8", "p9"]) B0.add_node(x0_init) cpt_x0_init = numpy.array([.1, .1, .1, .1, .1, .1, .1, .1, .1, .1]) x0_init.set_probability_table(cpt_x0_init, [x0_init])
def setUp(self): self.bn = BayesianNetwork()
class NodeAddAndRemoveTestCase(unittest.TestCase): def setUp(self): self.bn = BayesianNetwork() def tearDown(self): self.bn = None def test_clear_and_len(self): self.assertFalse(0 == len(self.bn)) self.assertFalse(0 == self.bn.number_of_nodes()) self.bn.clear() self.assertEqual(0, len(self.bn)) self.assertEqual(0, self.bn.number_of_nodes()) def test_add_node(self): self.bn.clear() n = DiscreteNode("Some Node", [True, False]) self.bn.add_node(n) self.assertEqual(n, self.bn.get_node("Some Node")) self.assertTrue(n in self.bn.get_nodes(["Some Node"])) node_with_same_name = DiscreteNode("Some Node", [True, False]) self.assertRaises(Exception, self.bn.add_node, node_with_same_name) def test_remove_node(self): self.bn.clear() n = DiscreteNode("Some Node to remove", [True, False]) self.bn.add_node(n) self.bn.remove_node(n) self.assertFalse(n in self.bn.get_nodes([])) def test_add_edge(self): self.bn.clear() n1 = DiscreteNode("1", [True, False]) n2 = DiscreteNode("2", [True, False]) self.bn.add_node(n1) self.bn.add_node(n2) self.bn.add_edge(n1, n2) self.assertTrue(n1 in self.bn.get_parents(n2)) self.assertTrue(n2 in self.bn.get_children(n1)) def test_remove_edge(self): self.bn.clear() n1 = DiscreteNode("1", [True, False]) n2 = DiscreteNode("2", [True, False]) self.bn.add_node(n1) self.bn.add_node(n2) self.bn.add_edge(n1, n2) self.assertEqual([n1], self.bn.get_parents(n2)) self.bn.remove_edge(n1, n2) self.assertEqual([], self.bn.get_parents(n2)) def test_is_valid(self): self.bn.clear() n1 = DiscreteNode("1", [True, False]) n2 = DiscreteNode("2", [True, False]) self.bn.add_node(n1) self.bn.add_node(n2) self.bn.add_edge(n1, n2) self.assertTrue(self.bn.is_valid()) self.bn.add_edge(n1, n1) self.assertFalse(self.bn.is_valid()) self.bn.remove_edge(n1, n1) self.assertTrue(self.bn.is_valid()) n3 = DiscreteNode("3", [True, False]) n4 = DiscreteNode("4", [True, False]) self.bn.add_node(n3) self.bn.add_node(n4) self.assertTrue(self.bn.is_valid()) self.bn.add_edge(n2, n3) self.assertTrue(self.bn.is_valid()) self.bn.add_edge(n3, n4) self.assertTrue(self.bn.is_valid()) self.bn.add_edge(n4, n1) self.assertFalse(self.bn.is_valid())
class ImportExportTest(unittest.TestCase): def setUp(self): # Create BayesNet self.bn = BayesianNetwork() # Create Nodes weather0 = DiscreteNode("Weather0", ["Sun", "Rain"]) weather = DiscreteNode("Weather", ["Sun", "Rain"]) ice_cream_eaten = DiscreteNode("Ice Cream Eaten", [True, False]) # Add nodes self.bn.add_node(weather0) self.bn.add_node(weather) self.bn.add_node(ice_cream_eaten) # Add edges self.bn.add_edge(weather, ice_cream_eaten) self.bn.add_edge(weather0, weather) # Set probabilities cpt_weather0 = numpy.array([.6, .4]) weather0.set_probability_table(cpt_weather0, [weather0]) cpt_weather = numpy.array([[.7, .5], [.3, .5]]) weather.set_probability_table(cpt_weather, [weather0, weather]) ice_cream_eaten.set_probability(.9, [(ice_cream_eaten, True), (weather, "Sun")]) ice_cream_eaten.set_probability(.1, [(ice_cream_eaten, False), (weather, "Sun")]) ice_cream_eaten.set_probability(.2, [(ice_cream_eaten, True), (weather, "Rain")]) ice_cream_eaten.set_probability(.8, [(ice_cream_eaten, False), (weather, "Rain")]) def test_import_export(self): # write BN xmlbif = XMLBIF(self.bn, "Test Net") xmlbif.write("test_out.xmlbif") # read BN bn2 = XMLBIF.read("test_out.xmlbif") for node1 in self.bn.get_nodes(): name_found = False cpd_equal = False value_range_equal = False str_equal = False pos_equal = False for node2 in bn2.get_nodes(): print(node2.name) print(node2.get_cpd()) # Test node names print(node2.name) if node1.name == node2.name: name_found = True cpd_equal = node1.get_cpd() == node2.get_cpd() value_range_equal = node1.get_value_range( ) == node2.get_value_range() str_equal = str(node1) == str(node2) pos_equal = node1.pos == node2.pos self.assertTrue(name_found) self.assertTrue(cpd_equal) self.assertTrue(value_range_equal) self.assertTrue(str_equal) self.assertTrue(pos_equal) # remove file os.remove("test_out.xmlbif")
from primo.evidence import EvidenceEqual as EvEq from primo.inference.mcmc import GibbsTransitionModel import numpy import pdb #About this example: #This example shows how approximate inference can be used query a purely discrete #bayesian network. At first that network is being constructed and afterwards it #is passed to an MCMC object that is used to answer several kinds of questions: #-Prior marginal #-Posterior marginal #-Probability of evidence #-Maximum a-posteriori hypothesis #Construct some simple BayesianNetwork bn = BayesianNetwork() burglary = DiscreteNode("Burglary", ["Intruder","Safe"]) alarm = DiscreteNode("Alarm", ["Ringing", "Silent","Destroyed"]) bn.add_node(burglary) bn.add_node(alarm) bn.add_edge(burglary,alarm) #Parametrize the network burglary_cpt=numpy.array([0.2,0.8]) burglary.set_probability_table(burglary_cpt, [burglary]) alarm_cpt=numpy.array([[0.8,0.15,0.05],[0.05,0.9,0.05]]) alarm.set_probability_table(alarm_cpt, [burglary,alarm])