Skip to content

Commit 8ca3f3f

Browse files
committed
WIP: add bridge for Complex NormInfinityCone
1 parent d4c64a2 commit 8ca3f3f

File tree

4 files changed

+232
-0
lines changed

4 files changed

+232
-0
lines changed

src/Bridges/Constraint/Constraint.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ include("bridges/all_different.jl")
2121
include("bridges/all_different_reif.jl")
2222
include("bridges/bin_packing.jl")
2323
include("bridges/circuit.jl")
24+
include("bridges/complex_norm_infinity.jl")
2425
include("bridges/count_at_least.jl")
2526
include("bridges/count_belongs.jl")
2627
include("bridges/count_distinct.jl")
@@ -107,6 +108,7 @@ function add_all_bridges(bridged_model, ::Type{T}) where {T}
107108
MOI.Bridges.add_bridge(bridged_model, NormOneConeToNormConeBridge{T})
108109
MOI.Bridges.add_bridge(bridged_model, SecondOrderConeToNormConeBridge{T})
109110
MOI.Bridges.add_bridge(bridged_model, NormInfinityConeToNormConeBridge{T})
111+
MOI.Bridges.add_bridge(bridged_model, ComplexNormInfinityToSecondOrderConeBridge{T})
110112
MOI.Bridges.add_bridge(bridged_model, RelativeEntropyBridge{T})
111113
MOI.Bridges.add_bridge(bridged_model, NormSpectralBridge{T})
112114
MOI.Bridges.add_bridge(bridged_model, NormNuclearBridge{T})
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
# Copyright (c) 2017: Miles Lubin and contributors
2+
# Copyright (c) 2017: Google Inc.
3+
#
4+
# Use of this source code is governed by an MIT-style license that can be found
5+
# in the LICENSE.md file or at https://opensource.org/licenses/MIT.
6+
7+
"""
8+
ComplexNormInfinityToSecondOrderConeBridge{T} <: Bridges.Constraint.AbstractBridge
9+
10+
`ComplexNormInfinityToSecondOrderConeBridge` implements the following
11+
reformulation:
12+
13+
* ``(t, x) \\in NormInfinity(1+d)`` into ``(t, real(x_i), imag(x_i)) \\in SecondOrderCone()``
14+
for all ``i``.
15+
16+
## Source node
17+
18+
`ComplexNormInfinityToSecondOrderConeBridge` supports:
19+
20+
* [`MOI.VectorAffineFunction{Complex{T}}`](@ref) in [`MOI.NormInfinityCone`](@ref)
21+
22+
## Target nodes
23+
24+
`ComplexNormInfinityToSecondOrderConeBridge` creates:
25+
26+
* [`MOI.VectorAffineFunction{T}`](@ref) in [`MOI.SecondOrderCone`](@ref)
27+
"""
28+
struct ComplexNormInfinityToSecondOrderConeBridge{T} <: AbstractBridge
29+
ci::Vector{
30+
MOI.ConstraintIndex{MOI.VectorAffineFunction{T},MOI.SecondOrderCone}
31+
}
32+
end
33+
34+
const ComplexNormInfinityToSecondOrderCone{T,OT<:MOI.ModelLike} =
35+
SingleBridgeOptimizer{ComplexNormInfinityToSecondOrderConeBridge{T},OT}
36+
37+
function bridge_constraint(
38+
::Type{ComplexNormInfinityToSecondOrderConeBridge{T}},
39+
model::MOI.ModelLike,
40+
f::MOI.VectorAffineFunction{Complex{T}},
41+
s::MOI.NormInfinityCone,
42+
) where {T}
43+
fi_s = MOI.Utilities.scalarize(f)
44+
t = real(fi_s[1])
45+
cis = MOI.ConstraintIndex{MOI.VectorAffineFunction{T},MOI.SecondOrderCone}[]
46+
for fi in fi_s[2:end]
47+
ci = MOI.add_constraint(
48+
model,
49+
MOI.Utilities.operate(vcat, T, t, real(fi), imag(fi)),
50+
MOI.SecondOrderCone(3),
51+
)
52+
push!(cis, ci)
53+
end
54+
return ComplexNormInfinityToSecondOrderConeBridge{T}(cis)
55+
end
56+
57+
function MOI.supports_constraint(
58+
::Type{<:ComplexNormInfinityToSecondOrderConeBridge{T}},
59+
::Type{MOI.VectorAffineFunction{Complex{T}}},
60+
::Type{MOI.NormInfinityCone},
61+
) where {T}
62+
return true
63+
end
64+
65+
function MOI.Bridges.added_constrained_variable_types(
66+
::Type{<:ComplexNormInfinityToSecondOrderConeBridge},
67+
)
68+
return Tuple{Type}[]
69+
end
70+
71+
function MOI.Bridges.added_constraint_types(
72+
::Type{<:ComplexNormInfinityToSecondOrderConeBridge{T}},
73+
) where {T}
74+
return Tuple{Type,Type}[(MOI.VectorAffineFunction{T}, MOI.SecondOrderCone)]
75+
end
76+
77+
function concrete_bridge_type(
78+
::Type{<:ComplexNormInfinityToSecondOrderConeBridge{T}},
79+
::Type{MOI.VectorAffineFunction{Complex{T}}},
80+
::Type{MOI.NormInfinityCone},
81+
) where {T}
82+
return ComplexNormInfinityToSecondOrderConeBridge{T}
83+
end
84+
85+
function MOI.get(
86+
::ComplexNormInfinityToSecondOrderConeBridge,
87+
::MOI.NumberOfVariables,
88+
)::Int64
89+
return 0
90+
end
91+
92+
function MOI.get(
93+
bridge::ComplexNormInfinityToSecondOrderConeBridge{T},
94+
::MOI.NumberOfConstraints{MOI.VectorAffineFunction{T},MOI.SecondOrderCone},
95+
)::Int64 where {T}
96+
return length(bridge.ci)
97+
end
98+
99+
function MOI.get(
100+
bridge::ComplexNormInfinityToSecondOrderConeBridge{T},
101+
::MOI.ListOfConstraintIndices{
102+
MOI.VectorAffineFunction{T},
103+
MOI.SecondOrderCone,
104+
},
105+
) where {T}
106+
return copy(bridge.ci)
107+
end
108+
109+
function MOI.delete(
110+
model::MOI.ModelLike,
111+
bridge::ComplexNormInfinityToSecondOrderConeBridge,
112+
)
113+
MOI.delete(model, bridge.ci)
114+
return
115+
end
116+
117+
function MOI.get(
118+
model::MOI.ModelLike,
119+
::MOI.ConstraintFunction,
120+
bridge::ComplexNormInfinityToSecondOrderConeBridge{T},
121+
) where {T}
122+
elements = MOI.ScalarAffineFunction{Complex{T}}[]
123+
for ci in bridge.ci
124+
f = MOI.get(model, MOI.ConstraintFunction(), ci)
125+
fi_s = MOI.Utilities.scalarize(f)
126+
if isempty(elements)
127+
push!(elements, fi_s[1])
128+
end
129+
fi = MOI.Utilities.operate(
130+
+,
131+
Complex{T},
132+
(one(T) + zero(T)*im) * fi_s[2],
133+
(zero(T) + one(T)*im) * fi_s[3],
134+
)
135+
push!(elements, fi)
136+
end
137+
return MOI.Utilities.operate(vcat, Complex{T}, elements...)
138+
end
139+
140+
function MOI.get(
141+
::MOI.ModelLike,
142+
::MOI.ConstraintSet,
143+
bridge::ComplexNormInfinityToSecondOrderConeBridge,
144+
)
145+
return MOI.NormInfinityCone(1 + length(bridge.ci))
146+
end

