@@ -1817,28 +1817,56 @@ end
18171817# ## ScalarNonlinearFunction
18181818
18191819function 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])
18261839end
18271840
18281841function 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
18351857end
18361858
18371859function 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])
18441872end
0 commit comments