Skip to content

Commit e0d6bb3

Browse files
authored
Fix SetMapBridge with complex type (#2733)
1 parent 331364e commit e0d6bb3

9 files changed

+80
-12
lines changed

src/Bridges/Bridges.jl

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -300,11 +300,12 @@ function _runtests(
300300
variable_start = 1.2,
301301
constraint_start = 1.2,
302302
eltype = Float64,
303+
model_eltype = eltype,
303304
print_inner_model::Bool = false,
304305
cannot_unbridge::Bool = false,
305306
)
306307
# Load model and bridge it
307-
inner = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{eltype}())
308+
inner = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{model_eltype}())
308309
model = _bridged_model(Bridge{eltype}, inner)
309310
input_fn(model)
310311
final_touch(model)
@@ -314,7 +315,8 @@ function _runtests(
314315
print(inner)
315316
end
316317
Test.@testset "Test outer bridged model appears like the input" begin # COV_EXCL_LINE
317-
test = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{eltype}())
318+
test =
319+
MOI.Utilities.UniversalFallback(MOI.Utilities.Model{model_eltype}())
318320
input_fn(test)
319321
_test_structural_identical(
320322
test,
@@ -323,7 +325,8 @@ function _runtests(
323325
)
324326
end
325327
Test.@testset "Test inner bridged model appears like the target" begin # COV_EXCL_LINE
326-
target = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{eltype}())
328+
target =
329+
MOI.Utilities.UniversalFallback(MOI.Utilities.Model{model_eltype}())
327330
output_fn(target)
328331
_test_structural_identical(target, inner)
329332
end

src/Bridges/Constraint/bridges/AbstractFunctionConversionBridge.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,8 @@ function MOI.supports_constraint(
282282
::Type{G},
283283
::Type{<:MOI.AbstractSet},
284284
) where {T,F,G<:MOI.AbstractFunction}
285-
return !MOI.Utilities.is_complex(G) && isfinite(conversion_cost(F, G))
285+
return MOI.Utilities.is_coefficient_type(G, T) &&
286+
isfinite(conversion_cost(F, G))
286287
end
287288

288289
function concrete_bridge_type(

src/Bridges/Constraint/bridges/InequalityToComplementsBridge.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ function MOI.supports_constraint(
7171
::Type{F},
7272
::Type{<:Union{MOI.GreaterThan{T},MOI.LessThan{T},MOI.EqualTo{T}}},
7373
) where {T,F<:MOI.AbstractScalarFunction}
74-
return !MOI.Utilities.is_complex(F)
74+
return MOI.Utilities.is_coefficient_type(F, T) &&
75+
!MOI.Utilities.is_complex(F)
7576
end
7677

7778
function MOI.Bridges.added_constrained_variable_types(

src/Bridges/Constraint/bridges/NormOneBridge.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ function MOI.supports_constraint(
5656
::Type{F},
5757
::Type{MOI.NormOneCone},
5858
) where {T,F<:MOI.AbstractVectorFunction}
59-
return !MOI.Utilities.is_complex(F)
59+
return MOI.Utilities.is_coefficient_type(F, T) &&
60+
!MOI.Utilities.is_complex(F)
6061
end
6162

6263
function MOI.Bridges.added_constrained_variable_types(::Type{<:NormOneBridge})

src/Bridges/Constraint/bridges/SetDotScalingBridge.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -193,11 +193,11 @@ end
193193
# Since the set type is not defined, the default `MOI.supports_constraint`
194194
# for `SetMapBridge` does not work
195195
function MOI.supports_constraint(
196-
::Type{<:SetDotScalingBridge},
196+
::Type{<:SetDotScalingBridge{T}},
197197
F::Type{<:MOI.AbstractVectorFunction},
198198
S::Type{<:MOI.AbstractVectorSet},
199-
)
200-
return !MOI.Utilities.is_complex(F) && MOI.is_set_dot_scaled(S)
199+
) where {T}
200+
return MOI.Utilities.is_coefficient_type(F, T) && MOI.is_set_dot_scaled(S)
201201
end
202202

203203
function MOI.supports_constraint(

src/Bridges/Constraint/bridges/VectorizeBridge.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ function MOI.supports_constraint(
6464
::Type{F},
6565
::Type{<:MOI.Utilities.ScalarLinearSet{T}},
6666
) where {T,F<:MOI.AbstractScalarFunction}
67-
return !MOI.Utilities.is_complex(F)
67+
return MOI.Utilities.is_coefficient_type(F, T)
6868
end
6969

7070
function MOI.Bridges.added_constrained_variable_types(::Type{<:VectorizeBridge})

src/Bridges/Constraint/set_map.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,15 @@ function MOI.supports_constraint(
5151
::Type{F},
5252
::Type{S1},
5353
) where {T,S1<:MOI.AbstractScalarSet,F<:MOI.AbstractScalarFunction}
54-
return !MOI.Utilities.is_complex(F)
54+
return MOI.Utilities.is_coefficient_type(F, T)
5555
end
5656

5757
function MOI.supports_constraint(
5858
::Type{<:MultiSetMapBridge{T,S1}},
5959
::Type{F},
6060
::Type{S1},
6161
) where {T,S1<:MOI.AbstractVectorSet,F<:MOI.AbstractVectorFunction}
62-
return !MOI.Utilities.is_complex(F)
62+
return MOI.Utilities.is_coefficient_type(F, T)
6363
end
6464

6565
function MOI.Bridges.added_constrained_variable_types(

test/Bridges/Constraint/SetDotScalingBridge.jl

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,40 @@ function test_inverse_scaling_quadratic()
111111
return
112112
end
113113

114+
function test_scaling_complex()
115+
MOI.Bridges.runtests(
116+
MOI.Bridges.Constraint.SetDotScalingBridge,
117+
model -> begin
118+
x, y, z = MOI.add_variables(model, 3)
119+
MOI.add_constraint(
120+
model,
121+
MOI.Utilities.vectorize([
122+
(1.0 + 0im) * x,
123+
(1.0 * im) * y,
124+
(1.0 + 0im) * z,
125+
]),
126+
MOI.PositiveSemidefiniteConeTriangle(2),
127+
)
128+
end,
129+
model -> begin
130+
x, y, z = MOI.add_variables(model, 3)
131+
MOI.add_constraint(
132+
model,
133+
MOI.Utilities.vectorize([
134+
(1.0 + 0im) * x,
135+
(2 * im) * y,
136+
(1.0 + 0im) * z,
137+
]),
138+
MOI.ScaledPositiveSemidefiniteConeTriangle(2),
139+
)
140+
end,
141+
eltype = ComplexF64,
142+
model_eltype = Float64,
143+
constraint_start = 1.2 * im,
144+
)
145+
return
146+
end
147+
114148
function test_set_dot_scaling_constraint_dual_start()
115149
inner = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}())
116150
model = MOI.Bridges.Constraint.SetDotScaling{Float64}(inner)

test/Bridges/lazy_bridge_optimizer.jl

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2253,6 +2253,34 @@ function test_issue_2696()
22532253
return
22542254
end
22552255

2256+
function test_wrong_coefficient()
2257+
model = MOI.instantiate(
2258+
MOI.Utilities.Model{Float64},
2259+
with_bridge_type = Float64,
2260+
)
2261+
@test !MOI.supports_constraint(
2262+
model,
2263+
MOI.VectorAffineFunction{Int},
2264+
MOI.Nonnegatives,
2265+
)
2266+
@test !MOI.supports_constraint(
2267+
model,
2268+
MOI.VectorAffineFunction{Int},
2269+
MOI.PositiveSemidefiniteConeTriangle,
2270+
)
2271+
@test !MOI.supports_constraint(
2272+
model,
2273+
MOI.ScalarAffineFunction{Int},
2274+
MOI.EqualTo{Int},
2275+
)
2276+
@test !MOI.supports_constraint(
2277+
model,
2278+
MOI.VectorQuadraticFunction{Int},
2279+
MOI.Zeros,
2280+
)
2281+
return
2282+
end
2283+
22562284
end # module
22572285

22582286
TestBridgesLazyBridgeOptimizer.runtests()

0 commit comments

Comments
 (0)