Skip to content

Commit c4fbc48

Browse files
authored
[Bridges] fix querying result attributes with result_index != 1 (#2583)
1 parent 02dc52c commit c4fbc48

File tree

6 files changed

+71
-10
lines changed

6 files changed

+71
-10
lines changed

src/Bridges/Constraint/bridges/det.jl

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -231,8 +231,6 @@ function MOI.get(
231231
attr::Union{MOI.ConstraintPrimal,MOI.ConstraintPrimalStart},
232232
bridge::LogDetBridge,
233233
)
234-
d = length(bridge.lcindex)
235-
Δ = MOI.get(model, MOI.VariablePrimal(), bridge.Δ)
236234
t =
237235
MOI.get(model, attr, bridge.tlindex) +
238236
sum(MOI.get(model, attr, ci)[1] for ci in bridge.lcindex)

src/Bridges/Constraint/bridges/norm_spec_nuc_to_psd.jl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -200,10 +200,10 @@ end
200200
# constraint is (tr(U) + tr(V), 2X) in NormNuclearCone.
201201
function MOI.get(
202202
model::MOI.ModelLike,
203-
::MOI.ConstraintDual,
203+
attr::MOI.ConstraintDual,
204204
bridge::NormSpectralBridge,
205205
)
206-
dual = MOI.get(model, MOI.ConstraintDual(), bridge.psd_index)
206+
dual = MOI.get(model, attr, bridge.psd_index)
207207
column_dim = bridge.column_dim
208208
side_dim = bridge.row_dim + column_dim
209209
t = sum(dual[MOI.Utilities.trimap(i, i)] for i in 1:side_dim)
@@ -450,11 +450,11 @@ end
450450

451451
function MOI.get(
452452
model::MOI.ModelLike,
453-
::MOI.ConstraintPrimal,
453+
attr::MOI.ConstraintPrimal,
454454
bridge::NormNuclearBridge,
455455
)
456-
ge_primal = MOI.get(model, MOI.ConstraintPrimal(), bridge.ge_index)
457-
psd_primal = MOI.get(model, MOI.ConstraintPrimal(), bridge.psd_index)
456+
ge_primal = MOI.get(model, attr, bridge.ge_index)
457+
psd_primal = MOI.get(model, attr, bridge.psd_index)
458458
side_dim = bridge.row_dim + bridge.column_dim
459459
t =
460460
ge_primal +

src/Bridges/Objective/bridges/slack.jl

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,11 @@ function MOI.get(
155155
# value of `bridge.slack`. Since `bridge.constraint` is `g - slack`, we can
156156
# get the value of the original objective by summing the value of `slack`
157157
# with the `ConstraintPrimal` of the constraint.
158-
obj_slack_constant =
159-
MOI.get(model, MOI.ConstraintPrimal(), bridge.constraint)
158+
obj_slack_constant = MOI.get(
159+
model,
160+
MOI.ConstraintPrimal(attr.result_index),
161+
bridge.constraint,
162+
)
160163
return obj_slack_constant + slack + bridge.constant
161164
end
162165

src/Bridges/Objective/bridges/vector_slack.jl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,11 @@ function MOI.get(
159159
N = attr_g.result_index
160160
attr_f = MOI.Bridges.ObjectiveFunctionValue{MOI.VectorOfVariables}(N)
161161
objective_value = MOI.get(model, attr_f)
162-
con_primal = MOI.get(model, MOI.ConstraintPrimal(), bridge.constraint)
162+
con_primal = MOI.get(
163+
model,
164+
MOI.ConstraintPrimal(attr_g.result_index),
165+
bridge.constraint,
166+
)
163167
sense = MOI.get(model, MOI.ObjectiveSense())
164168
if sense == MOI.MIN_SENSE
165169
# con_primal = objective_value - f(x)

test/Bridges/Objective/slack.jl

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,34 @@ function test_SlackBridge_ObjectiveFunctionValue()
208208
return
209209
end
210210

211+
function test_SlackBridge_ObjectiveFunctionValue_2()
212+
inner = MOI.Utilities.MockOptimizer(MOI.Utilities.Model{Float64}())
213+
model = MOI.Bridges.Objective.Slack{Float64}(inner)
214+
x = MOI.add_variable(model)
215+
MOI.add_constraint(model, x, MOI.GreaterThan(1.0))
216+
f = 1.1 * x - 1.2
217+
MOI.set(model, MOI.ObjectiveSense(), MOI.MIN_SENSE)
218+
MOI.set(model, MOI.ObjectiveFunction{typeof(f)}(), f)
219+
MOI.Utilities.set_mock_optimize!(
220+
inner,
221+
mock -> begin
222+
MOI.set(mock, MOI.ResultCount(), 2)
223+
MOI.set(mock, MOI.TerminationStatus(), MOI.OPTIMAL)
224+
MOI.set(mock, MOI.PrimalStatus(1), MOI.FEASIBLE_POINT)
225+
MOI.set(mock, MOI.PrimalStatus(2), MOI.FEASIBLE_POINT)
226+
y = MOI.get(mock, MOI.ListOfVariableIndices())
227+
MOI.set.(mock, MOI.VariablePrimal(1), y, [1.0, -0.1])
228+
MOI.set.(mock, MOI.VariablePrimal(2), y, [2.0, 1.0])
229+
end,
230+
)
231+
MOI.optimize!(model)
232+
@test MOI.get(model, MOI.ObjectiveValue(1)) -0.1
233+
@test MOI.get(model, MOI.VariablePrimal(1), x) 1.0
234+
@test MOI.get(model, MOI.ObjectiveValue(2)) 1.0
235+
@test MOI.get(model, MOI.VariablePrimal(2), x) 2.0
236+
return
237+
end
238+
211239
function test_original()
212240
mock = MOI.Utilities.MockOptimizer(MOI.Utilities.Model{Float64}())
213241
bridged_mock = MOI.Bridges.Objective.Slack{Float64}(mock)

test/Bridges/Objective/vector_slack.jl

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,34 @@ function test_modify_vector_constant_change()
166166
return
167167
end
168168

169+
function test_SlackBridge_ObjectiveFunctionValue_2()
170+
inner = MOI.Utilities.MockOptimizer(MOI.Utilities.Model{Float64}())
171+
model = MOI.Bridges.Objective.VectorSlack{Float64}(inner)
172+
x = MOI.add_variable(model)
173+
MOI.add_constraint(model, x, MOI.GreaterThan(1.0))
174+
f = MOI.Utilities.operate(vcat, Float64, 1.1 * x - 1.2)
175+
MOI.set(model, MOI.ObjectiveSense(), MOI.MIN_SENSE)
176+
MOI.set(model, MOI.ObjectiveFunction{typeof(f)}(), f)
177+
MOI.Utilities.set_mock_optimize!(
178+
inner,
179+
mock -> begin
180+
MOI.set(mock, MOI.ResultCount(), 2)
181+
MOI.set(mock, MOI.TerminationStatus(), MOI.OPTIMAL)
182+
MOI.set(mock, MOI.PrimalStatus(1), MOI.FEASIBLE_POINT)
183+
MOI.set(mock, MOI.PrimalStatus(2), MOI.FEASIBLE_POINT)
184+
y = MOI.get(mock, MOI.ListOfVariableIndices())
185+
MOI.set.(mock, MOI.VariablePrimal(1), y, [1.0, -0.1])
186+
MOI.set.(mock, MOI.VariablePrimal(2), y, [2.0, 1.0])
187+
end,
188+
)
189+
MOI.optimize!(model)
190+
@test MOI.get(model, MOI.ObjectiveValue(1)) [-0.1]
191+
@test MOI.get(model, MOI.VariablePrimal(1), x) 1.0
192+
@test MOI.get(model, MOI.ObjectiveValue(2)) [1.0]
193+
@test MOI.get(model, MOI.VariablePrimal(2), x) 2.0
194+
return
195+
end
196+
169197
end # module
170198

171199
TestObjectiveVectorSlack.runtests()

0 commit comments

Comments
 (0)