Skip to content
Snippets Groups Projects
EarthquakeNet.py 3.45 KiB
Newer Older
Denis John's avatar
Denis John committed
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from  primo.core import BayesNet
from  primo.reasoning import DiscreteNode
from primo.reasoning.factorelemination import EasiestFactorElimination
Denis John PC's avatar
Denis John PC committed
from primo.reasoning.factorelemination import FactorTreeFactory
Denis John's avatar
Denis John committed
import numpy

bn = BayesNet()
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)
Denis John PC's avatar
Denis John PC committed
bn.add_node(john_calls)
bn.add_node(baum_calls)
Denis John's avatar
Denis John committed


bn.add_edge(burglary,alarm)
bn.add_edge(earthquake, alarm)
Denis John PC's avatar
Denis John PC committed
bn.add_edge(alarm, john_calls)
bn.add_edge(alarm, baum_calls)
Denis John's avatar
Denis John committed


Denis John PC's avatar
Denis John PC committed
cpt_burglary = numpy.array([0.001,0.999])
Denis John's avatar
Denis John committed
burglary.set_probability_table(cpt_burglary,[burglary])

Denis John PC's avatar
Denis John PC committed
cpt_earthquake = numpy.array([0.002,0.998])
Denis John's avatar
Denis John committed
earthquake.set_probability_table(cpt_earthquake,[earthquake])

alarm.set_probability(0.95,[(alarm,"Ringing"),(burglary,"Intruder"),(earthquake,"Shaking")])
alarm.set_probability(0.05,[(alarm,"Silent"),(burglary,"Intruder"),(earthquake,"Shaking")])
alarm.set_probability(0.29,[(alarm,"Ringing"),(burglary,"Safe"),(earthquake,"Shaking")])
alarm.set_probability(0.71,[(alarm,"Silent"),(burglary,"Safe"),(earthquake,"Shaking")])
alarm.set_probability(0.94,[(alarm,"Ringing"),(burglary,"Intruder"),(earthquake,"Calm")])
alarm.set_probability(0.06,[(alarm,"Silent"),(burglary,"Intruder"),(earthquake,"Calm")])
alarm.set_probability(0.001,[(alarm,"Ringing"),(burglary,"Safe"),(earthquake,"Calm")])
alarm.set_probability(0.999,[(alarm,"Silent"),(burglary,"Safe"),(earthquake,"Calm")])

baum_calls.set_probability(0.9,[(alarm,"Ringing"),(baum_calls,"Calling")])
baum_calls.set_probability(0.1,[(alarm,"Ringing"),(baum_calls,"Not Calling")])
baum_calls.set_probability(0.05,[(alarm,"Silent"),(baum_calls,"Calling")])
baum_calls.set_probability(0.95,[(alarm,"Silent"),(baum_calls,"Not Calling")])

john_calls.set_probability(0.7,[(alarm,"Ringing"),(john_calls,"Calling")])
john_calls.set_probability(0.3,[(alarm,"Ringing"),(john_calls,"Not Calling")])
john_calls.set_probability(0.01,[(alarm,"Silent"),(john_calls,"Calling")])
john_calls.set_probability(0.99,[(alarm,"Silent"),(john_calls,"Not Calling")])


#first Elimination:
fe = EasiestFactorElimination()
fe.set_BayesNet(bn)
Denis John PC's avatar
Denis John PC committed
#print "Alarm:   " + str(fe.calculate_PriorMarginal([alarm]))
Denis John's avatar
Denis John committed
#print "John_Calls: " + str(fe.calculate_PriorMarginal([john_calls]))
#print "Baum_Calls: " + str(fe.calculate_PriorMarginal([baum_calls]))
#print "Burglary: " + str(fe.calculate_PriorMarginal([burglary]))
#print "Earthquake: " + str(fe.calculate_PriorMarginal([earthquake]))

#print "PoE Earthquake: " + str(fe.calculate_PoE([(earthquake, "Calm")]))
#print "PoE BaumCalls is Calling: " + str(fe.calculate_PoE([(baum_calls, "Calling")]))

Denis John PC's avatar
Denis John PC committed
#print "Posterior of earthquake : " + str(fe.calculate_PosteriorMarginal([burglary],[(alarm, "Ringing"),(earthquake, "Calm")]))
Denis John PC's avatar
Denis John PC committed
factorTreeFactory = FactorTreeFactory()
factorTree = factorTreeFactory.create_random_factortree(bn)

Denis John PC's avatar
Denis John PC committed
print "AlarmFT: " + str(factorTree.calculate_marginal([alarm]))

Denis John PC's avatar
Denis John PC committed
#factorTree.draw()
Denis John PC's avatar
Denis John PC committed
#for n,nbrs in factorTree.graph.adjacency_iter():
#    for nbr,eattr in nbrs.items():
#        data=eattr['seperator']
#        #print str(data)
#        print str(n) + " -> " + str(nbr)
#        for d in data:
#            print str(d)
Denis John PC's avatar
Denis John PC committed
#factorTree.draw()