Skip to content

Latest commit

 

History

History
38 lines (32 loc) · 1.12 KB

README.md

File metadata and controls

38 lines (32 loc) · 1.12 KB

TracedRandom.jl

Allows for the optional specification of traced addresses (i.e. variable names) in calls to rand and other primitive functions in Random. Providing this information allows ordinary Julia code to be "probabilistic-programming-ready".

julia> rand(:u, Float64, 10)
0.6807722985442752

julia> randn(:z, 3)
3-element Array{Float64,1}:
 -0.39256954974212915
 -0.8048893694012202
 -1.0272306373097992

julia> randperm(:perm)
4-element Array{Int64,1}:
 1
 3
 2
 4

In addition, a call to some fn::Function can be annotated with an address by wrapping it in rand call:

julia> gaussian_mixture(μs) = randn(:z) + μs[rand(:k, 1:length(μs))]
julia> rand(:x, gaussian_mixture, [1, 10])
9.594800995267331

By default, the addresses (:x, :z, :k and :perm in the examples above) are ignored, but they can be intercepted via meta-programming (see Genify.jl) to support inference in probabilistic programming systems such as Gen. Addresses can be specified as Symbols, or as pairs from symbols to other types (Pair{Symbol,<:Any}).