Skip to content

Commit 68356d9

Browse files
committed
Add tests
1 parent 48bb0de commit 68356d9

File tree

4 files changed

+150
-6
lines changed

4 files changed

+150
-6
lines changed

src/Bridges/Variable/set_map.jl

Lines changed: 76 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,15 +72,45 @@ function MOI.Bridges.added_constraint_types(::Type{<:SetMapBridge})
7272
return Tuple{Type,Type}[]
7373
end
7474

75+
# Get a primal function, going from bridged-space -> user-space
76+
# => use inverse_map_function
7577
function MOI.get(
7678
model::MOI.ModelLike,
77-
attr::Union{MOI.ConstraintFunction,MOI.ConstraintPrimal},
79+
attr::Union{
80+
MOI.ConstraintFunction,
81+
MOI.ConstraintPrimal,
82+
MOI.ConstraintPrimalStart,
83+
},
7884
bridge::SetMapBridge,
7985
)
8086
f = MOI.get(model, attr, bridge.constraint)
81-
return MOI.Bridges.map_function(bridge, f)
87+
if f === nothing
88+
return nothing
89+
end
90+
return MOI.Bridges.inverse_map_function(bridge, f)
91+
end
92+
93+
# Set a primal function, going from user-space -> bridged-space
94+
# => use map_function
95+
function MOI.set(
96+
model::MOI.ModelLike,
97+
attr::MOI.ConstraintPrimalStart,
98+
bridge::SetMapBridge,
99+
value,
100+
)
101+
if value === nothing
102+
MOI.set(model, attr, bridge.constraint, value)
103+
else
104+
bridged_value = MOI.Bridges.map_function(bridge, value)
105+
MOI.set(model, attr, bridge.constraint, bridged_value)
106+
end
107+
return
82108
end
83109

