Gadfly 根据值的顺序抛出 InexactError
InexactError thrown by Gadfly depending on order of values
我是 julia 的新手,我正在尝试在我用 Gadfly 定义的一系列值上绘制一个函数。函数本身非常简单。
function metropolis(dU, b)
if dU < 0
1
else
exp(-dU * b)
end
end
当我尝试绘制此函数时,我收到了 julia 抛出的 InexactError
。
using Gadfly
x = linspace(-5, 5, 100)
b = 1
plot(x=x, y=metropolis.(x, b), Geom.line)
准确的错误是
Stacktrace:
[1] apply_scale_typed!(::Array{Int64,1}, ::Array{Real,1}, ::Gadfly.Scale.ContinuousScale) at /home/max/.julia/v0.6/Gadfly/src/scale.jl:249
[2] apply_scale(::Gadfly.Scale.ContinuousScale, ::Array{Gadfly.Aesthetics,1}, ::Gadfly.Data, ::Vararg{Gadfly.Data,N} where N) at /home/max/.julia/v0.6/Gadfly/src/scale.jl:206
[3] apply_scales(::IterTools.Distinct{Base.ValueIterator{Dict{Symbol,Gadfly.ScaleElement}},Gadfly.ScaleElement}, ::Array{Gadfly.Aesthetics,1}, ::Gadfly.Data, ::Vararg{Gadfly.Data,N} where N) at /home/max/.julia/v0.6/Gadfly/src/scale.jl:33
[4] apply_scales(::IterTools.Distinct{Base.ValueIterator{Dict{Symbol,Gadfly.ScaleElement}},Gadfly.ScaleElement}, ::Gadfly.Data) at /home/max/.julia/v0.6/Gadfly/src/scale.jl:52
[5] render_prepare(::Gadfly.Plot) at /home/max/.julia/v0.6/Gadfly/src/Gadfly.jl:670
[6] render(::Gadfly.Plot) at /home/max/.julia/v0.6/Gadfly/src/Gadfly.jl:748
[7] show at /home/max/.julia/v0.6/Gadfly/src/Gadfly.jl:952 [inlined]
[8] limitstringmime(::MIME{Symbol("image/svg+xml")}, ::Gadfly.Plot) at /home/max/.julia/v0.6/IJulia/src/inline.jl:24
[9] display_dict(::Gadfly.Plot) at /home/max/.julia/v0.6/IJulia/src/execute_request.jl:29
[10] execute_request(::ZMQ.Socket, ::IJulia.Msg) at /home/max/.julia/v0.6/IJulia/src/execute_request.jl:182
[11] eventloop(::ZMQ.Socket) at /home/max/.julia/v0.6/IJulia/src/eventloop.jl:8
[12] (::IJulia.##14#17)() at ./task.jl:335
但奇怪的是,当我使用 -x
时它有效
plot(x=x, metropolis.(-x, b), Geom.line)
这只是颠倒了值的顺序。这种行为对我来说很奇怪。感谢您的帮助。
原因是您的函数类型不稳定 - 它的 return 值取决于参数的值,而不仅仅是它们的类型。
这是最简单(但不是最快)的修复程序,向您展示了编写函数代码的正确方法:
function metropolis(dU, b)
if dU < 0
zero(exp(-dU * b))
else
exp(-dU * b)
end
end
通常 - 确保 if-else 的两个分支 return 类型相同。
Gadfly失败的原因是这部分代码:
https://github.com/GiovineItalia/Gadfly.jl/blob/master/src/scale.jl#L194
并且可能应该修复,因为它在第一个具体类型上执行 break
,这实际上是 Array{Real}
的错误决定。
我是 julia 的新手,我正在尝试在我用 Gadfly 定义的一系列值上绘制一个函数。函数本身非常简单。
function metropolis(dU, b)
if dU < 0
1
else
exp(-dU * b)
end
end
当我尝试绘制此函数时,我收到了 julia 抛出的 InexactError
。
using Gadfly
x = linspace(-5, 5, 100)
b = 1
plot(x=x, y=metropolis.(x, b), Geom.line)
准确的错误是
Stacktrace:
[1] apply_scale_typed!(::Array{Int64,1}, ::Array{Real,1}, ::Gadfly.Scale.ContinuousScale) at /home/max/.julia/v0.6/Gadfly/src/scale.jl:249
[2] apply_scale(::Gadfly.Scale.ContinuousScale, ::Array{Gadfly.Aesthetics,1}, ::Gadfly.Data, ::Vararg{Gadfly.Data,N} where N) at /home/max/.julia/v0.6/Gadfly/src/scale.jl:206
[3] apply_scales(::IterTools.Distinct{Base.ValueIterator{Dict{Symbol,Gadfly.ScaleElement}},Gadfly.ScaleElement}, ::Array{Gadfly.Aesthetics,1}, ::Gadfly.Data, ::Vararg{Gadfly.Data,N} where N) at /home/max/.julia/v0.6/Gadfly/src/scale.jl:33
[4] apply_scales(::IterTools.Distinct{Base.ValueIterator{Dict{Symbol,Gadfly.ScaleElement}},Gadfly.ScaleElement}, ::Gadfly.Data) at /home/max/.julia/v0.6/Gadfly/src/scale.jl:52
[5] render_prepare(::Gadfly.Plot) at /home/max/.julia/v0.6/Gadfly/src/Gadfly.jl:670
[6] render(::Gadfly.Plot) at /home/max/.julia/v0.6/Gadfly/src/Gadfly.jl:748
[7] show at /home/max/.julia/v0.6/Gadfly/src/Gadfly.jl:952 [inlined]
[8] limitstringmime(::MIME{Symbol("image/svg+xml")}, ::Gadfly.Plot) at /home/max/.julia/v0.6/IJulia/src/inline.jl:24
[9] display_dict(::Gadfly.Plot) at /home/max/.julia/v0.6/IJulia/src/execute_request.jl:29
[10] execute_request(::ZMQ.Socket, ::IJulia.Msg) at /home/max/.julia/v0.6/IJulia/src/execute_request.jl:182
[11] eventloop(::ZMQ.Socket) at /home/max/.julia/v0.6/IJulia/src/eventloop.jl:8
[12] (::IJulia.##14#17)() at ./task.jl:335
但奇怪的是,当我使用 -x
时它有效
plot(x=x, metropolis.(-x, b), Geom.line)
这只是颠倒了值的顺序。这种行为对我来说很奇怪。感谢您的帮助。
原因是您的函数类型不稳定 - 它的 return 值取决于参数的值,而不仅仅是它们的类型。 这是最简单(但不是最快)的修复程序,向您展示了编写函数代码的正确方法:
function metropolis(dU, b)
if dU < 0
zero(exp(-dU * b))
else
exp(-dU * b)
end
end
通常 - 确保 if-else 的两个分支 return 类型相同。
Gadfly失败的原因是这部分代码: https://github.com/GiovineItalia/Gadfly.jl/blob/master/src/scale.jl#L194
并且可能应该修复,因为它在第一个具体类型上执行 break
,这实际上是 Array{Real}
的错误决定。