Skip to content

Commit 0435980

Browse files
committed
Update
1 parent 1e4e207 commit 0435980

File tree

1 file changed

+69
-130
lines changed

1 file changed

+69
-130
lines changed

test/Nonlinear/SymbolicAD.jl

Lines changed: 69 additions & 130 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ function runtests()
2424
end
2525

2626
op(head, args...) = MOI.ScalarNonlinearFunction(head, Any[args...])
27+
op(head, arg::Vector{Any}) = MOI.ScalarNonlinearFunction(head, arg)
2728

2829
function test_derivative()
2930
x, y, z = MOI.VariableIndex.(1:3)
@@ -142,7 +143,7 @@ end
142143

143144
function test_derivative_error()
144145
x = MOI.VariableIndex(1)
145-
f = MOI.ScalarNonlinearFunction(:foo, Any[x, x])
146+
f = op(:foo, x, x)
146147
@test_throws(MOI.UnsupportedNonlinearOperator, SymbolicAD.derivative(f, x),)
147148
return
148149
end
@@ -173,19 +174,10 @@ function test_variable()
173174
1.0*x*y=>[x, y],
174175
1.0*y*x=>[x, y],
175176
# ::NonlinearExpr
176-
MOI.ScalarNonlinearFunction(:sin, Any[x])=>[x],
177-
MOI.ScalarNonlinearFunction(:sin, Any[1.0*x+y])=>[x, y],
178-
MOI.ScalarNonlinearFunction(
179-
:*,
180-
Any[
181-
MOI.ScalarNonlinearFunction(:sin, Any[x]),
182-
MOI.ScalarNonlinearFunction(:sin, Any[y]),
183-
],
184-
)=>[x, y],
185-
MOI.ScalarNonlinearFunction(
186-
:^,
187-
Any[MOI.ScalarNonlinearFunction(:log, Any[x]), 2],
188-
)=>[x],
177+
op(:sin, x)=>[x],
178+
op(:sin, 1.0 * x + y)=>[x, y],
179+
op(:*, op(:sin, x), op(:sin, y))=>[x, y],
180+
op(:^, op(:log, x), 2)=>[x],
189181
]
190182
@test SymbolicAD.variables(f) == fp
191183
end
@@ -233,13 +225,13 @@ end
233225
function test_simplify_ScalarNonlinearFunction()
234226
x = MOI.VariableIndex(1)
235227
# sin(3 * (x^0)) -> sin(3)
236-
f = MOI.ScalarNonlinearFunction(:^, Any[x, 0])
237-
g = MOI.ScalarNonlinearFunction(:*, Any[3, f])
238-
h = MOI.ScalarNonlinearFunction(:sin, Any[g])
228+
f = op(:^, x, 0)
229+
g = op(:*, 3, f)
230+
h = op(:sin, g)
239231
@test SymbolicAD.simplify(h) sin(3)
240232
# sin(log(x)) -> sin(log(x))
241-
f = MOI.ScalarNonlinearFunction(:log, Any[x])
242-
g = MOI.ScalarNonlinearFunction(:sin, Any[f])
233+
f = op(:log, x)
234+
g = op(:sin, f)
243235
@test SymbolicAD.simplify(g) g
244236
return
245237
end
@@ -248,50 +240,31 @@ end
248240
function test_simplify_ScalarNonlinearFunction_multiplication()
249241
x, y, z = MOI.VariableIndex.(1:3)
250242
# *(x, *(y, z)) -> *(x, y, z)
251-
@test (
252-
SymbolicAD.simplify(
253-
MOI.ScalarNonlinearFunction(
254-
:*,
255-
Any[x, MOI.ScalarNonlinearFunction(:*, Any[y, z])],
256-
),
257-
),
258-
MOI.ScalarNonlinearFunction(:*, Any[x, y, z]),
259-
)
243+
@test (SymbolicAD.simplify(op(:*, x, op(:*, y, z))), op(:*, x, y, z))
260244
# *(x, *(y, z, *(x, 2))) -> *(x, y, z, x, 2)
261-
f = MOI.ScalarNonlinearFunction(:*, Any[x, 2])
245+
f = op(:*, x, 2)
262246
@test (
263-
SymbolicAD.simplify(
264-
MOI.ScalarNonlinearFunction(
265-
:*,
266-
Any[x, MOI.ScalarNonlinearFunction(:*, Any[y, z, f])],
267-
),
268-
),
269-
MOI.ScalarNonlinearFunction(:*, Any[x, y, z, x, 2]),
247+
SymbolicAD.simplify(op(:*, x, op(:*, y, z, f))),
248+
op(:*, x, y, z, x, 2),
270249
)
271250
# *(x, 3, 2) -> *(x, 6)
272-
ret = MOI.ScalarNonlinearFunction(:*, Any[x, 3, 2])
273-
@test (
274-
SymbolicAD.simplify(ret),
275-
MOI.ScalarNonlinearFunction(:*, Any[x, 6]),
276-
)
251+
ret = op(:*, x, 3, 2)
252+
@test (SymbolicAD.simplify(ret), op(:*, x, 6))
277253
# *(3, x, 2) -> *(6, x)
278-
ret = MOI.ScalarNonlinearFunction(:*, Any[3, x, 2])
279-
@test (
280-
SymbolicAD.simplify(ret),
281-
MOI.ScalarNonlinearFunction(:*, Any[6, x]),
282-
)
254+
ret = op(:*, 3, x, 2)
255+
@test (SymbolicAD.simplify(ret), op(:*, 6, x))
283256
# *(x, 1) -> x
284-
ret = MOI.ScalarNonlinearFunction(:*, Any[x, 1])
257+
ret = op(:*, x, 1)
285258
@test (SymbolicAD.simplify(ret), x)
286259
# *(x, 0) -> 0
287-
ret = MOI.ScalarNonlinearFunction(:*, Any[x, 0])
260+
ret = op(:*, x, 0)
288261
@test (SymbolicAD.simplify(ret), 0)
289262
# *(-(x, x), 1) -> 0
290-
f = MOI.ScalarNonlinearFunction(:-, Any[x, x])
291-
ret = MOI.ScalarNonlinearFunction(:*, Any[f, 1])
263+
f = op(:-, x, x)
264+
ret = op(:*, f, 1)
292265
@test (SymbolicAD.simplify(ret), 0)
293266
# *() -> true
294-
ret = MOI.ScalarNonlinearFunction(:*, Any[])
267+
ret = op(:*, Any[])
295268
@test (SymbolicAD.simplify(ret), 1)
296269
return
297270
end
@@ -300,81 +273,53 @@ end
300273
function test_simplify_ScalarNonlinearFunction_addition()
301274
x, y, z = MOI.VariableIndex.(1:3)
302275
# (+(x, +(y, z)))=>(+(x, y, z)),
303-
@test (
304-
SymbolicAD.simplify(
305-
MOI.ScalarNonlinearFunction(
306-
:+,
307-
Any[x, MOI.ScalarNonlinearFunction(:+, Any[y, z])],
308-
),
309-
),
310-
MOI.ScalarNonlinearFunction(:+, Any[x, y, z]),
311-
)
276+
@test (SymbolicAD.simplify(op(:+, x, op(:+, y, z))), op(:+, x, y, z))
312277
# +(sin(x), -cos(x))=>sin(x)-cos(x),
313-
sinx = MOI.ScalarNonlinearFunction(:sin, Any[x])
314-
cosx = MOI.ScalarNonlinearFunction(:cos, Any[x])
315-
@test (
316-
SymbolicAD.simplify(
317-
MOI.ScalarNonlinearFunction(
318-
:+,
319-
Any[sinx, MOI.ScalarNonlinearFunction(:-, Any[cosx])],
320-
),
321-
),
322-
MOI.ScalarNonlinearFunction(:-, Any[sinx, cosx]),
323-
)
278+
sinx = op(:sin, x)
279+
cosx = op(:cos, x)
280+
@test (SymbolicAD.simplify(op(:+, sinx, op(:-, cosx))), op(:-, sinx, cosx))
324281
# (+(x, 1, 2))=>(+(x, 3)),
325-
ret = MOI.ScalarNonlinearFunction(:+, Any[x, 1, 2])
326-
@test (
327-
SymbolicAD.simplify(ret),
328-
MOI.ScalarNonlinearFunction(:+, Any[x, 3]),
329-
)
282+
ret = op(:+, x, 1, 2)
283+
@test (SymbolicAD.simplify(ret), op(:+, x, 3))
330284
# (+(1, x, 2))=>(+(3, x)),
331-
ret = MOI.ScalarNonlinearFunction(:+, Any[1, x, 2])
332-
@test (
333-
SymbolicAD.simplify(ret),
334-
MOI.ScalarNonlinearFunction(:+, Any[3, x]),
335-
)
285+
ret = op(:+, 1, x, 2)
286+
@test (SymbolicAD.simplify(ret), op(:+, 3, x))
336287
# +(x, 0) -> x
337-
ret = MOI.ScalarNonlinearFunction(:+, Any[x, 0])
288+
ret = op(:+, x, 0)
338289
@test SymbolicAD.simplify(ret) x
339290
# +(0, x) -> x
340-
ret = MOI.ScalarNonlinearFunction(:+, Any[0, x])
291+
ret = op(:+, 0, x)
341292
@test SymbolicAD.simplify(ret) x
342293
# +(-(x, x), 0) -> 0
343-
f = MOI.ScalarNonlinearFunction(
344-
:+,
345-
Any[MOI.ScalarNonlinearFunction(:-, Any[x, x]), 0],
346-
)
294+
f = op(:+, op(:-, x, x), 0)
347295
@test SymbolicAD.simplify(f) === false
348296
return
349297
end
350298

