Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 27 additions & 25 deletions src/MOI_wrapper.jl
Original file line number Diff line number Diff line change
Expand Up @@ -159,15 +159,16 @@ function MOI.modify(
constant = -constant
end
vi = obj_change.variable
if haskey(primal_dual_map.constrained_var_idx, vi)
ci_primal, index = primal_dual_map.constrained_var_idx[vi]
ci_dual = primal_dual_map.constrained_var_dual[ci_primal]
if haskey(primal_dual_map.primal_convar_to_primal_convarcon_and_index, vi)
ci_primal, index =
primal_dual_map.primal_convar_to_primal_convarcon_and_index[vi]
ci_dual = primal_dual_map.primal_convarcon_to_dual_con[ci_primal]
if ci_dual === NO_CONSTRAINT
return
end
constant = -constant
else
ci_dual = primal_dual_map.primal_var_dual_con[vi]
ci_dual = primal_dual_map.primal_var_to_dual_con[vi]
index = 1
end
_change_constant(
Expand Down Expand Up @@ -237,11 +238,11 @@ end

# MOI.get auxiliary functions
function get_ci_dual_problem(optimizer::DualOptimizer, vi::MOI.VariableIndex)
return optimizer.dual_problem.primal_dual_map.primal_var_dual_con[vi]
return optimizer.dual_problem.primal_dual_map.primal_var_to_dual_con[vi]
end

function get_ci_dual_problem(optimizer::DualOptimizer, ci::MOI.ConstraintIndex)
return optimizer.dual_problem.primal_dual_map.primal_con_dual_con[ci]
return optimizer.dual_problem.primal_dual_map.primal_con_to_dual_convarcon[ci]
end

function get_primal_ci_constant(
Expand All @@ -255,15 +256,15 @@ function get_primal_ci_constants(
optimizer::DualOptimizer,
ci::MOI.ConstraintIndex,
)
return optimizer.dual_problem.primal_dual_map.primal_con_constants[ci]
return optimizer.dual_problem.primal_dual_map.primal_con_to_primal_constants_vec[ci]
end

function get_vi_dual_problem(optimizer::DualOptimizer, ci::MOI.ConstraintIndex)
return first(get_vis_dual_problem(optimizer, ci))
end

function get_vis_dual_problem(optimizer::DualOptimizer, ci::MOI.ConstraintIndex)
return optimizer.dual_problem.primal_dual_map.primal_con_dual_var[ci]
return optimizer.dual_problem.primal_dual_map.primal_con_to_dual_var_vec[ci]
end

function MOI.get(optimizer::DualOptimizer, ::MOI.SolverName)
Expand Down Expand Up @@ -296,7 +297,7 @@ function _get(
::MOI.ConstraintIndex{Nothing,Nothing},
) where {T}
n = MOI.output_dimension(
optimizer.dual_problem.primal_dual_map.constrained_var_zero[ci_primal],
optimizer.dual_problem.primal_dual_map.primal_convarcon_to_dual_function[ci_primal],
)
return zeros(T, n)
end
Expand Down Expand Up @@ -328,9 +329,10 @@ function MOI.get(
vi::MOI.VariableIndex,
)
primal_dual_map = optimizer.dual_problem.primal_dual_map
if haskey(primal_dual_map.constrained_var_idx, vi)
ci_primal, idx = primal_dual_map.constrained_var_idx[vi]
ci_dual = primal_dual_map.constrained_var_dual[ci_primal]
if haskey(primal_dual_map.primal_convar_to_primal_convarcon_and_index, vi)
ci_primal, idx =
primal_dual_map.primal_convar_to_primal_convarcon_and_index[vi]
ci_dual = primal_dual_map.primal_convarcon_to_dual_con[ci_primal]
return _get_at_index(
optimizer,
MOI.ConstraintDual(),
Expand All @@ -353,11 +355,11 @@ function MOI.get(
ci::MOI.ConstraintIndex{F,S},
) where {F<:MOI.AbstractScalarFunction,S<:MOI.AbstractScalarSet}
primal_dual_map = optimizer.dual_problem.primal_dual_map
if haskey(primal_dual_map.constrained_var_dual, ci)
ci_dual = primal_dual_map.constrained_var_dual[ci]
if haskey(primal_dual_map.primal_convarcon_to_dual_con, ci)
ci_dual = primal_dual_map.primal_convarcon_to_dual_con[ci]
if ci_dual === NO_CONSTRAINT
return MOI.Utilities.eval_variables(
primal_dual_map.constrained_var_zero[ci],
primal_dual_map.primal_convarcon_to_dual_function[ci],
) do vi
return MOI.get(
optimizer.dual_problem.dual_model,
Expand Down Expand Up @@ -391,11 +393,11 @@ function MOI.get(
ci::MOI.ConstraintIndex{F,S},
) where {F<:MOI.AbstractVectorFunction,S<:MOI.AbstractVectorSet}
primal_dual_map = optimizer.dual_problem.primal_dual_map
if haskey(primal_dual_map.constrained_var_dual, ci)
ci_dual = primal_dual_map.constrained_var_dual[ci]
if haskey(primal_dual_map.primal_convarcon_to_dual_con, ci)
ci_dual = primal_dual_map.primal_convarcon_to_dual_con[ci]
if ci_dual === NO_CONSTRAINT
return MOI.Utilities.eval_variables(
primal_dual_map.constrained_var_zero[ci],
primal_dual_map.primal_convarcon_to_dual_function[ci],
) do vi
return MOI.get(
optimizer.dual_problem.dual_model,
Expand All @@ -407,7 +409,7 @@ function MOI.get(
return MOI.get(
optimizer.dual_problem.dual_model,
MOI.ConstraintPrimal(),
primal_dual_map.constrained_var_dual[ci],
primal_dual_map.primal_convarcon_to_dual_con[ci],
)
else
return MOI.get.(
Expand All @@ -424,17 +426,17 @@ function MOI.get(
ci::MOI.ConstraintIndex{F,S},
) where {F<:MOI.AbstractScalarFunction,S<:MOI.AbstractScalarSet}
primal_dual_map = optimizer.dual_problem.primal_dual_map
if haskey(primal_dual_map.constrained_var_dual, ci)
if haskey(primal_dual_map.primal_convarcon_to_dual_con, ci)
return _get(
optimizer,
MOI.ConstraintDual(),
ci,
primal_dual_map.constrained_var_dual[ci],
primal_dual_map.primal_convarcon_to_dual_con[ci],
)
else
primal_ci_constant = get_primal_ci_constant(optimizer, ci)
# If it has no key then there is no dual constraint
if !haskey(primal_dual_map.primal_con_dual_con, ci)
if !haskey(primal_dual_map.primal_con_to_dual_convarcon, ci)
return -primal_ci_constant
end
ci_dual_problem = get_ci_dual_problem(optimizer, ci)
Expand All @@ -452,16 +454,16 @@ function MOI.get(
ci::MOI.ConstraintIndex{F,S},
) where {T,F<:MOI.AbstractVectorFunction,S<:MOI.AbstractVectorSet}
primal_dual_map = optimizer.dual_problem.primal_dual_map
if haskey(primal_dual_map.constrained_var_dual, ci)
if haskey(primal_dual_map.primal_convarcon_to_dual_con, ci)
return _get(
optimizer,
MOI.ConstraintDual(),
ci,
primal_dual_map.constrained_var_dual[ci],
primal_dual_map.primal_convarcon_to_dual_con[ci],
)
else
# If it has no key then there is no dual constraint
if !haskey(primal_dual_map.primal_con_dual_con, ci)
if !haskey(primal_dual_map.primal_con_to_dual_convarcon, ci)
# The number of dual variable associated with the primal constraint is the ci dimension
ci_dimension = length(get_vis_dual_problem(optimizer, ci))
return zeros(T, ci_dimension)
Expand Down
19 changes: 13 additions & 6 deletions src/constrained_variables.jl
Original file line number Diff line number Diff line change
Expand Up @@ -50,15 +50,19 @@ function _add_constrained_variables(
for ci in cis
f = MOI.get(primal_model, MOI.ConstraintFunction(), ci)
if all(
vi -> !haskey(m.constrained_var_idx, vi) && !(vi in params),
# no element of the VectorOfVariables is a constrained variable
# and not a parameter
vi ->
!haskey(m.primal_convar_to_primal_convarcon_and_index, vi) &&
!(vi in params),
f.variables,
)
for (i, vi) in enumerate(f.variables)
m.constrained_var_idx[vi] = (ci, i)
m.primal_convar_to_primal_convarcon_and_index[vi] = (ci, i)
end
# Placeholder to indicate this constraint is part of constrained variables,
# it will be replaced later with a dual constraints
m.constrained_var_dual[ci] = NO_CONSTRAINT
m.primal_convarcon_to_dual_con[ci] = NO_CONSTRAINT
end
end
return
Expand All @@ -76,15 +80,18 @@ function _add_constrained_variable(
)
for ci in cis
f = MOI.get(primal_model, MOI.ConstraintFunction(), ci)
if !haskey(m.constrained_var_idx, f) && !(f in params)
# no element of the VectorOfVariables is a constrained variable
# and not a parameter
if !haskey(m.primal_convar_to_primal_convarcon_and_index, f) &&
!(f in params)
set = MOI.get(primal_model, MOI.ConstraintSet(), ci)
if !iszero(MOI.constant(set))
continue
end
m.constrained_var_idx[f] = (ci, 1)
m.primal_convar_to_primal_convarcon_and_index[f] = (ci, 1)
# Placeholder to indicate this constraint is part of constrained variables,
# it will be replaced later with a dual constraints
m.constrained_var_dual[ci] = NO_CONSTRAINT
m.primal_convarcon_to_dual_con[ci] = NO_CONSTRAINT
end
end
return
Expand Down
Loading
Loading