src/Bridges/Constraint/bridges/norm_infinity.jl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,14 @@ end
3131
const NormInfinity{T,OT<:MOI.ModelLike} =
3232
SingleBridgeOptimizer{NormInfinityBridge{T},OT}
3333

34+
function MOI.supports_constraint(
35+
::Type{<:NormInfinityBridge{T}},
36+
::Type{MOI.VectorAffineFunction{Complex{T}}},
37+
::Type{MOI.NormInfinityCone},
38+
) where {T}
39+
return false
40+
end
41+
3442
function concrete_bridge_type(
3543
::Type{<:NormInfinityBridge{T}},
3644
G::Type{<:MOI.AbstractVectorFunction},
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# Copyright (c) 2017: Miles Lubin and contributors
2+
# Copyright (c) 2017: Google Inc.
3+
#
4+
# Use of this source code is governed by an MIT-style license that can be found
5+
# in the LICENSE.md file or at https://opensource.org/licenses/MIT.
6+
7+
module TestConstraintComplexNormInfinityToSecondOrderCone
8+
9+
using Test
10+
11+
import MathOptInterface as MOI
12+
13+
function runtests()
14+
for name in names(@__MODULE__; all = true)
15+
if startswith("$(name)", "test_")
16+
@testset "$(name)" begin
17+
getfield(@__MODULE__, name)()
18+
end
19+
end
20+
end
21+
return
22+
end
23+
24+
function test_runtests()
25+
MOI.Bridges.runtests(
26+
MOI.Bridges.Constraint.ComplexNormInfinityToSecondOrderConeBridge,
27+
"""
28+
variables: t, x
29+
::Complex{Float64}: [t, (1 + 2im) * x + (3 + 4im)] in NormInfinityCone(2)
30+
""",
31+
"""
32+
variables: t, x
33+
::Float64: [t, 1 * x + 3, 2 * x + 4] in SecondOrderCone(3)
34+
""",
35+
)
36+
MOI.Bridges.runtests(
37+
MOI.Bridges.Constraint.ComplexNormInfinityToSecondOrderConeBridge,
38+
"""
39+
variables: t, x, y
40+
::Complex{Float64}: [2.0 * t + 3.0, x + im * y] in NormInfinityCone(2)
41+
""",
42+
"""
43+
variables: t, x, y
44+
::Float64: [2.0 * t + 3.0, 1.0 * x, 1.0 * y] in SecondOrderCone(3)
45+
""",
46+
)
47+
# MOI.Bridges.runtests(
48+
# MOI.Bridges.Constraint.ComplexNormInfinityToSecondOrderConeBridge,
49+
# """
50+
# variables: x
51+
# ::Complex{Float64}: [(0 + 2im) * x + (0 + 4im)] in Zeros(1)
52+
# """,
53+
# """
54+
# variables: x
55+
# ::Float64: [2 * x + 4] in Zeros(1)
56+
# """;
57+
# constraint_start = 0.0 + 1.2im,
58+
# )
59+
# MOI.Bridges.runtests(
60+
# MOI.Bridges.Constraint.ComplexNormInfinityToSecondOrderConeBridge,
61+
# """
62+
# variables: x
63+
# ::Complex{Float64}: [(2 + 0im) * x + (4 + 0im)] in Zeros(1)
64+
# """,
65+
# """
66+
# variables: x
67+
# ::Float64: [2 * x + 4] in Zeros(1)
68+
# """;
69+
# constraint_start = 1.2 + 0.0im,
70+
# )
71+
return
72+
end
73+
74+
end # module
75+
76+
TestConstraintComplexNormInfinityToSecondOrderCone.runtests()

0 commit comments

Comments
 (0)