Я использую Julia 0.6.2 и JuMP 0.18.5 (я не могу использовать более новую версию, так как мне нужно использовать старый пакет).
Создание переменных JuMP с условиями на ведущем указателев JuMPDict вместо массива.
Например:
m = Model(solver = CplexSolver())
# type of x: JuMP.JuMPDict{JuMP.Variable,2}
@variable(m, x[i in 1:3, j in 1:3; i < j] >= 0)
# type of y: JuMP.JuMPDict{JuMP.Variable,3}
@variable(m, y[i in 1:3, j in 1:3, k in 1:3; i < j] >= 0)
Я хотел бы применить функцию f к x и y [:,:, k] для всех k в1: 3. Однако я не знаю, как определить такую универсальную функцию.
Я пытался установить тип аргумента f в JuMP.JuMPDict {JuMP.Variable, 2}:
function f(input::JuMP.JuMPDict{JuMP.Variable,2})
...
end
Я могу использовать функцию для x, но не для y:
f(x) # Works
for k in 1:3
f(y[:, :, k]) # does not work as y is not an array
end
Моей последней идеей было преобразование y в несколько JuMP.JuMPDict {JuMP.Variable, 2}:
function convertTo2D(dict3D::JuMP.JuMPDict{JuMP.Variable,3}, k::Int)
dict2D = JuMP.JuMPDict{JuMP.Variable,2}() # This line returns "ERROR: KeyError: key :model not found"
for (key, value) in keys(dict3D)
if key[3] == k
dict2D[(key[1], key[2])] = value # Not sure if it will work
end
end
return dict2D
end
Если бы это работало, я мог бы использовать:
for k in 1:3
f(convertTd2D(y, k))
end
Знаете ли вы, как я могу исправить convertTo2D или сделать то, что я хочу другим способом?