351299
# simplify(::Val{:-}, f::MOI.ScalarNonlinearFunction)
352300
function test_simplify_ScalarNonlinearFunction_subtraction()
353301
x, y = MOI.VariableIndex(1), MOI.VariableIndex(2)
354-
f = MOI.ScalarNonlinearFunction(:-, Any[x])
302+
f = op(:-, x)
355303
# -x -> -x
356304
@test SymbolicAD.simplify(f) f
357305
# -(-(x)) -> x
358-
ret = MOI.ScalarNonlinearFunction(:-, Any[f])
306+
ret = op(:-, f)
359307
@test SymbolicAD.simplify(ret) x
360308
# -(x, 0) -> x
361-
ret = MOI.ScalarNonlinearFunction(:-, Any[x, 0])
309+
ret = op(:-, x, 0)
362310
@test SymbolicAD.simplify(ret) x
363311
# -(0, x) -> -x
364-
ret = MOI.ScalarNonlinearFunction(:-, Any[0, x])
312+
ret = op(:-, 0, x)
365313
@test SymbolicAD.simplify(ret) f
366314
# -(x, x) -> 0
367-
ret = MOI.ScalarNonlinearFunction(:-, Any[x, x])
315+
ret = op(:-, x, x)
368316
@test SymbolicAD.simplify(ret) 0
369317
# -(x, -y) -> +(x, y)
370-
f = MOI.ScalarNonlinearFunction(
371-
:-,
372-
Any[x, MOI.ScalarNonlinearFunction(:-, Any[y])],
373-
)
374-
target = MOI.ScalarNonlinearFunction(:+, Any[x, y])
318+
f = op(:-, x, op(:-, y))
319+
target = op(:+, x, y)
375320
@test SymbolicAD.simplify(f) target
376321
# -(x, y) -> -(x, y)
377-
f = MOI.ScalarNonlinearFunction(:-, Any[x, y])
322+
f = op(:-, x, y)
378323
@test SymbolicAD.simplify(f) f
379324
return
380325
end
@@ -383,33 +328,33 @@ end
383328
function test_simplify_ScalarNonlinearFunction_power()
384329
x, y = MOI.VariableIndex(1), MOI.VariableIndex(2)
385330
# x^0 -> 1
386-
f = MOI.ScalarNonlinearFunction(:^, Any[x, 0])
331+
f = op(:^, x, 0)
387332
@test SymbolicAD.simplify(f) == 1
388333
# x^1 -> x
389-
f = MOI.ScalarNonlinearFunction(:^, Any[x, 1])
334+
f = op(:^, x, 1)
390335
@test SymbolicAD.simplify(f) == x
391336
# 0^x -> 0
392-
f = MOI.ScalarNonlinearFunction(:^, Any[0, x])
337+
f = op(:^, 0, x)
393338
@test SymbolicAD.simplify(f) == 0
394339
# 1^x -> 1
395-
f = MOI.ScalarNonlinearFunction(:^, Any[1, x])
340+
f = op(:^, 1, x)
396341
@test SymbolicAD.simplify(f) == 1
397342
# x^y -> x^y
398-
f = MOI.ScalarNonlinearFunction(:^, Any[x, y])
343+
f = op(:^, x, y)
399344
@test SymbolicAD.simplify(f) f
400345
return
401346
end
402347

