using Stochy, Stochy.GadflySupport, Gadfly, DataStructures
@pp function rainprior()
flip(0.3)
end
rainprior (generic function with 1 method)
@pp function sprinklerprior()
flip(0.2)
end
sprinklerprior (generic function with 1 method)
@pp function wetgrassprior(rain, sprinkler)
flip(
!rain && !sprinkler ? 0.05 :
!rain && sprinkler ? 0.9 :
rain && !sprinkler ? 0.9 :
rain && sprinkler ? 0.95 : :unreachable)
end
wetgrassprior (generic function with 1 method)
@pp function model()
local
r = rainprior(),
s = sprinklerprior(),
w = wetgrassprior(r,s)
tuple(r,s,w)
end
model (generic function with 1 method)
@pp model() # Generate a sample from the model.
(false,false,false)
joint = @pp enum() do
model()
end
Discrete({(false,true,false),(true,false,false),(true,true,false),(false,true,true),(false,false,false),(true,false,true),(false,false,true),(true,true,true)}, [0.014,0.024,0.003,0.126,0.532,0.216,0.028,0.057])
bar(joint)
prior = @pp enum() do
local triple = model()
triple[1] # rain
end
Discrete({false,true}, [0.7,0.3])
bar(prior)
d1 = @pp enum() do
local triple = model()
factor(triple[3] ? 0 : -Inf) # Observe the grass is wet.
triple[1]
end
Discrete({false,true}, [0.360656,0.639344])
bar(d1)
d2 = @pp enum() do
local triple = model()
factor(triple[3] && triple[2] ? 0 : -Inf) # Also observe that the sprinkler is on.
triple[1]
end
Discrete({false,true}, [0.688525,0.311475])
bar(d2)