110+
# Get a primal set, going from bridged-space -> user-space
111+
# => well we should use inverse_map_set, but for some reason, the convention
112+
# is reversed in Variable.SetMapBridge and Constraint.SetMapBridge
113+
# => use map_set instead
84114
function MOI.get(
85115
model::MOI.ModelLike,
86116
attr::MOI.ConstraintSet,
@@ -90,6 +120,10 @@ function MOI.get(
90120
return MOI.Bridges.map_set(bridge, set)
91121
end
92122

123+
# Set a primal set, going from user-space -> bridged-space
124+
# => well we should use map_set, but for some reason, the convention is
125+
# reversed in Variable.SetMapBridge and Constraint.SetMapBridge
126+
# => use inverse_map_set instead
93127
function MOI.set(
94128
model::MOI.ModelLike,
95129
attr::MOI.ConstraintSet,
@@ -101,15 +135,37 @@ function MOI.set(
101135
return
102136
end
103137

138+
# Get a dual function, going from bridged-space -> user-space
139+
# => use inverse_adjoint_map_function
104140
function MOI.get(
105141
model::MOI.ModelLike,
106-
attr::MOI.ConstraintDual,
142+
attr::Union{MOI.ConstraintDual,MOI.ConstraintDualStart},
107143
bridge::SetMapBridge,
108144
)
109145
value = MOI.get(model, attr, bridge.constraint)
146+
if value === nothing
147+
return nothing
148+
end
110149
return MOI.Bridges.inverse_adjoint_map_function(typeof(bridge), value)
111150
end
112151

152+
# Set a dual function, going from user-space -> bridged-space
153+
# => use adjoint_map_function
154+
function MOI.set(
155+
model::MOI.ModelLike,
156+
attr::MOI.ConstraintDualStart,
157+
bridge::SetMapBridge,
158+
value,
159+
)
160+
if value === nothing
161+
MOI.set(model, attr, bridge.constraint, value)
162+
else
163+
bridged_value = MOI.Bridges.adjoint_map_function(bridge, value)
164+
MOI.set(model, attr, bridge.constraint, bridged_value)
165+
end
166+
return
167+
end
168+
113169
function MOI.supports(
114170
model::MOI.ModelLike,
115171
attr::MOI.VariablePrimalStart,
@@ -200,6 +256,14 @@ function MOI.set(
200256
return
201257
end
202258

259+
function MOI.supports(
260+
model::MOI.ModelLike,
261+
attr::Union{MOI.ConstraintPrimalStart,MOI.ConstraintDualStart},
262+
::Type{<:SetMapBridge{T,S1}},
263+
) where {T,S1<:MOI.AbstractScalarSet}
264+
return MOI.supports(model, attr, MOI.ConstraintIndex{MOI.VariableIndex,S1})
265+
end
266+
203267
# MOI.AbstractVectorSet
204268

205269
function _add_constrained_var(model, set::MOI.AbstractVectorSet)
@@ -265,6 +329,15 @@ function MOI.set(
265329
return
266330
end
267331

332+
function MOI.supports(
333+
model::MOI.ModelLike,
334+
attr::Union{MOI.ConstraintPrimalStart,MOI.ConstraintDualStart},
335+
::Type{<:SetMapBridge{T,S1}},
336+
) where {T,S1<:MOI.AbstractVectorSet}
337+
CI = MOI.ConstraintIndex{MOI.VectorOfVariables,S1}
338+
return MOI.supports(model, attr, CI)
339+
end
340+
268341
function MOI.Bridges.bridged_function(
269342
bridge::SetMapBridge{T},
270343
i::MOI.Bridges.IndexInVector,

test/Bridges/Variable/ParameterToEqualToBridge.jl

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@ module TestVariableParameter
88

99
using Test
1010

11-
using MathOptInterface
12-
const MOI = MathOptInterface
11+
import MathOptInterface as MOI
1312

1413
function runtests()
1514
for name in names(@__MODULE__; all = true)
@@ -81,6 +80,30 @@ function test_list_of_constraint_indices()
8180
return
8281
end
8382

83+
function test_ConstraintPrimalStart()
84+
inner = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}())
85+
model = MOI.Bridges.Variable.ParameterToEqualTo{Float64}(inner)
86+
x, ci = MOI.add_constrained_variable(model, MOI.Parameter(2.0))
87+
@test MOI.supports(model, MOI.ConstraintPrimalStart(), typeof(ci))
88+
MOI.set(model, MOI.ConstraintPrimalStart(), ci, 2.0)
89+
@test MOI.get(model, MOI.ConstraintPrimalStart(), ci) == 2.0
90+
MOI.set(model, MOI.ConstraintPrimalStart(), ci, nothing)
91+
@test MOI.get(model, MOI.ConstraintPrimalStart(), ci) === nothing
92+
return
93+
end
94+
95+
function test_ConstraintDualStart()
96+
inner = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}())
97+
model = MOI.Bridges.Variable.ParameterToEqualTo{Float64}(inner)
98+
x, ci = MOI.add_constrained_variable(model, MOI.Parameter(2.0))
99+
@test MOI.supports(model, MOI.ConstraintDualStart(), typeof(ci))
100+
MOI.set(model, MOI.ConstraintDualStart(), ci, 2.0)
101+
@test MOI.get(model, MOI.ConstraintDualStart(), ci) == 2.0
102+
MOI.set(model, MOI.ConstraintDualStart(), ci, nothing)
103+
@test MOI.get(model, MOI.ConstraintDualStart(), ci) === nothing
104+
return
105+
end
106+
84107
end # module
85108

86109
TestVariableParameter.runtests()

test/Bridges/Variable/RSOCtoSOCBridge.jl

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,30 @@ function test_adjoint_map_function()
153153
return
154154
end
155155

156+
function test_ConstraintPrimalStart()
157+
inner = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}())
158+
model = MOI.Bridges.Variable.RSOCtoSOC{Float64}(inner)
159+
x, ci = MOI.add_constrained_variables(model, MOI.RotatedSecondOrderCone(3))
160+
@test MOI.supports(model, MOI.ConstraintPrimalStart(), typeof(ci))
161+
MOI.set(model, MOI.ConstraintPrimalStart(), ci, [2, 0.5, 1])
162+
@test MOI.get(model, MOI.ConstraintPrimalStart(), ci) [2, 0.5, 1]
163+
MOI.set(model, MOI.ConstraintPrimalStart(), ci, nothing)
164+
@test MOI.get(model, MOI.ConstraintPrimalStart(), ci) === nothing
165+
return
166+
end
167+
168+
function test_ConstraintDualStart()
169+
inner = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}())
170+
model = MOI.Bridges.Variable.RSOCtoSOC{Float64}(inner)
171+
x, ci = MOI.add_constrained_variables(model, MOI.RotatedSecondOrderCone(3))
172+
@test MOI.supports(model, MOI.ConstraintDualStart(), typeof(ci))
173+
MOI.set(model, MOI.ConstraintDualStart(), ci, [2, 0.5, 1])
174+
@test MOI.get(model, MOI.ConstraintDualStart(), ci) [2, 0.5, 1]
175+
MOI.set(model, MOI.ConstraintDualStart(), ci, nothing)
176+
@test MOI.get(model, MOI.ConstraintDualStart(), ci) === nothing
177+
return
178+
end
179+
156180
end # module
157181

