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吗?如果它只是稍微快一点,我会选择更具可读性的版本。