# it shows how to build a tree with probabilities


from bayesnet.jayes import BayesNode,BayesNet
from bayesnet.jayes.inference.jtree import JunctionTreeAlgorithm
from  java.util import *
 
net=BayesNet()
a=net.createNode("a")
a.addOutcomes("true", "false")
a.setProbabilities(0.4, 0.6)

b = net.createNode("b")
b.addOutcomes("true", "false")
b.setParents(Arrays.asList(a))
b.setProbabilities(
  0.55, 0.45, # a=true 
  0.45, 0.55) # a=false 

c=net.createNode("c")
c.addOutcomes("true", "false")
c.setParents(Arrays.asList(a))
c.setProbabilities(
   0.55, 0.45, # a=true 
   0.45, 0.55) # b=false 

d = net.createNode("d")
d.addOutcomes("true", "false")
d.setParents(Arrays.asList(a))
d.setProbabilities(
    0.55, 0.45, # a=true 
    0.45, 0.55) # b=false 

inferer=JunctionTreeAlgorithm()
inferer.setNetwork(net)

# We now have a network and want to perform inference. 
# The class used for this task is JunctionTreeAlgorithm.
evidence = HashMap()
evidence.put(a, "false")
evidence.put(b, "true")
inferer.setEvidence(evidence)
beliefsC = inferer.getBeliefs(c)
print "P(c | a=false, b=true):",beliefsC.tolist()
