Inspired by this article "Time Series Structure Discovery via Probabilistic Program Synthesis, I wanted to use a dictionary to store a tree of random variables and operations. Below model1
works; model2
fails with "VarName: Mis-formed variable name (m[:top]).var1!"
.
using Turing
mutable struct ModelNode
isleaf::Bool
op::Symbol
left::ModelNode
right::ModelNode
var1
var2
var3
end
@model modeltree1() = begin
m = Dict{Symbol, ModelNode}()
σ ~ InverseGamma(2,3)
μ ~ Normal(0,sqrt(σ))
x ~ Normal(μ, sqrt(σ))
m[:top] = ModelNode(isleaf = true)
m[:top].var1 = σ
m[:top].var2 = μ
m[:top].var3 = x
return m[:top].var3
end
@model modeltree2() = begin
m = Dict{Symbol, ModelNode}()
m[:top] = ModelNode(isleaf = true)
# σ
m[:top].var1 ~ InverseGamma(2,3)
# μ
m[:top].var2 ~ Normal(0,sqrt(m[:top].var1))
# variable
m[:top].var3 ~ Normal(m[:top].var2, sqrt(m[:top].var1))
return m[:top].var3
end
Any idea why this would be the case?
More generally, if anybody is familiar with this paper, do you think that Turing
is actually the right library to use (versus Soss
or Gen
)?
Thank.