# This example is based on http://www.heatonresearch.com/
# Encog(tm) Java Examples v3.3
# http://www.heatonresearch.com/encog/
# https://github.com/encog/encog-java-examples
# http://www.apache.org/licenses/LICENSE-2.0
 
 
from org.encog.ml.bayesian import BayesianNetwork,BayesianEvent
from org.encog.ml.bayesian import EventType
from org.encog.ml.bayesian.query.enumerate import EnumerationQuery
from org.encog.ml.bayesian.query.sample import SamplingQuery
 
## build build the bayesian network structure
net=BayesianNetwork()
rained=net.createEvent("rained")
evenTemperatures=net.createEvent("temperature")
gardenGrew=net.createEvent("gardenGrew")
plentyOfCarrots=net.createEvent("carrots")
plentyOfTomatoes=net.createEvent("Tomatoes")

net.createDependency(rained, gardenGrew)
net.createDependency(evenTemperatures, gardenGrew)
net.createDependency(gardenGrew, plentyOfCarrots)
net.createDependency(gardenGrew, plentyOfTomatoes)
net.finalizeStructure()
	
# build the truth tales
rained.getTable().addLine(0.2, True)
evenTemperatures.getTable().addLine(0.5, True)
gardenGrew.getTable().addLine(0.9, True, True, True)
gardenGrew.getTable().addLine(0.7, True, False, True)
gardenGrew.getTable().addLine(0.5, True, True, False)
gardenGrew.getTable().addLine(0.1, True, False, False)
plentyOfCarrots.getTable().addLine(0.8, True, True)
plentyOfCarrots.getTable().addLine(0.2, True, False)
plentyOfTomatoes.getTable().addLine(0.6, True, True)
plentyOfTomatoes.getTable().addLine(0.1, True, False)

# validate the network
net.validate()
		
# display basic stats
print net.toString()
print "Parameter count: ", net.calculateParameterCount()
	

# query=SamplingQuery(net)	
query= EnumerationQuery(net)
query.defineEventType(rained, EventType.Evidence)
query.defineEventType(evenTemperatures, EventType.Evidence)
query.defineEventType(plentyOfCarrots, EventType.Outcome)
query.setEventValue(rained, True)
query.setEventValue(evenTemperatures, True)
query.setEventValue(plentyOfCarrots, True)
query.execute()
print query.toString()
