Skip to content

Commit 8a2b663

Browse files
committed
Upate
1 parent 448102f commit 8a2b663

File tree

10 files changed

+127
-5
lines changed

10 files changed

+127
-5
lines changed

src/Bridges/Objective/bridge.jl

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,12 +95,13 @@ end
9595

9696
function MOI.set(
9797
::MOI.ModelLike,
98-
::MOI.ObjectiveSense,
98+
attr::MOI.ObjectiveSense,
9999
bridge::AbstractBridge,
100100
::MOI.OptimizationSense,
101101
)
102102
return throw(
103-
ArgumentError(
103+
MOI.SetAttributeNotAllowed(
104+
attr,
104105
"Objective bridge of type `$(typeof(bridge))` does not support " *
105106
"modifying the objective sense. As a workaround, set the sense " *
106107
"to `MOI.FEASIBILITY_SENSE` to clear the objective function and " *
@@ -111,11 +112,12 @@ end
111112

112113
function MOI.get(
113114
::MOI.ModelLike,
114-
::MOI.ObjectiveFunction,
115+
attr::MOI.ObjectiveFunction,
115116
bridge::AbstractBridge,
116117
)
117118
return throw(
118-
ArgumentError(
119+
MOI.GetAttributeNotAllowed(
120+
attr,
119121
"ObjectiveFunction bridge of type `$(typeof(bridge))` does not" *
120122
" support getting the objective function.",
121123
),

src/Bridges/bridge_optimizer.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -624,6 +624,7 @@ function MOI.delete(b::AbstractBridgeOptimizer, vis::Vector{MOI.VariableIndex})
624624
else
625625
MOI.delete(b.model, vis)
626626
end
627+
return
627628
end
628629

629630
function MOI.delete(b::AbstractBridgeOptimizer, vi::MOI.VariableIndex)

test/Bridges/Variable/HermitianToSymmetricPSDBridge.jl

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,28 @@ function test_runtests()
113113
return
114114
end
115115

116+
function test_delete()
117+
inner = MOI.Utilities.Model{Float64}()
118+
model = MOI.Bridges.Variable.HermitianToSymmetricPSD{Float64}(inner)
119+
set = MOI.HermitianPositiveSemidefiniteConeTriangle(2)
120+
x, _ = MOI.add_constrained_variables(model, set)
121+
MOI.delete(model, x)
122+
@test MOI.is_empty(inner)
123+
return
124+
end
125+
126+
function test_set_variable_primal_start()
127+
inner = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}())
128+
model = MOI.Bridges.Variable.HermitianToSymmetricPSD{Float64}(inner)
129+
set = MOI.HermitianPositiveSemidefiniteConeTriangle(2)
130+
x, _ = MOI.add_constrained_variables(model, set)
131+
MOI.set(model, MOI.VariablePrimalStart(), x[1], 1.0)
132+
@test MOI.get(model, MOI.VariablePrimalStart(), x[1]) == 1.0
133+
MOI.set(model, MOI.VariablePrimalStart(), x[1], nothing)
134+
@test MOI.get(model, MOI.VariablePrimalStart(), x[1]) === nothing
135+
return
136+
end
137+
116138
end # module
117139

118140
TestVariableHermitianToSymmetricPSD.runtests()

test/Bridges/Variable/NonposToNonnegBridge.jl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,14 @@ function test_runtests()
199199
return
200200
end
201201

202+
function test_adjoint_map_function()
203+
inner = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}())
204+
model = MOI.Bridges.Variable.NonposToNonneg{Float64}(inner)
205+
x, _ = MOI.add_constrained_variables(model, MOI.Nonpositives(1))
206+
@test MOI.Bridges.adjoint_map_function(model.map[only(x)], 1.23) == -1.23
207+
return
208+
end
209+
202210
end # module
203211

204212
TestVariableFlipSign.runtests()

test/Bridges/Variable/RSOCtoSOCBridge.jl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,15 @@ function test_runtests()
144144
return
145145
end
146146

147+
function test_adjoint_map_function()
148+
inner = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}())
149+
model = MOI.Bridges.Variable.RSOCtoSOC{Float64}(inner)
150+
x, _ = MOI.add_constrained_variables(model, MOI.RotatedSecondOrderCone(3))
151+
@test MOI.Bridges.adjoint_map_function(model.map[first(x)], [2, 0.5, 1])
152+
[2.5 / sqrt(2), +1.5 / sqrt(2), 1.0]
153+
return
154+
end
155+
147156
end # module
148157

149158
TestVariableRSOCtoSOC.runtests()

test/Bridges/Variable/SOCtoRSOCBridge.jl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,15 @@ function test_runtests()
151151
return
152152
end
153153

