@@ -24,6 +24,7 @@ function runtests()
24
24
end
25
25
26
26
op (head, args... ) = MOI. ScalarNonlinearFunction (head, Any[args... ])
27
+ op (head, arg:: Vector{Any} ) = MOI. ScalarNonlinearFunction (head, arg)
27
28
28
29
function test_derivative ()
29
30
x, y, z = MOI. VariableIndex .(1 : 3 )
142
143
143
144
function test_derivative_error ()
144
145
x = MOI. VariableIndex (1 )
145
- f = MOI . ScalarNonlinearFunction (:foo , Any[ x, x] )
146
+ f = op (:foo , x, x)
146
147
@test_throws (MOI. UnsupportedNonlinearOperator, SymbolicAD. derivative (f, x),)
147
148
return
148
149
end
@@ -173,19 +174,10 @@ function test_variable()
173
174
1.0 * x* y=> [x, y],
174
175
1.0 * y* x=> [x, y],
175
176
# ::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],
189
181
]
190
182
@test SymbolicAD. variables (f) == fp
191
183
end
@@ -233,13 +225,13 @@ end
233
225
function test_simplify_ScalarNonlinearFunction ()
234
226
x = MOI. VariableIndex (1 )
235
227
# 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 )
239
231
@test SymbolicAD. simplify (h) ≈ sin (3 )
240
232
# 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 )
243
235
@test SymbolicAD. simplify (g) ≈ g
244
236
return
245
237
end
@@ -248,50 +240,31 @@ end
248
240
function test_simplify_ScalarNonlinearFunction_multiplication ()
249
241
x, y, z = MOI. VariableIndex .(1 : 3 )
250
242
# *(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))
260
244
# *(x, *(y, z, *(x, 2))) -> *(x, y, z, x, 2)
261
- f = MOI . ScalarNonlinearFunction (:* , Any[ x, 2 ] )
245
+ f = op (:* , x, 2 )
262
246
@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 ),
270
249
)
271
250
# *(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 ))
277
253
# *(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))
283
256
# *(x, 1) -> x
284
- ret = MOI . ScalarNonlinearFunction (:* , Any[ x, 1 ] )
257
+ ret = op (:* , x, 1 )
285
258
@test ≈ (SymbolicAD. simplify (ret), x)
286
259
# *(x, 0) -> 0
287
- ret = MOI . ScalarNonlinearFunction (:* , Any[ x, 0 ] )
260
+ ret = op (:* , x, 0 )
288
261
@test ≈ (SymbolicAD. simplify (ret), 0 )
289
262
# *(-(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 )
292
265
@test ≈ (SymbolicAD. simplify (ret), 0 )
293
266
# *() -> true
294
- ret = MOI . ScalarNonlinearFunction (:* , Any[])
267
+ ret = op (:* , Any[])
295
268
@test ≈ (SymbolicAD. simplify (ret), 1 )
296
269
return
297
270
end
@@ -300,81 +273,53 @@ end
300
273
function test_simplify_ScalarNonlinearFunction_addition ()
301
274
x, y, z = MOI. VariableIndex .(1 : 3 )
302
275
# (+(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))
312
277
# +(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))
324
281
# (+(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 ))
330
284
# (+(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))
336
287
# +(x, 0) -> x
337
- ret = MOI . ScalarNonlinearFunction (:+ , Any[ x, 0 ] )
288
+ ret = op (:+ , x, 0 )
338
289
@test SymbolicAD. simplify (ret) ≈ x
339
290
# +(0, x) -> x
340
- ret = MOI . ScalarNonlinearFunction (:+ , Any[ 0 , x] )
291
+ ret = op (:+ , 0 , x)
341
292
@test SymbolicAD. simplify (ret) ≈ x
342
293
# +(-(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 )
347
295
@test SymbolicAD. simplify (f) === false
348
296
return
349
297
end
350
298
351
299
# simplify(::Val{:-}, f::MOI.ScalarNonlinearFunction)
352
300
function test_simplify_ScalarNonlinearFunction_subtraction ()
353
301
x, y = MOI. VariableIndex (1 ), MOI. VariableIndex (2 )
354
- f = MOI . ScalarNonlinearFunction (:- , Any[x] )
302
+ f = op (:- , x )
355
303
# -x -> -x
356
304
@test SymbolicAD. simplify (f) ≈ f
357
305
# -(-(x)) -> x
358
- ret = MOI . ScalarNonlinearFunction (:- , Any[f] )
306
+ ret = op (:- , f )
359
307
@test SymbolicAD. simplify (ret) ≈ x
360
308
# -(x, 0) -> x
361
- ret = MOI . ScalarNonlinearFunction (:- , Any[ x, 0 ] )
309
+ ret = op (:- , x, 0 )
362
310
@test SymbolicAD. simplify (ret) ≈ x
363
311
# -(0, x) -> -x
364
- ret = MOI . ScalarNonlinearFunction (:- , Any[ 0 , x] )
312
+ ret = op (:- , 0 , x)
365
313
@test SymbolicAD. simplify (ret) ≈ f
366
314
# -(x, x) -> 0
367
- ret = MOI . ScalarNonlinearFunction (:- , Any[ x, x] )
315
+ ret = op (:- , x, x)
368
316
@test SymbolicAD. simplify (ret) ≈ 0
369
317
# -(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)
375
320
@test SymbolicAD. simplify (f) ≈ target
376
321
# -(x, y) -> -(x, y)
377
- f = MOI . ScalarNonlinearFunction (:- , Any[ x, y] )
322
+ f = op (:- , x, y)
378
323
@test SymbolicAD. simplify (f) ≈ f
379
324
return
380
325
end
@@ -383,33 +328,33 @@ end
383
328
function test_simplify_ScalarNonlinearFunction_power ()
384
329
x, y = MOI. VariableIndex (1 ), MOI. VariableIndex (2 )
385
330
# x^0 -> 1
386
- f = MOI . ScalarNonlinearFunction (:^ , Any[ x, 0 ] )
331
+ f = op (:^ , x, 0 )
387
332
@test SymbolicAD. simplify (f) == 1
388
333
# x^1 -> x
389
- f = MOI . ScalarNonlinearFunction (:^ , Any[ x, 1 ] )
334
+ f = op (:^ , x, 1 )
390
335
@test SymbolicAD. simplify (f) == x
391
336
# 0^x -> 0
392
- f = MOI . ScalarNonlinearFunction (:^ , Any[ 0 , x] )
337
+ f = op (:^ , 0 , x)
393
338
@test SymbolicAD. simplify (f) == 0
394
339
# 1^x -> 1
395
- f = MOI . ScalarNonlinearFunction (:^ , Any[ 1 , x] )
340
+ f = op (:^ , 1 , x)
396
341
@test SymbolicAD. simplify (f) == 1
397
342
# x^y -> x^y
398
- f = MOI . ScalarNonlinearFunction (:^ , Any[ x, y] )
343
+ f = op (:^ , x, y)
399
344
@test SymbolicAD. simplify (f) ≈ f
400
345
return
401
346
end
402
347
403
348
# simplify(::Val{:ifelse}, f::MOI.ScalarNonlinearFunction)
404
349
function test_simplify_ScalarNonlinearFunction_ifelse ()
405
350
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)
407
352
@test SymbolicAD. simplify (f) == y
408
- f = MOI . ScalarNonlinearFunction (:ifelse , Any[ true , x, y] )
353
+ f = op (:ifelse , true , x, y)
409
354
@test SymbolicAD. simplify (f) == x
410
- f = MOI . ScalarNonlinearFunction (:ifelse , Any[ y, x, x] )
355
+ f = op (:ifelse , y, x, x)
411
356
@test SymbolicAD. simplify (f) == x
412
- f = MOI . ScalarNonlinearFunction (:ifelse , Any[ x, y, z] )
357
+ f = op (:ifelse , x, y, z)
413
358
@test SymbolicAD. simplify (f) ≈ f
414
359
return
415
360
end
@@ -448,16 +393,10 @@ end
448
393
449
394
function test_simplify_VectorNonlinearFunction ()
450
395
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]
456
398
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 )
461
400
end
462
401
f = MOI. VectorNonlinearFunction (wrap .([y; x_plus]))
463
402
g = MOI. VectorNonlinearFunction ([y; x_plus])
@@ -468,33 +407,33 @@ end
468
407
function test_simplify_deep ()
469
408
N = 10_000
470
409
x = MOI. VariableIndex .(1 : N)
471
- f = MOI . ScalarNonlinearFunction (:^ , Any[ x[1 ], 1 ] )
410
+ f = op (:^ , x[1 ], 1 )
472
411
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)
475
414
end
476
- @test ≈ (SymbolicAD. simplify (f), MOI . ScalarNonlinearFunction (:+ , x ))
415
+ @test ≈ (SymbolicAD. simplify (f), op (:+ , convert (Vector{Any}, x) ))
477
416
return
478
417
end
479
418
480
419
function test_simplify_shared_false ()
481
420
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)
485
424
@test ≈ (SymbolicAD. simplify! (h), false )
486
425
return
487
426
end
488
427
489
428
function test_simplify_shared_node ()
490
429
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)
498
437
@test ≈ (SymbolicAD. simplify! (f4), g3)
499
438
return
500
439
end
0 commit comments