Skip to content

Commit

Permalink
[Bridges] various updates based on VectorNonlinearFunction changes (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
odow authored Aug 4, 2023
1 parent e7f3eff commit a049bfe
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 27 deletions.
35 changes: 11 additions & 24 deletions src/Bridges/Constraint/bridges/scalarize.jl
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,11 @@ function bridge_constraint(
f::MOI.AbstractVectorFunction,
set::MOI.Utilities.VectorLinearSet,
) where {T,F,S}
dimension = MOI.output_dimension(f)
constants = MOI.constant(f, T)
new_f = MOI.Utilities.scalarize(f, true)
constraints = Vector{MOI.ConstraintIndex{F,S}}(undef, dimension)
for i in 1:dimension
constraints[i] = MOI.add_constraint(model, new_f[i], S(-constants[i]))
end
return ScalarizeBridge{T,F,S}(constraints, constants)
constraints = MOI.ConstraintIndex{F,S}[
MOI.Utilities.normalize_and_add_constraint(model, fi, S(zero(T)))
for fi in MOI.Utilities.eachscalar(f)
]
return ScalarizeBridge{T,F,S}(constraints, MOI.constant(f, T))
end

function MOI.supports_constraint(
Expand Down Expand Up @@ -270,24 +267,14 @@ function MOI.set(
bridge::ScalarizeBridge{T,F,S},
func,
) where {T,F,S}
old_constants = bridge.constants
bridge.constants = MOI.constant(func, T)
new_func = MOI.Utilities.scalarize(func, true)
MOI.set.(
model,
MOI.ConstraintFunction(),
bridge.scalar_constraints,
new_func,
)
for i in eachindex(bridge.constants)
if bridge.constants[i] != old_constants[i]
MOI.set(
model,
MOI.ConstraintSet(),
bridge.scalar_constraints[i],
S(-bridge.constants[i]),
)
for (i, fi) in enumerate(MOI.Utilities.eachscalar(func))
ci = bridge.scalar_constraints[i]
if !iszero(bridge.constants[i])
fi = MOI.Utilities.operate!(-, T, fi, bridge.constants[i])
end
MOI.set(model, MOI.ConstraintFunction(), ci, fi)
MOI.set(model, MOI.ConstraintSet(), ci, S(-bridge.constants[i]))
end
return
end
Expand Down
2 changes: 1 addition & 1 deletion src/Bridges/Constraint/bridges/soc_to_psd.jl
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ of the matrix:
"""
function _soc_to_psd_matrix(
::Type{T},
f::Union{MOI.AbstractVectorFunction,AbstractVector{T}},
f::Union{MOI.AbstractVectorFunction,AbstractVector},
g::Union{MOI.AbstractScalarFunction,T},
) where {T}
F = MOI.Utilities.promote_operation(vcat, T, typeof(g), T)
Expand Down
7 changes: 5 additions & 2 deletions src/Bridges/Constraint/bridges/vectorize.jl
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,12 @@ function bridge_constraint(
if !iszero(scalar_const)
throw(MOI.ScalarFunctionConstantNotZero{T,G,typeof(set)}(scalar_const))
end
vector_f = convert(F, scalar_f)
set_const = MOI.constant(set)
MOI.Utilities.operate_output_index!(-, T, 1, vector_f, set_const)
vector_f = MOI.Utilities.operate(
vcat,
T,
MOI.Utilities.operate(-, T, scalar_f, set_const),
)
vector_constraint = MOI.add_constraint(model, vector_f, S(1))
return VectorizeBridge{T,F,S,G}(vector_constraint, set_const)
end
Expand Down

0 comments on commit a049bfe

Please sign in to comment.