154+
function test_adjoint_map_function()
155+
inner = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}())
156+
model = MOI.Bridges.Variable.SOCtoRSOC{Float64}(inner)
157+
x, _ = MOI.add_constrained_variables(model, MOI.SecondOrderCone(3))
158+
@test MOI.Bridges.adjoint_map_function(model.map[first(x)], [2, 0.5, 1])
159+
[2.5 / sqrt(2), +1.5 / sqrt(2), 1.0]
160+
return
161+
end
162+
154163
end # module
155164

156165
TestVariableSOCtoRSOC.runtests()

test/Bridges/Variable/VectorizeBridge.jl

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,30 @@ function test_runtests()
287287
return
288288
end
289289

290+
function test_list_of_constraint_indices()
291+
inner = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}())
292+
model = MOI.Bridges.Variable.Vectorize{Float64}(inner)
293+
x, _ = MOI.add_constrained_variable(model, MOI.EqualTo(1.0))
294+
attr = MOI.ListOfConstraintIndices{MOI.VectorOfVariables,MOI.Zeros}()
295+
@test isempty(MOI.get(model, attr))
296+
return
297+
end
298+
299+
function test_variable_primal_ray()
300+
inner = MOI.Utilities.MockOptimizer(
301+
MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()),
302+
)
303+
model = MOI.Bridges.Variable.Vectorize{Float64}(inner)
304+
x, _ = MOI.add_constrained_variable(model, MOI.EqualTo(1.0))
305+
MOI.set(inner, MOI.PrimalStatus(), MOI.INFEASIBILITY_CERTIFICATE)
306+
y = only(MOI.get(inner, MOI.ListOfVariableIndices()))
307+
MOI.set(inner, MOI.VariablePrimal(), y, 1.23)
308+
@test MOI.get(model, MOI.VariablePrimal(), x) == 1.23
309+
MOI.set(inner, MOI.PrimalStatus(), MOI.FEASIBLE_POINT)
310+
@test MOI.get(model, MOI.VariablePrimal(), x) == 2.23
311+
return
312+
end
313+
290314
end # module
291315

292316
TestVariableVectorize.runtests()

test/Bridges/Variable/bridge.jl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,15 @@ function test_AbstractBridge()
4949
return
5050
end
5151

52+
function test_bridging_cost()
53+
model = MOI.Bridges.Variable.SingleBridgeOptimizer{DummyVariableBridge}(
54+
MOI.Utilities.Model{Float64}(),
55+
)
56+
@test MOI.Bridges.bridging_cost(model) == 1.0
57+
@test MOI.Bridges.bridging_cost(model, MOI.ZeroOne) == 1.0
58+
return
59+
end
60+
5261
end # module
5362

5463
TestVariableBridge.runtests()

test/Bridges/bridge_optimizer.jl

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1376,6 +1376,44 @@ function test_bridged_constraint_function_with_variable_bridges()
13761376
return
13771377
end
13781378

1379+
struct EmptyObjectiveBridge <: MOI.Bridges.Objective.AbstractBridge end
1380+
1381+
function test_fallback_bridge_objective()
1382+
model = MOI.Utilities.Model{Float64}()
1383+
x = MOI.add_variable(model)
1384+
@test_throws(
1385+
MOI.UnsupportedAttribute(MOI.ObjectiveFunction{MOI.VariableIndex}(x)),
1386+
MOI.Bridges.Objective.bridge_objective(EmptyObjectiveBridge, model, x),
1387+
)
1388+
return
1389+
end
1390+
1391+
function test_fallback_set_objective_sense()
1392+
model = MOI.Utilities.Model{Float64}()
1393+
bridge = EmptyObjectiveBridge()
1394+
@test_throws(
1395+
MOI.SetAttributeNotAllowed{MOI.ObjectiveSense},
1396+
MOI.set(model, MOI.ObjectiveSense(), bridge, MOI.MIN_SENSE),
1397+
)
1398+
return
1399+
end
1400+
1401+
function test_fallback_get_objective_function()
1402+
model = MOI.Utilities.Model{Float64}()
1403+
attr = MOI.ObjectiveFunction{MOI.VariableIndex}()
1404+
@test_throws(
1405+
MOI.GetAttributeNotAllowed{typeof(attr)},
1406+
MOI.get(model, attr, EmptyObjectiveBridge()),
1407+
)
1408+
return
1409+
end
1410+
1411+
function test_fallback_delete_objective_bridge()
1412+
model = MOI.Utilities.Model{Float64}()
1413+
@test_throws ArgumentError MOI.delete(model, EmptyObjectiveBridge())
1414+
return
1415+
end
1416+
13791417
end # module
13801418

13811419
TestBridgeOptimizer.runtests()

test/Bridges/debug.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ function test_print_graph_stdout()
327327
return
328328
end
329329
@test read(filename, String) ==
330-
"Bridge graph with 0 variable nodes, 0 constraint nodes and 0 objective nodes."
330+
"Bridge graph with 0 variable nodes, 0 constraint nodes and 0 objective nodes.\n"
331331
return
332332
end
333333

0 commit comments

Comments
 (0)