Jaynes.jl (Jaynes) is a domain-specific compiler for the generative function interface of Gen.jl[1]. The modeling language is (mostly) all of Julia.

jmodel = @jaynes function model()
    z = ({:z} ~ Bernoulli(0.5))
    if z
        m1 = ({:m1} ~ Gamma(1, 1))
        m2 = ({:m2} ~ Gamma(1, 1))
    else
        m = ({:m} ~ Gamma(1, 1))
        (m1, m2) = (m, m)
    end
    {:y1} ~ Normal(m1, 0.1)
    {:y2} ~ Normal(m2, 0.1)
end

The interfaces between Julia code and modeling code is intentionally kept very minimal.

function model()
    z = trace(:z, Bernoulli(0.5))
    if z
        m1 = trace(:m1, Gamma(1, 1))
        m2 = trace(:m2, Gamma(1, 1))
    else
        m = trace(:m, Gamma(1, 1))
        (m1, m2) = (m, m)
    end
    y1 = trace(:y1, Normal(m1, 0.1))
    y2 = trace(:y2, Normal(m2, 0.1))
end
jmodel = JFunction(model)

This package is in open alpha. Expect some bumps, especially as new compiler interfaces stabilize in Julia VERSION > 1.6.


[1] Roughly, this interface describes the set of capabilities which, when implemented for a model class, allows for the construction of customizable sampling-based inference algorithms. This idea originally appeared under stochastic procedure interface in Venture.