403348
# simplify(::Val{:ifelse}, f::MOI.ScalarNonlinearFunction)
404349
function test_simplify_ScalarNonlinearFunction_ifelse()
405350
x, y, z = MOI.VariableIndex(1), MOI.VariableIndex(2), MOI.VariableIndex(3)
406-
f = MOI.ScalarNonlinearFunction(:ifelse, Any[false, x, y])
351+
f = op(:ifelse, false, x, y)
407352
@test SymbolicAD.simplify(f) == y
408-
f = MOI.ScalarNonlinearFunction(:ifelse, Any[true, x, y])
353+
f = op(:ifelse, true, x, y)
409354
@test SymbolicAD.simplify(f) == x
410-
f = MOI.ScalarNonlinearFunction(:ifelse, Any[y, x, x])
355+
f = op(:ifelse, y, x, x)
411356
@test SymbolicAD.simplify(f) == x
412-
f = MOI.ScalarNonlinearFunction(:ifelse, Any[x, y, z])
357+
f = op(:ifelse, x, y, z)
413358
@test SymbolicAD.simplify(f) f
414359
return
415360
end
@@ -448,16 +393,10 @@ end
448393

449394
function test_simplify_VectorNonlinearFunction()
450395
x = MOI.VariableIndex.(1:3)
451-
y = MOI.ScalarNonlinearFunction(
452-
:+,
453-
Any[MOI.ScalarNonlinearFunction(:^, Any[xi, 2]) for xi in x],
454-
)
455-
x_plus = [MOI.ScalarNonlinearFunction(:+, Any[xi]) for xi in x]
396+
y = op(:+, Any[op(:^, xi, 2) for xi in x])
397+
x_plus = [op(:+, xi) for xi in x]
456398
function wrap(f)
457-
return MOI.ScalarNonlinearFunction(
458-
:+,
459-
Any[MOI.ScalarNonlinearFunction(:-, Any[f, 0.0]), 0.0],
460-
)
399+
return op(:+, op(:-, f, 0.0), 0.0)
461400
end
462401
f = MOI.VectorNonlinearFunction(wrap.([y; x_plus]))
463402
g = MOI.VectorNonlinearFunction([y; x_plus])
@@ -468,33 +407,33 @@ end
468407
function test_simplify_deep()
469408
N = 10_000
470409
x = MOI.VariableIndex.(1:N)
471-
f = MOI.ScalarNonlinearFunction(:^, Any[x[1], 1])
410+
f = op(:^, x[1], 1)
472411
for i in 2:N
473-
g = MOI.ScalarNonlinearFunction(:^, Any[x[i], 1])
474-
f = MOI.ScalarNonlinearFunction(:+, Any[f, g])
412+
g = op(:^, x[i], 1)
413+
f = op(:+, f, g)
475414
end
476-
@test (SymbolicAD.simplify(f), MOI.ScalarNonlinearFunction(:+, x))
415+
@test (SymbolicAD.simplify(f), op(:+, convert(Vector{Any}, x)))
477416
return
478417
end
479418

