@@ -156,6 +156,45 @@ function operate(
156156 return operate! (+ , T, copy (f), g)
157157end
158158
159+ function operate (
160+ :: typeof (+ ),
161+ :: Type{T} ,
162+ f:: MOI.ScalarNonlinearFunction ,
163+ g:: Union {
164+ T,
165+ MOI. VariableIndex,
166+ MOI. ScalarAffineFunction{T},
167+ MOI. ScalarQuadraticFunction{T},
168+ MOI. ScalarNonlinearFunction,
169+ },
170+ ) where {T}
171+ return MOI. ScalarNonlinearFunction (:+ , Any[f, g])
172+ end
173+
174+ function operate (
175+ :: typeof (+ ),
176+ :: Type{T} ,
177+ f:: Union {
178+ T,
179+ MOI. VariableIndex,
180+ MOI. ScalarAffineFunction{T},
181+ MOI. ScalarQuadraticFunction{T},
182+ MOI. ScalarNonlinearFunction,
183+ },
184+ g:: MOI.ScalarNonlinearFunction ,
185+ ) where {T}
186+ return MOI. ScalarNonlinearFunction (:+ , Any[f, g])
187+ end
188+
189+ function operate (
190+ :: typeof (+ ),
191+ :: Type{T} ,
192+ f:: MOI.ScalarNonlinearFunction ,
193+ g:: MOI.ScalarNonlinearFunction ,
194+ ) where {T}
195+ return MOI. ScalarNonlinearFunction (:+ , Any[f, g])
196+ end
197+
159198function operate (
160199 :: typeof (+ ),
161200 :: Type{T} ,
@@ -276,6 +315,20 @@ function operate(
276315 return operate_coefficients (- , f)
277316end
278317
318+ function operate (
319+ :: typeof (- ),
320+ :: Type{T} ,
321+ f:: MOI.ScalarNonlinearFunction ,
322+ ) where {T}
323+ if f. head == :- && length (f. args) == 1
324+ # A simplification for -(-(f)) into f, but only if f is an SNF.
325+ if f. args[1 ] isa MOI. ScalarNonlinearFunction
326+ return f. args[1 ]
327+ end
328+ end
329+ return MOI. ScalarNonlinearFunction (:- , Any[f])
330+ end
331+
279332# ## 2b: operate(::typeof(-), ::Type{T}, ::F1, ::F2)
280333
281334function operate (
@@ -352,6 +405,45 @@ function operate(
352405 return operate! (- , T, copy (f), g)
353406end
354407
408+ function operate (
409+ :: typeof (- ),
410+ :: Type{T} ,
411+ f:: MOI.ScalarNonlinearFunction ,
412+ g:: Union {
413+ T,
414+ MOI. VariableIndex,
415+ MOI. ScalarAffineFunction{T},
416+ MOI. ScalarQuadraticFunction{T},
417+ MOI. ScalarNonlinearFunction,
418+ },
419+ ) where {T}
420+ return MOI. ScalarNonlinearFunction (:- , Any[f, g])
421+ end
422+
423+ function operate (
424+ :: typeof (- ),
425+ :: Type{T} ,
426+ f:: Union {
427+ T,
428+ MOI. VariableIndex,
429+ MOI. ScalarAffineFunction{T},
430+ MOI. ScalarQuadraticFunction{T},
431+ MOI. ScalarNonlinearFunction,
432+ },
433+ g:: MOI.ScalarNonlinearFunction ,
434+ ) where {T}
435+ return MOI. ScalarNonlinearFunction (:- , Any[f, g])
436+ end
437+
438+ function operate (
439+ :: typeof (- ),
440+ :: Type{T} ,
441+ f:: MOI.ScalarNonlinearFunction ,
442+ g:: MOI.ScalarNonlinearFunction ,
443+ ) where {T}
444+ return MOI. ScalarNonlinearFunction (:- , Any[f, g])
445+ end
446+
355447function operate (
356448 :: typeof (- ),
357449 :: Type{T} ,
@@ -471,6 +563,15 @@ function operate(
471563 return operate! (* , T, copy (g), f)
472564end
473565
566+ function operate (
567+ :: typeof (* ),
568+ :: Type{T} ,
569+ f:: T ,
570+ g:: MOI.ScalarNonlinearFunction ,
571+ ) where {T}
572+ return MOI. ScalarNonlinearFunction (:* , Any[f, g])
573+ end
574+
474575# ## 3b: operate(::typeof(*), ::Type{T}, ::F, ::T)
475576
476577function operate (
@@ -489,6 +590,15 @@ function operate(
489590 return operate (* , T, g, f)
490591end
491592
593+ function operate (
594+ :: typeof (* ),
595+ :: Type{T} ,
596+ f:: MOI.ScalarNonlinearFunction ,
597+ g:: T ,
598+ ) where {T}
599+ return MOI. ScalarNonlinearFunction (:* , Any[f, g])
600+ end
601+
492602# ## 3c: operate(::typeof(*), ::Type{T}, ::F1, ::F2)
493603
494604function operate (
@@ -652,6 +762,15 @@ function operate(
652762 return operate! (/ , T, copy (f), g)
653763end
654764
765+ function operate (
766+ :: typeof (/ ),
767+ :: Type{T} ,
768+ f:: MOI.ScalarNonlinearFunction ,
769+ g:: T ,
770+ ) where {T}
771+ return MOI. ScalarNonlinearFunction (:/ , Any[f, g])
772+ end
773+
655774# ## 5a: operate(::typeof(vcat), ::Type{T}, ::F...)
656775
657776function operate (
@@ -786,6 +905,25 @@ function operate!(
786905 return MA. operate! (+ , f, g)
787906end
788907
908+ function operate! (
909+ :: typeof (+ ),
910+ :: Type{T} ,
911+ f:: MOI.ScalarNonlinearFunction ,
912+ g:: Union {
913+ T,
914+ MOI. VariableIndex,
915+ MOI. ScalarAffineFunction{T},
916+ MOI. ScalarQuadraticFunction{T},
917+ MOI. ScalarNonlinearFunction,
918+ },
919+ ) where {T}
920+ if f. head == :+
921+ push! (f. args, g)
922+ return f
923+ end
924+ return operate (+ , T, f, g)
925+ end
926+
789927function operate! (
790928 :: typeof (+ ),
791929 :: Type{T} ,
@@ -992,6 +1130,19 @@ function operate!(
9921130 return f
9931131end
9941132
1133+ function operate! (
1134+ :: typeof (* ),
1135+ :: Type{T} ,
1136+ f:: MOI.ScalarNonlinearFunction ,
1137+ g:: T ,
1138+ ) where {T}
1139+ if f. head == :*
1140+ push! (f. args, g)
1141+ return f
1142+ end
1143+ return operate (* , T, f, g)
1144+ end
1145+
9951146function operate! (
9961147 :: typeof (* ),
9971148 :: Type{T} ,
0 commit comments