158182
TestVariableRSOCtoSOC.runtests()

test/Bridges/Variable/SOCtoRSOCBridge.jl

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,11 +155,35 @@ function test_adjoint_map_function()
155155
inner = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}())
156156
model = MOI.Bridges.Variable.SOCtoRSOC{Float64}(inner)
157157
x, _ = MOI.add_constrained_variables(model, MOI.SecondOrderCone(3))
158-
@test MOI.Bridges.adjoint_map_function(model.map[first(x)], [2, 0.5, 1])
158+
@test MOI.Bridges.adjoint_map_function(model.map[first(x)])
159159
[2.5 / sqrt(2), +1.5 / sqrt(2), 1.0]
160160
return
161161
end
162162

163+
function test_ConstraintPrimalStart()
164+
inner = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}())
165+
model = MOI.Bridges.Variable.SOCtoRSOC{Float64}(inner)
166+
x, ci = MOI.add_constrained_variables(model, MOI.SecondOrderCone(3))
167+
@test MOI.supports(model, MOI.ConstraintPrimalStart(), typeof(ci))
168+
MOI.set(model, MOI.ConstraintPrimalStart(), ci, [2, 0.5, 1])
169+
@test MOI.get(model, MOI.ConstraintPrimalStart(), ci) [2, 0.5, 1]
170+
MOI.set(model, MOI.ConstraintPrimalStart(), ci, nothing)
171+
@test MOI.get(model, MOI.ConstraintPrimalStart(), ci) === nothing
172+
return
173+
end
174+
175+
function test_ConstraintDualStart()
176+
inner = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}())
177+
model = MOI.Bridges.Variable.SOCtoRSOC{Float64}(inner)
178+
x, ci = MOI.add_constrained_variables(model, MOI.SecondOrderCone(3))
179+
@test MOI.supports(model, MOI.ConstraintDualStart(), typeof(ci))
180+
MOI.set(model, MOI.ConstraintDualStart(), ci, [2, 0.5, 1])
181+
@test MOI.get(model, MOI.ConstraintDualStart(), ci) [2, 0.5, 1]
182+
MOI.set(model, MOI.ConstraintDualStart(), ci, nothing)
183+
@test MOI.get(model, MOI.ConstraintDualStart(), ci) === nothing
184+
return
185+
end
186+
163187
end # module
164188

165189
TestVariableSOCtoRSOC.runtests()

0 commit comments

Comments
 (0)