Open
Description
As seen discussed extensively in TuringLang/Turing.jl#2001, in particular TuringLang/Turing.jl#2001 (comment), Libtask.jl makes one crucial assumption: every Instruction
contains at most 1 produce
statement.
This is because
Libtask.jl/src/tapedfunction.jl
Lines 73 to 74 in 95e32aa
where
Libtask.jl/src/tapedfunction.jl
Lines 44 to 48 in 95e32aa
which is then traversed to construct the tape.
There are many cases in which this is just not true in Turing.jl, e.g. when we use @submodel
.
Moreover, it's very unclear to me how this can be addressed without doing something very fancy to allow us to recurse into the type-inference that is performed.
EDIT: Here's an example of what I mean:
julia> using Libtask
julia> f(x) = (produce(x); produce(2x); produce(3x); return nothing)
f (generic function with 1 method)
julia> g(x) = f(x)
g (generic function with 1 method)
julia> task = Libtask.TapedTask(f, 1);
julia> consume(task), consume(task), consume(task)
(1, 2, 3)
julia> task = Libtask.TapedTask(g, 1); # tracing of nested call
julia> consume(task) # goes through all the `produce` calls before even calling the `callback` (which is `Libtask.producer`)
counter=1
tf=TapedFunction:
* .func => g
* .ir =>
------------------
CodeInfo(
1 ─ %1 = Main.f(x)::Core.Const(nothing)
└── return %1
)
------------------
ErrorException("There is a produced value which is not consumed.")Union{Ptr{Nothing}, Base.InterpreterIP}[Ptr{Nothing} @0x00007fa8d200eeeb, Ptr{Nothing} @0x00007fa8a0a30f29, Ptr{Nothing} @0x00007fa8a0a36844, Ptr{Nothing} @0x00007fa8a0a36865, Ptr{Nothing} @0x00007fa8e6b44f1d, Ptr{Nothing} @0x00007fa8a0a366e3, Ptr{Nothing} @0x00007fa8a0a36802, Ptr{Nothing} @0x00007fa8e6b44f1d, Ptr{Nothing} @0x00007fa8a0a35f25, Ptr{Nothing} @0x00007fa8a0a361dd, Ptr{Nothing} @0x00007fa8a0a36512, Ptr{Nothing} @0x00007fa8a0a3652f, Ptr{Nothing} @0x00007fa8e6b44f1d, Ptr{Nothing} @0x00007fa8e6b6656f]
ERROR: There is a produced value which is not consumed.
Stacktrace:
[1] consume(ttask::TapedTask{typeof(g), Tuple{Int64}})
@ Libtask ~/.julia/packages/Libtask/h7Kal/src/tapedtask.jl:153
[2] top-level scope
@ REPL[9]:1
Metadata
Metadata
Assignees
Labels
No labels