如何识别 JET.JL 标记的问题?

Sol*_*lma 5 dataframe julia diagnostic-tools

我最近开始使用 JET.jl。在大多数情况下这是有帮助的。然而,有时我就是无法弄清楚为什么我的代码有问题。下面是一个例子。该功能foo非常基本并且运行良好。尽管如此,JET.jl\xe2\x80\x99s 宏仍@report_call报告错误。我不知道那是什么。使用宏调用提供的信息来识别问题的最佳方法是什么?

\n
using DataFrames, JET\ndf = DataFrame(:A => [1.0, 2.0, 3.0, 4.0])\n# 4\xc3\x971 DataFrame\n# Row \xe2\x94\x82 A       \n#     \xe2\x94\x82 Float64\n# \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n#  1 \xe2\x94\x82     1.0\n#  2 \xe2\x94\x82     2.0\n#  3 \xe2\x94\x82     3.0\n#  4 \xe2\x94\x82     4.0\n\nfunction foo(df::DataFrame)::DataFrame\n    v = 1:nrow(df)\n    df[!, :B] = v\n\n    return df\nend\n# foo (generic function with 1 method)\n\nfoo(df)\n# 4\xc3\x972 DataFrame\n# Row \xe2\x94\x82 A        B     \n#     \xe2\x94\x82 Float64  Int64\n# \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n#   1 \xe2\x94\x82     1.0      1\n#   2 \xe2\x94\x82     2.0      2\n#   3 \xe2\x94\x82     3.0      3\n#   4 \xe2\x94\x82     4.0      4\n\njulia> @report_call foo(df)\n\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90 1 possible error found \xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\n\xe2\x94\x8c @ REPL[20]:3 df[:, :B] = v\n\xe2\x94\x82\xe2\x94\x8c @ C:\\Users\\fsald\\.julia\\packages\\DataFrames\\Lrd7K\\src\\dataframe\\dataframe.jl:721 df[DataFrames.:!, col_ind] = DataFrames.copy(v)\n\xe2\x94\x82\xe2\x94\x82\xe2\x94\x8c @ C:\\Users\\fsald\\.julia\\packages\\DataFrames\\Lrd7K\\src\\dataframe\\dataframe.jl:669 DataFrames.insert_single_column!(df, v, col_ind)\n\xe2\x94\x82\xe2\x94\x82\xe2\x94\x82\xe2\x94\x8c @ C:\\Users\\fsald\\.julia\\packages\\DataFrames\\Lrd7K\\src\\dataframe\\dataframe.jl:653 DataFrames._drop_all_nonnote_metadata!(df)\n\xe2\x94\x82\xe2\x94\x82\xe2\x94\x82\xe2\x94\x82\xe2\x94\x8c @ C:\\Users\\fsald\\.julia\\packages\\DataFrames\\Lrd7K\\src\\other\\metadata.jl:759 DataFrames._drop_table_nonnote_metadata!(df)\n\xe2\x94\x82\xe2\x94\x82\xe2\x94\x82\xe2\x94\x82\xe2\x94\x82\xe2\x94\x8c @ C:\\Users\\fsald\\.julia\\packages\\DataFrames\\Lrd7K\\src\\other\\metadata.jl:752  = iterate(metadatakeys(df), getfield(_3, 2))\n\xe2\x94\x82\xe2\x94\x82\xe2\x94\x82\xe2\x94\x82\xe2\x94\x82\xe2\x94\x82\xe2\x94\x8c @ tuple.jl:68 t[i]\n\xe2\x94\x82\xe2\x94\x82\xe2\x94\x82\xe2\x94\x82\xe2\x94\x82\xe2\x94\x82\xe2\x94\x82\xe2\x94\x8c @ tuple.jl:29 Base.getfield(t, i, $(Expr(:boundscheck)))\n\xe2\x94\x82\xe2\x94\x82\xe2\x94\x82\xe2\x94\x82\xe2\x94\x82\xe2\x94\x82\xe2\x94\x82\xe2\x94\x82 invalid builtin function call\n
Run Code Online (Sandbox Code Playgroud)\n

Bog*_*ski 1

该问题似乎与 JET.jl 未正确处理具有小型类型联合的类型不稳定代码有关。这是一个例子:

\n
julia> function f()\n           x = rand(Bool) ? () : (1,)\n           for v in x\n               println(v)\n           end\n       end\nf (generic function with 1 method)\n\njulia> @report_call f()\n\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90 1 possible error found \xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\n\xe2\x94\x8c @ REPL[26]:5  = iterate(x, getfield(_2, 2))\n\xe2\x94\x82\xe2\x94\x8c @ tuple.jl:68 t[i]\n\xe2\x94\x82\xe2\x94\x82\xe2\x94\x8c @ tuple.jl:29 Base.getfield(t, i, $(Expr(:boundscheck)))\n\xe2\x94\x82\xe2\x94\x82\xe2\x94\x82 invalid builtin function call: Base.getfield(t::Tuple{}, i::Int64, $(Expr(:boundscheck)))\n\xe2\x94\x82\xe2\x94\x82\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n
Run Code Online (Sandbox Code Playgroud)\n

我在https://github.com/aviatesk/JET.jl/issues/404报告了它

\n