JuMPDict изменение размера - PullRequest
       54

JuMPDict изменение размера

0 голосов
/ 29 октября 2019

Я использую 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 или сделать то, что я хочу другим способом?

1 Ответ

0 голосов
/ 30 октября 2019

Анонимные переменные решили мою проблему. Благодаря им я могу последовательно создавать переменные y в цикле for. Переменная y теперь является массивом «2D-словарей», а не «3D-словарей»:

y = Array{JuMP.JuMPDict{JuMP.Variable,2}, 1}([])

for k in 1:3
    yk = @variable(m, [i in 1:3, j in 1:3; i < j] >= 0)
    f(yk)
    push!(y, yk)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...