-
Notifications
You must be signed in to change notification settings - Fork 10
Closed
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
ir = _infer(f, args_type) | |
binding_values, slots, tape = translate!(RawTape(), ir) |
where
Libtask.jl/src/tapedfunction.jl
Lines 44 to 48 in 95e32aa
function _infer(f, args_type) | |
# `code_typed` returns a vector: [Pair{Core.CodeInfo, DataType}] | |
ir0 = code_typed(f, Tuple{args_type...}, optimize=false)[1][1] | |
return ir0 | |
end |
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