Skip to content

Commit 39374a1

Browse files
authored
[Utilities] add operate for ScalarNonlinearFunction (#2215)
1 parent f05632e commit 39374a1

File tree

3 files changed

+220
-46
lines changed

3 files changed

+220
-46
lines changed

src/Utilities/functions.jl

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1292,39 +1292,6 @@ function map_terms!(
12921292
return
12931293
end
12941294

1295-
###################################### +/- #####################################
1296-
1297-
### ScalarNonlinearFunction
1298-
1299-
function operate(
1300-
::typeof(-),
1301-
::Type{T},
1302-
f::MOI.ScalarNonlinearFunction,
1303-
) where {T}
1304-
if f.head == :- && length(f.args) == 1
1305-
# A simplification for -(-(f)) into f, but only if f is an SNF.
1306-
if f.args[1] isa MOI.ScalarNonlinearFunction
1307-
return f.args[1]
1308-
end
1309-
end
1310-
return MOI.ScalarNonlinearFunction(:-, Any[f])
1311-
end
1312-
1313-
function operate(
1314-
op::Union{typeof(+),typeof(-),typeof(*),typeof(/)},
1315-
::Type{T},
1316-
f::MOI.ScalarNonlinearFunction,
1317-
g::Union{
1318-
T,
1319-
MOI.VariableIndex,
1320-
MOI.ScalarAffineFunction{T},
1321-
MOI.ScalarQuadraticFunction{T},
1322-
MOI.ScalarNonlinearFunction,
1323-
},
1324-
) where {T}
1325-
return MOI.ScalarNonlinearFunction(Symbol(op), Any[f, g])
1326-
end
1327-
13281295
### Base methods
13291296

13301297
_eltype(args::Tuple) = _eltype(first(args), Base.tail(args))

src/Utilities/operate.jl

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,45 @@ function operate(
156156
return operate!(+, T, copy(f), g)
157157
end
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+
159198
function operate(
160199
::typeof(+),
161200
::Type{T},
@@ -276,6 +315,20 @@ function operate(
276315
return operate_coefficients(-, f)
277316
end
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

281334
function operate(
@@ -352,6 +405,45 @@ function operate(
352405
return operate!(-, T, copy(f), g)
353406
end
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+
355447
function operate(
356448
::typeof(-),
357449
::Type{T},
@@ -471,6 +563,15 @@ function operate(
471563
return operate!(*, T, copy(g), f)
472564
end
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

476577
function operate(
@@ -489,6 +590,15 @@ function operate(
489590
return operate(*, T, g, f)
490591
end
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

494604
function operate(
@@ -652,6 +762,15 @@ function operate(
652762
return operate!(/, T, copy(f), g)
653763
end
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

657776
function operate(
@@ -786,6 +905,25 @@ function operate!(
786905
return MA.operate!(+, f, g)
787906
end
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+
789927
function operate!(
790928
::typeof(+),
791929
::Type{T},
@@ -992,6 +1130,19 @@ function operate!(
9921130
return f
9931131
end
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+
9951146
function operate!(
9961147
::typeof(*),
9971148
::Type{T},

0 commit comments

Comments
 (0)