Skip to content
Merged
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
68 changes: 13 additions & 55 deletions src/dual_equality_constraints.jl
Original file line number Diff line number Diff line change
Expand Up @@ -92,16 +92,17 @@ end
function fill_scalar_affine_terms!(scalar_affine_terms::Vector{MOI.ScalarAffineTerm{T}},
primal_con_dual_var::Dict{CI, Vector{VI}},
primal_model::MOI.ModelLike, ci::CI{VAF{T}, S},
primal_vi::VI) where {T,
S <: MOI.AbstractVectorSet}
primal_vi::VI) where {T, S <: MOI.AbstractVectorSet}

moi_function = get_function(primal_model, ci)
set = get_set(primal_model, ci)
for term in moi_function.terms
if term.scalar_term.variable_index == primal_vi
dual_vi = primal_con_dual_var[ci][term.output_index] # term.output_index is the row of the VAF,
# it corresponds to the dual variable associated with
# this constraint
push_to_scalar_affine_terms!(scalar_affine_terms, MOI.coefficient(term), dual_vi)
push_to_scalar_affine_terms!(scalar_affine_terms,
set_dot(term.output_index, set, T)*MOI.coefficient(term), dual_vi)
end
end
return
Expand All @@ -110,66 +111,23 @@ end
function fill_scalar_affine_terms!(scalar_affine_terms::Vector{MOI.ScalarAffineTerm{T}},
primal_con_dual_var::Dict{CI, Vector{VI}},
primal_model::MOI.ModelLike, ci::CI{VVF, S},
primal_vi::VI) where {T,
S <: MOI.AbstractVectorSet}
primal_vi::VI) where {T, S <: MOI.AbstractVectorSet}

moi_function = get_function(primal_model, ci)
set = get_set(primal_model, ci)
for (i, variable) in enumerate(moi_function.variables)
if variable == primal_vi
dual_vi = primal_con_dual_var[ci][i]
push_to_scalar_affine_terms!(scalar_affine_terms, one(T), dual_vi)
push_to_scalar_affine_terms!(scalar_affine_terms,
set_dot(i, set, T)*one(T), dual_vi)
end
end
return
end

function fill_scalar_affine_terms!(scalar_affine_terms::Vector{MOI.ScalarAffineTerm{T}},
primal_con_dual_var::Dict{CI, Vector{VI}},
primal_model::MOI.ModelLike, ci::CI{VAF{T}, MOI.PositiveSemidefiniteConeTriangle},
primal_vi::VI) where T

moi_function = get_function(primal_model, ci)
moi_set = get_set(primal_model, ci)
k::Int = 0
for j in 1:moi_set.side_dimension
for i in 1:j
k += 1
term = moi_function.terms[k]
if term.scalar_term.variable_index == primal_vi
dual_vi = primal_con_dual_var[ci][term.output_index] # term.output_index is the row of the VAF,
# it corresponds to the dual variable associated with
# this constraint
if i == j
push_to_scalar_affine_terms!(scalar_affine_terms, one(T), dual_vi)
else
push_to_scalar_affine_terms!(scalar_affine_terms, 2*one(T), dual_vi)
end
end
end
end
return
end

function fill_scalar_affine_terms!(scalar_affine_terms::Vector{MOI.ScalarAffineTerm{T}},
primal_con_dual_var::Dict{CI, Vector{VI}},
primal_model::MOI.ModelLike, ci::CI{VVF, MOI.PositiveSemidefiniteConeTriangle},
primal_vi::VI) where T

moi_function = get_function(primal_model, ci)
moi_set = get_set(primal_model, ci)
k::Int = 0
for j in 1:moi_set.side_dimension
for i in 1:j
k += 1
if moi_function.variables[k] == primal_vi
dual_vi = primal_con_dual_var[ci][k]
if i == j
push_to_scalar_affine_terms!(scalar_affine_terms, one(T), dual_vi)
else
push_to_scalar_affine_terms!(scalar_affine_terms, 2*one(T), dual_vi)
end
end
end
end
return
# Change to spzeros once https://github.com/JuliaOpt/MathOptInterface.jl/pull/805 is merged
function set_dot(i::Int, s::MOI.AbstractVectorSet, T::DataType)
vec = zeros(T, MOI.dimension(s))
vec[i] = one(T)
return MOIU.set_dot(vec, vec, s)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should modify MOIU.set_dot to accept AbstractArray so that vec can be passed as a sparse vector

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't know if this is super simple, I can try it tomorrow

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the PR! Add a comment to change this once jump-dev/MathOptInterface.jl#805 is merged and released.

end
2 changes: 2 additions & 0 deletions src/dual_model_variables.jl
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ function _add_dual_variable(dual_model::MOI.ModelLike, primal_model::MOI.ModelLi
S <: MOI.AbstractSet}

row_dimension = get_ci_row_dimension(primal_model, ci)
# Change to add_constrained_varibales in MOI 0.9.0
# because of https://github.com/guilhermebodin/Dualization.jl/issues/9
vis = MOI.add_variables(dual_model, row_dimension) # Add as many variables as the dimension of the constraint
push!(primal_con_dual_var, ci => vis) # Add the map of the added dual variable to the relationated constraint
# Add each vi to the dictionary
Expand Down