480419
function test_simplify_shared_false()
481420
x = MOI.VariableIndex(1)
482-
f = MOI.ScalarNonlinearFunction(:^, Any[x, 1])
483-
g = MOI.ScalarNonlinearFunction(:+, Any[f, f])
484-
h = MOI.ScalarNonlinearFunction(:-, Any[g, g])
421+
f = op(:^, x, 1)
422+
g = op(:+, f, f)
423+
h = op(:-, g, g)
485424
@test (SymbolicAD.simplify!(h), false)
486425
return
487426
end
488427

489428
function test_simplify_shared_node()
490429
x = MOI.VariableIndex(1)
491-
f1 = MOI.ScalarNonlinearFunction(:^, Any[x, 1])
492-
f2 = MOI.ScalarNonlinearFunction(:sin, Any[f1])
493-
f3 = MOI.ScalarNonlinearFunction(:cos, Any[f1])
494-
f4 = MOI.ScalarNonlinearFunction(:+, Any[f2, f3])
495-
g1 = MOI.ScalarNonlinearFunction(:sin, Any[x])
496-
g2 = MOI.ScalarNonlinearFunction(:cos, Any[x])
497-
g3 = MOI.ScalarNonlinearFunction(:+, Any[g1, g2])
430+
f1 = op(:^, x, 1)
431+
f2 = op(:sin, f1)
432+
f3 = op(:cos, f1)
433+
f4 = op(:+, f2, f3)
434+
g1 = op(:sin, x)
435+
g2 = op(:cos, x)
436+
g3 = op(:+, g1, g2)
498437
@test (SymbolicAD.simplify!(f4), g3)
499438
return
500439
end

0 commit comments

Comments
 (0)