Skip to content

Commit 7513db6

Browse files
authored
Fix promote_operation for ScalarNonlinearFunction (#2179)
1 parent 207b153 commit 7513db6

File tree

4 files changed

+88
-8
lines changed

4 files changed

+88
-8
lines changed

src/Bridges/Constraint/bridges/vectorize.jl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,14 @@ function MOI.supports_constraint(
6464
return true
6565
end
6666

67+
function MOI.supports_constraint(
68+
::Type{VectorizeBridge{T}},
69+
::Type{MOI.ScalarNonlinearFunction},
70+
::Type{<:MOI.Utilities.ScalarLinearSet{T}},
71+
) where {T}
72+
return false
73+
end
74+
6775
function MOI.Bridges.added_constrained_variable_types(::Type{<:VectorizeBridge})
6876
return Tuple{Type}[]
6977
end

src/Utilities/functions.jl

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1817,28 +1817,56 @@ end
18171817
### ScalarNonlinearFunction
18181818

18191819
function promote_operation(
1820-
::typeof(-),
1821-
::Type{T},
1820+
::Union{typeof(+),typeof(-)},
1821+
::Type{<:Number},
18221822
::Type{MOI.ScalarNonlinearFunction},
1823+
)
1824+
return MOI.ScalarNonlinearFunction
1825+
end
1826+
1827+
function operate(
1828+
::typeof(-),
18231829
::Type{T},
1830+
f::MOI.ScalarNonlinearFunction,
18241831
) where {T}
1825-
return MOI.ScalarNonlinearFunction
1832+
if f.head == :- && length(f.args) == 1
1833+
# A simplification for -(-(f)) into f, but only if f is an SNF.
1834+
if f.args[1] isa MOI.ScalarNonlinearFunction
1835+
return f.args[1]
1836+
end
1837+
end
1838+
return MOI.ScalarNonlinearFunction(:-, Any[f])
18261839
end
18271840

18281841
function promote_operation(
1829-
::typeof(-),
1842+
::Union{typeof(+),typeof(-),typeof(*),typeof(/)},
18301843
::Type{T},
18311844
::Type{MOI.ScalarNonlinearFunction},
1832-
::Type{MOI.VariableIndex},
1833-
) where {T}
1845+
::Type{S},
1846+
) where {
1847+
T<:Number,
1848+
S<:Union{
1849+
T,
1850+
MOI.VariableIndex,
1851+
MOI.ScalarAffineFunction{T},
1852+
MOI.ScalarQuadraticFunction{T},
1853+
MOI.ScalarNonlinearFunction,
1854+
},
1855+
}
18341856
return MOI.ScalarNonlinearFunction
18351857
end
18361858

18371859
function operate(
1838-
op::Union{typeof(+),typeof(-)},
1860+
op::Union{typeof(+),typeof(-),typeof(*),typeof(/)},
18391861
::Type{T},
18401862
f::MOI.ScalarNonlinearFunction,
1841-
g::ScalarQuadraticLike{T},
1863+
g::Union{
1864+
T,
1865+
MOI.VariableIndex,
1866+
MOI.ScalarAffineFunction{T},
1867+
MOI.ScalarQuadraticFunction{T},
1868+
MOI.ScalarNonlinearFunction,
1869+
},
18421870
) where {T}
18431871
return MOI.ScalarNonlinearFunction(Symbol(op), Any[f, g])
18441872
end

test/Bridges/Constraint/flip_sign.jl

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,17 @@ function test_runtests()
337337
-1.5 * x <= -1.0
338338
""",
339339
)
340+
MOI.Bridges.runtests(
341+
MOI.Bridges.Constraint.GreaterToLessBridge,
342+
"""
343+
variables: x
344+
ScalarNonlinearFunction(1.5 * x) >= 1.0
345+
""",
346+
"""
347+
variables: x
348+
ScalarNonlinearFunction(-(1.5 * x)) <= -1.0
349+
""",
350+
)
340351
MOI.Bridges.runtests(
341352
MOI.Bridges.Constraint.LessToGreaterBridge,
342353
"""
@@ -359,6 +370,17 @@ function test_runtests()
359370
-1.5 * x >= -1.0
360371
""",
361372
)
373+
MOI.Bridges.runtests(
374+
MOI.Bridges.Constraint.LessToGreaterBridge,
375+
"""
376+
variables: x
377+
ScalarNonlinearFunction(1.5 * x) <= 1.0
378+
""",
379+
"""
380+
variables: x
381+
ScalarNonlinearFunction(-(1.5 * x)) >= -1.0
382+
""",
383+
)
362384
MOI.Bridges.runtests(
363385
MOI.Bridges.Constraint.NonnegToNonposBridge,
364386
"""

test/Bridges/Constraint/vectorize.jl

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,28 @@ function test_runtests()
238238
return
239239
end
240240

241+
MOI.Utilities.@model(
242+
Model2179,
243+
(),
244+
(MOI.GreaterThan, MOI.LessThan),
245+
(),
246+
(),
247+
(),
248+
(MOI.ScalarAffineFunction,),
249+
(),
250+
()
251+
)
252+
253+
function test_unsupported_ScalarNonlinearFunction()
254+
model = MOI.instantiate(Model2179{Float64}; with_bridge_type = Float64)
255+
MOI.supports_constraint(
256+
model,
257+
MOI.ScalarNonlinearFunction,
258+
MOI.GreaterThan{Float64},
259+
)
260+
return
261+
end
262+
241263
end # module
242264

243265
TestConstraintVectorize.runtests()

0 commit comments

Comments
 (0)