Skip to content

Commit b577819

Browse files
klamikeodow
andauthored
Fix param name (#197)
* fix param name * add getter for dual slack variable from quadratic objective * add test * add test * Fix formatting --------- Co-authored-by: odow <o.dowson@gmail.com>
1 parent 42b6ad3 commit b577819

5 files changed

Lines changed: 70 additions & 1 deletion

File tree

ext/DualizationJuMPExt/DualizationJuMPExt.jl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,4 +146,14 @@ function Dualization._get_dual_parameter(
146146
return JuMP.VariableRef(dual_model, moi_dual_vi)
147147
end
148148

149+
function Dualization._get_dual_slack_variable(
150+
dual_model::JuMP.Model,
151+
primal_ref::JuMP.VariableRef,
152+
)
153+
map = _get_primal_dual_map(dual_model)
154+
moi_primal_vi = JuMP.index(primal_ref)
155+
moi_dual_vi = Dualization._get_dual_slack_variable(map, moi_primal_vi)
156+
return JuMP.VariableRef(dual_model, moi_dual_vi)
157+
end
158+
149159
end # module DualizationJuMPExt

src/dual_model_variables.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ function _add_primal_parameter_vars(
142142
prefix =
143143
dual_names.parameter_name_prefix == "" ? "param_" :
144144
dual_names.parameter_name_prefix
145-
MOI.set(dual_model, MOI.VariableName(), vi, prefix * vi_name)
145+
MOI.set(dual_model, MOI.VariableName(), vis[i], prefix * vi_name)
146146
end
147147
end
148148
return

src/structures.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,10 @@ function _get_dual_parameter(m::PrimalDualMap, vi::MOI.VariableIndex)
184184
return m.primal_parameter_to_dual_parameter[vi]
185185
end
186186

187+
function _get_dual_slack_variable(m::PrimalDualMap, vi::MOI.VariableIndex)
188+
return m.primal_var_in_quad_obj_to_dual_slack_var[vi]
189+
end
190+
187191
function Base.getproperty(m::PrimalDualMap{T}, name::Symbol) where {T}
188192
if name === :constrained_var_idx
189193
error(

test/Tests/test_JuMP_dualize.jl

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,4 +128,21 @@ end
128128
con = Dualization._get_dual_constraint(dual_model, cv)
129129
@test con isa ConstraintRef
130130
end
131+
@testset "JuMP parametric quadratic" begin
132+
model = Model()
133+
@variable(model, x)
134+
@variable(model, p Parameter(2.0))
135+
@constraint(model, c, x <= p)
136+
@objective(model, Max, 3x + x^2)
137+
dual_model = dualize(model, dual_names = DualNames())
138+
param = Dualization._get_dual_parameter(dual_model, p)
139+
@test param isa VariableRef
140+
@test owner_model(param) === dual_model
141+
@test MOI.get(dual_model, MOI.VariableName(), param) == "param_p"
142+
quadslack = Dualization._get_dual_slack_variable(dual_model, x)
143+
@test quadslack isa VariableRef
144+
@test owner_model(quadslack) === dual_model
145+
@test MOI.get(dual_model, MOI.VariableName(), quadslack) ==
146+
"quadslack_x"
147+
end
131148
end

test/Tests/test_partial_dual_linear.jl

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,44 @@
9999
)
100100
end
101101

102+
@testset "lp1_test - parameter name" begin
103+
#=
104+
primal
105+
min -4x_2 - 1
106+
s.t.
107+
x_1 >= 3 :y_2
108+
x_1 + 2x_2 <= 3 :y_3
109+
ignore x_2 during dualization
110+
dual
111+
112+
s.t.
113+
y_2 >= 0
114+
y_3 <= 0
115+
y_2 + y_3 == 0 :x_1
116+
=#
117+
primal_model = lp1_test()
118+
MOI.add_constraint(
119+
primal_model,
120+
MOI.VariableIndex(2),
121+
MOI.Parameter{Float64}(0.0),
122+
)
123+
dual = Dualization.dualize(
124+
primal_model,
125+
dual_names = Dualization.DualNames("", "", "parameter_", ""),
126+
)
127+
dual_model = dual.dual_model
128+
primal_dual_map = dual.primal_dual_map
129+
primal_parameter_to_dual_parameter =
130+
primal_dual_map.primal_parameter_to_dual_parameter
131+
@test MOI.get(
132+
dual_model,
133+
MOI.VariableName(),
134+
primal_parameter_to_dual_parameter[MOI.VariableIndex(2)],
135+
) ==
136+
"parameter_" *
137+
MOI.get(primal_model, MOI.VariableName(), MOI.VariableIndex(2))
138+
end
139+
102140
@testset "lp7_test - x_1 ignored" begin
103141
#=
104142
primal

0 commit comments

Comments
 (0)