Probability queries for simple model

I’d like both of the queries below to return 0.5.

using Turing

@model function foo(w)
    w ~ Categorical([0.5, 0.5])
    x = w + 1
end

model = foo(missing)

println(prob"w = 2 | model = model")
println(prob"x = 3 | model = model")

I get

0.5
┌ Warning: Argument w is not defined. A value of `nothing` is used.
└ @ DynamicPPL ~/.julia/packages/DynamicPPL/WBmMU/src/prob_macro.jl:172
ERROR: MethodError: no method matching +(::Nothing, ::Int64)

What’s the right way to do this? I’d also appreciate an example using Gen.jl.

prob"x = 3 | model = model"

This is not possible in Turing.jl, unfortuately. = isn’t a special statement; it’s just a standard Julia assignment, so Turing.jl doesn’t actualy touch this piece of code. Only stuff on the left-hand side of ~ can be referenced in prob.

And in general, I’d advice against using the prob macro, but instead just make use of logjoint(model, (w = 3,)), etc.

Thanks. Is there a way to achieve what I want? I tried

using Turing

@model function foo(w)
    w ~ Categorical([0.5, 0.5])
    one_ = Categorical([1.0])
    x ~ w + one_
end

model = foo(missing)

@show exp(logjoint(model, (w = 2,)))
@show exp(logjoint(model, (x = 3,)))

which gives

ERROR: type NamedTuple has no field x

The x version won’t work here either; that’s what I meant with the following part of my message:

This is not possible in Turing.jl, unfortuately. = isn’t a special statement; it’s just a standard Julia assignment, so Turing.jl doesn’t actualy touch this piece of code.

Unfortunately that’s a limitation of Turing.jl as it requires automatic marginalization of _one and w.

Sorry, I had meant to avoid all =. I had intended to write

using Turing

@model function foo(w)
    w ~ Categorical([0.5, 0.5])
    one_ ~ Categorical([1.0])
    x ~ (w + one_)
end

model = foo(missing)

@show exp(logjoint(model, (w = 2,)))
@show exp(logjoint(model, (x = 3,)))

which still gives the same error. Anyway, it sounds like this isn’t possible with Turing.jl. Is there an alternative that would allow this simple example to work as I would expect? I suppose I would like a system that can do symbolic reasoning where possible, and use a sampling / MC approach where necessary.

I suppose I would like a system that can do symbolic reasoning where possible, and use a sampling / MC approach where necessary.

Yeah that seems more in line with what you’re trying to do. There are other PPLs in Julia, some which might be able to do stuff like this but I’m not entirely sure unfortunately :confused: