Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions src/Bridges/Bridges.jl
Original file line number Diff line number Diff line change
Expand Up @@ -299,11 +299,12 @@ function _runtests(
variable_start = 1.2,
constraint_start = 1.2,
eltype = Float64,
model_eltype = eltype,
print_inner_model::Bool = false,
cannot_unbridge::Bool = false,
)
# Load model and bridge it
inner = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{eltype}())
inner = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{model_eltype}())
model = _bridged_model(Bridge{eltype}, inner)
input_fn(model)
final_touch(model)
Expand All @@ -313,7 +314,8 @@ function _runtests(
print(inner)
end
Test.@testset "Test outer bridged model appears like the input" begin # COV_EXCL_LINE
test = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{eltype}())
test =
MOI.Utilities.UniversalFallback(MOI.Utilities.Model{model_eltype}())
input_fn(test)
_test_structural_identical(
test,
Expand All @@ -322,7 +324,8 @@ function _runtests(
)
end
Test.@testset "Test inner bridged model appears like the target" begin # COV_EXCL_LINE
target = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{eltype}())
target =
MOI.Utilities.UniversalFallback(MOI.Utilities.Model{model_eltype}())
output_fn(target)
_test_structural_identical(target, inner)
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,8 @@ function MOI.supports_constraint(
::Type{G},
::Type{<:MOI.AbstractSet},
) where {T,F,G<:MOI.AbstractFunction}
return !MOI.Utilities.is_complex(G) && isfinite(conversion_cost(F, G))
return MOI.Utilities.is_coefficient_type(G, T) &&
isfinite(conversion_cost(F, G))
end

function concrete_bridge_type(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,8 @@ function MOI.supports_constraint(
::Type{F},
::Type{<:Union{MOI.GreaterThan{T},MOI.LessThan{T},MOI.EqualTo{T}}},
) where {T,F<:MOI.AbstractScalarFunction}
return !MOI.Utilities.is_complex(F)
return MOI.Utilities.is_coefficient_type(F, T) &&
!MOI.Utilities.is_complex(F)
end

function MOI.Bridges.added_constrained_variable_types(
Expand Down
3 changes: 2 additions & 1 deletion src/Bridges/Constraint/bridges/NormOneBridge.jl
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,8 @@ function MOI.supports_constraint(
::Type{F},
::Type{MOI.NormOneCone},
) where {T,F<:MOI.AbstractVectorFunction}
return !MOI.Utilities.is_complex(F)
return MOI.Utilities.is_coefficient_type(F, T) &&
!MOI.Utilities.is_complex(F)
end

function MOI.Bridges.added_constrained_variable_types(::Type{<:NormOneBridge})
Expand Down
6 changes: 3 additions & 3 deletions src/Bridges/Constraint/bridges/SetDotScalingBridge.jl
Original file line number Diff line number Diff line change
Expand Up @@ -193,11 +193,11 @@ end
# Since the set type is not defined, the default `MOI.supports_constraint`
# for `SetMapBridge` does not work
function MOI.supports_constraint(
::Type{<:SetDotScalingBridge},
::Type{<:SetDotScalingBridge{T}},
F::Type{<:MOI.AbstractVectorFunction},
S::Type{<:MOI.AbstractVectorSet},
)
return !MOI.Utilities.is_complex(F) && MOI.is_set_dot_scaled(S)
) where {T}
return MOI.Utilities.is_coefficient_type(F, T) && MOI.is_set_dot_scaled(S)
end

function MOI.supports_constraint(
Expand Down
2 changes: 1 addition & 1 deletion src/Bridges/Constraint/bridges/VectorizeBridge.jl
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ function MOI.supports_constraint(
::Type{F},
::Type{<:MOI.Utilities.ScalarLinearSet{T}},
) where {T,F<:MOI.AbstractScalarFunction}
return !MOI.Utilities.is_complex(F)
return MOI.Utilities.is_coefficient_type(F, T)
end

function MOI.Bridges.added_constrained_variable_types(::Type{<:VectorizeBridge})
Expand Down
4 changes: 2 additions & 2 deletions src/Bridges/Constraint/set_map.jl
Original file line number Diff line number Diff line change
Expand Up @@ -51,15 +51,15 @@ function MOI.supports_constraint(
::Type{F},
::Type{S1},
) where {T,S1<:MOI.AbstractScalarSet,F<:MOI.AbstractScalarFunction}
return !MOI.Utilities.is_complex(F)
return MOI.Utilities.is_coefficient_type(F, T)
end

function MOI.supports_constraint(
::Type{<:MultiSetMapBridge{T,S1}},
::Type{F},
::Type{S1},
) where {T,S1<:MOI.AbstractVectorSet,F<:MOI.AbstractVectorFunction}
return !MOI.Utilities.is_complex(F)
return MOI.Utilities.is_coefficient_type(F, T)
end

function MOI.Bridges.added_constrained_variable_types(
Expand Down
34 changes: 34 additions & 0 deletions test/Bridges/Constraint/SetDotScalingBridge.jl
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,40 @@ function test_inverse_scaling_quadratic()
return
end

function test_scaling_complex()
MOI.Bridges.runtests(
MOI.Bridges.Constraint.SetDotScalingBridge,
model -> begin
x, y, z = MOI.add_variables(model, 3)
MOI.add_constraint(
model,
MOI.Utilities.vectorize([
(1.0 + 0im) * x,
(1.0 * im) * y,
(1.0 + 0im) * z,
]),
MOI.PositiveSemidefiniteConeTriangle(2),
)
end,
model -> begin
x, y, z = MOI.add_variables(model, 3)
MOI.add_constraint(
model,
MOI.Utilities.vectorize([
(1.0 + 0im) * x,
(√2 * im) * y,
(1.0 + 0im) * z,
]),
MOI.ScaledPositiveSemidefiniteConeTriangle(2),
)
end,
eltype = ComplexF64,
model_eltype = Float64,
constraint_start = 1.2 * im,
)
return
end

function test_set_dot_scaling_constraint_dual_start()
inner = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}())
model = MOI.Bridges.Constraint.SetDotScaling{Float64}(inner)
Expand Down
28 changes: 28 additions & 0 deletions test/Bridges/lazy_bridge_optimizer.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2253,6 +2253,34 @@ function test_issue_2696()
return
end

function test_wrong_coefficient()
model = MOI.instantiate(
MOI.Utilities.Model{Float64},
with_bridge_type = Float64,
)
@test !MOI.supports_constraint(
model,
MOI.VectorAffineFunction{Int},
MOI.Nonnegatives,
)
@test !MOI.supports_constraint(
model,
MOI.VectorAffineFunction{Int},
MOI.PositiveSemidefiniteConeTriangle,
)
@test !MOI.supports_constraint(
model,
MOI.ScalarAffineFunction{Int},
MOI.EqualTo{Int},
)
@test !MOI.supports_constraint(
model,
MOI.VectorQuadraticFunction{Int},
MOI.Zeros,
)
return
end

end # module

TestBridgesLazyBridgeOptimizer.runtests()
Loading