Julia - 在 JuMP 中使用 JuMP 三角矩阵变量会导致类型性能不佳
Julia - Using JuMP Triangular Matrix Variables in JuMP causes bad type performance
在下一个 MWE 上,@code_warntype
returns 糟糕的性能类型,##1469::JuMP.Containers.SparseAxisArray
。
using JuMP, Gurobi
function MWE(n)
m = Model(Gurobi.Optimizer)
@variable(m, x[i=1:n, j=i+1:n], Bin)
@variable(m, y[i=1:n], Bin)
end
@codewarn_type MWE(5)
虽然 j
从 1 到 n 而不是 i+1 到 n 的改编版本非常适合 @codewarn_type
。
function MWE_codewarntype_safe(n)
m = Model(Gurobi.Optimizer)
@variable(m, x[i=1:n, j=1:n], Bin)
@variable(m, y[i=1:n], Bin)
end
@codewarn_type MWE(5)
但是,我不能让我的模型有将近两倍的变量和超过一半未使用的变量。我 运行 都用较大的实例编写代码,性能迅速下降。这是否意味着我应该忽略 @code_warntype 告诉的内容?如果是这样,那不是我第一次不得不忽略它,而且我发现特别不清楚如何理解 @codewarn_type returns 何时有意义。也许我应该问一个关于这个宏的更一般的问题,如何阅读和理解它?
嗯。我以为我们解决了这个问题。注意 x
是具体类型,所以这只是 Julia 推理的失败。这也意味着当 x
被传递给另一个函数时(例如,add_constraint
),它会很快。
编辑:打开一个问题来讨论:https://github.com/jump-dev/JuMP.jl/issues/2457
这是 MWE:
using JuMP
function MWE(n)
model = Model()
@variable(model, x[i=1:n, j=i+1:n])
end
@code_warntype MWE(5)
要问的问题是:时差是material吗?如果它只是稍微快一点,我会选择更具可读性的版本。
在下一个 MWE 上,@code_warntype
returns 糟糕的性能类型,##1469::JuMP.Containers.SparseAxisArray
。
using JuMP, Gurobi
function MWE(n)
m = Model(Gurobi.Optimizer)
@variable(m, x[i=1:n, j=i+1:n], Bin)
@variable(m, y[i=1:n], Bin)
end
@codewarn_type MWE(5)
虽然 j
从 1 到 n 而不是 i+1 到 n 的改编版本非常适合 @codewarn_type
。
function MWE_codewarntype_safe(n)
m = Model(Gurobi.Optimizer)
@variable(m, x[i=1:n, j=1:n], Bin)
@variable(m, y[i=1:n], Bin)
end
@codewarn_type MWE(5)
但是,我不能让我的模型有将近两倍的变量和超过一半未使用的变量。我 运行 都用较大的实例编写代码,性能迅速下降。这是否意味着我应该忽略 @code_warntype 告诉的内容?如果是这样,那不是我第一次不得不忽略它,而且我发现特别不清楚如何理解 @codewarn_type returns 何时有意义。也许我应该问一个关于这个宏的更一般的问题,如何阅读和理解它?
嗯。我以为我们解决了这个问题。注意 x
是具体类型,所以这只是 Julia 推理的失败。这也意味着当 x
被传递给另一个函数时(例如,add_constraint
),它会很快。
编辑:打开一个问题来讨论:https://github.com/jump-dev/JuMP.jl/issues/2457
这是 MWE:
using JuMP
function MWE(n)
model = Model()
@variable(model, x[i=1:n, j=i+1:n])
end
@code_warntype MWE(5)
要问的问题是:时差是material吗?如果它只是稍微快一点,我会选择更具可读性的版本。