@@ -290,42 +290,54 @@ function PolyJuMP.bridges(
290
290
:: Type{<:MOI.AbstractVectorFunction} ,
291
291
:: Type{EmptyCone} ,
292
292
)
293
- return [Bridges. Constraint. EmptyBridge]
293
+ return [( Bridges. Constraint. EmptyBridge, Float64) ]
294
294
end
295
295
296
296
function PolyJuMP. bridges (
297
297
:: Type{<:MOI.AbstractVectorFunction} ,
298
298
:: Type{PositiveSemidefinite2x2ConeTriangle} ,
299
299
)
300
- return [Bridges. Constraint. PositiveSemidefinite2x2Bridge]
300
+ return [( Bridges. Constraint. PositiveSemidefinite2x2Bridge, Float64) ]
301
301
end
302
302
303
303
function PolyJuMP. bridges (
304
304
:: Type{<:MOI.AbstractVectorFunction} ,
305
305
:: Type{<:DiagonallyDominantConeTriangle} ,
306
306
)
307
- return [Bridges. Constraint. DiagonallyDominantBridge]
307
+ return [( Bridges. Constraint. DiagonallyDominantBridge, Float64) ]
308
308
end
309
309
310
310
function PolyJuMP. bridges (
311
311
:: Type{<:MOI.AbstractVectorFunction} ,
312
312
:: Type{<:ScaledDiagonallyDominantConeTriangle} ,
313
313
)
314
- return [Bridges. Constraint. ScaledDiagonallyDominantBridge]
314
+ return [(Bridges. Constraint. ScaledDiagonallyDominantBridge, Float64)]
315
+ end
316
+
317
+ function _bridge_coefficient_type (
318
+ :: Type{SOSPolynomialSet{S,M,MV,C}} ,
319
+ ) where {S,M,MV,C}
320
+ return _complex (Float64, matrix_cone_type (C))
315
321
end
316
322
317
323
function PolyJuMP. bridges (
318
324
:: Type{<:MOI.AbstractVectorFunction} ,
319
- :: Type{<:SOSPolynomialSet{<:AbstractAlgebraicSet}} ,
325
+ S :: Type{<:SOSPolynomialSet{<:AbstractAlgebraicSet}} ,
320
326
)
321
- return [Bridges. Constraint. SOSPolynomialBridge]
327
+ return [(
328
+ Bridges. Constraint. SOSPolynomialBridge,
329
+ _bridge_coefficient_type (S),
330
+ )]
322
331
end
323
332
324
333
function PolyJuMP. bridges (
325
334
:: Type{<:MOI.AbstractVectorFunction} ,
326
- :: Type{<:SOSPolynomialSet{<:BasicSemialgebraicSet}} ,
335
+ S :: Type{<:SOSPolynomialSet{<:BasicSemialgebraicSet}} ,
327
336
)
328
- return [Bridges. Constraint. SOSPolynomialInSemialgebraicSetBridge]
337
+ return [(
338
+ Bridges. Constraint. SOSPolynomialInSemialgebraicSetBridge,
339
+ _bridge_coefficient_type (S),
340
+ )]
329
341
end
330
342
331
343
# Syntax: `@constraint(model, a >= b, SOSCone())`
@@ -339,10 +351,17 @@ function JuMP.build_constraint(
339
351
return build_constraint (_error, f, extra; kws... )
340
352
end
341
353
354
+ _promote_coef_type (:: Type{V} , :: Type ) where {V<: JuMP.AbstractVariableRef } = V
355
+ _promote_coef_type (:: Type{F} , :: Type{T} ) where {F,T} = promote_type (F, T)
356
+
342
357
function JuMP. build_constraint (_error:: Function , p, cone:: SOSLikeCone ; kws... )
343
- coefs = PolyJuMP. non_constant_coefficients (p)
344
358
monos = MP. monomials (p)
345
359
set = JuMP. moi_set (cone, monos; kws... )
360
+ _coefs = PolyJuMP. non_constant_coefficients (p)
361
+ # If a polynomial with real coefficients is used with the Hermitian SOS
362
+ # cone, we want to promote the coefficients to complex
363
+ T = _bridge_coefficient_type (typeof (set))
364
+ coefs = convert (Vector{_promote_coef_type (eltype (_coefs), T)}, _coefs)
346
365
shape = PolyJuMP. PolynomialShape (monos)
347
366
return PolyJuMP. bridgeable (
348
367
JuMP. VectorConstraint (coefs, set, shape),
@@ -351,29 +370,6 @@ function JuMP.build_constraint(_error::Function, p, cone::SOSLikeCone; kws...)
351
370
)
352
371
end
353
372
354
- _non_constant (a:: Vector{T} ) where {T} = convert .(MOI. ScalarAffineFunction{T}, a)
355
- _non_constant (a:: Vector{<:JuMP.AbstractJuMPScalar} ) = moi_function .(a)
356
- _non_constant (a:: Vector{<:MOI.AbstractFunction} ) = a
357
-
358
- # Add constraint with `p` having coefficients being MOI functions.
359
- # This is needed as a workaround as JuMP does not support complex numbers yet.
360
- # We can remove it when https://github.com/jump-dev/JuMP.jl/pull/2391 is done
361
- # We overload `JuMP.add_constraint` to avoid clash with the name.
362
- function JuMP. add_constraint (model:: MOI.ModelLike , p, cone:: SOSLikeCone ; kws... )
363
- coefs = MOI. Utilities. vectorize (_non_constant (MP. coefficients (p)))
364
- monos = MP. monomials (p)
365
- set = JuMP. moi_set (cone, monos; kws... )
366
- return MOI. add_constraint (model, coefs, set)
367
- end
368
- function JuMP. add_constraint (model:: JuMP.Model , p, cone:: SOSLikeCone ; kws... )
369
- ci = JuMP. add_constraint (JuMP. backend (model), p, cone; kws... )
370
- return JuMP. ConstraintRef (
371
- model,
372
- ci,
373
- PolyJuMP. PolynomialShape (MP. monomials (p)),
374
- )
375
- end
376
-
377
373
struct ValueNotSupported <: Exception end
378
374
function Base. showerror (io:: IO , :: ValueNotSupported )
379
375
return print (
0 commit comments