@@ -730,6 +730,7 @@ function _test_presolving(presolving)
730
730
),
731
731
)
732
732
MOI. set (optimizer, MOI. ObjectiveSense (), MOI. MAX_SENSE)
733
+ @test MOI. supports (optimizer, SCIP. Presolving ())
733
734
@test MOI. get (optimizer, SCIP. Presolving ()) == true
734
735
MOI. set (optimizer, SCIP. Presolving (), presolving)
735
736
@test MOI. get (optimizer, SCIP. Presolving ()) == presolving
@@ -865,9 +866,11 @@ function test_heuristic_callback()
865
866
values[findmax (x_frac)[2 ]] = 1.0
866
867
values[1 ] = 1.0
867
868
values[2 ] = 1.0
869
+ @test MOI. supports (o, MOI. HeuristicSolution (callback_data))
868
870
MOI. submit (o, MOI. HeuristicSolution (callback_data), x, values)
869
871
global ncalls[] += 1
870
872
end
873
+ @test MOI. supports (o, MOI. HeuristicCallback ())
871
874
MOI. set (o, MOI. HeuristicCallback (), heuristic_callback)
872
875
MOI. optimize! (o)
873
876
@test ncalls[] > 0
@@ -1195,6 +1198,7 @@ function test_obtaining_the_LP_solution()
1195
1198
)
1196
1199
calls += 1
1197
1200
end
1201
+ @test MOI. supports (optimizer, MOI. UserCutCallback ())
1198
1202
MOI. set (optimizer, MOI. UserCutCallback (), cutcallback)
1199
1203
# solve the problem
1200
1204
MOI. optimize! (optimizer)
@@ -1237,6 +1241,7 @@ function test_cutting_one_optimal_solution()
1237
1241
MOI. set (optimizer, MOI. ObjectiveSense (), MOI. MAX_SENSE)
1238
1242
calls = 0
1239
1243
function cutcallback (cb_data)
1244
+ @test MOI. supports (optimizer, MOI. UserCut {SCIP.CutCbData} (cb_data))
1240
1245
MOI. submit (
1241
1246
optimizer,
1242
1247
MOI. UserCut {SCIP.CutCbData} (cb_data),
@@ -1500,6 +1505,84 @@ function test_AddSingleCut_too_strong_cut()
1500
1505
return
1501
1506
end
1502
1507
1508
+ function test_ScalarFunctionConstantNotZero_quadratic ()
1509
+ model = SCIP. Optimizer ()
1510
+ x = MOI. add_variable (model)
1511
+ f = 1.0 * x * x + 2.0
1512
+ @test_throws (
1513
+ MOI. ScalarFunctionConstantNotZero,
1514
+ MOI. add_constraint (model, f, MOI. LessThan (3.0 )),
1515
+ )
1516
+ return
1517
+ end
1518
+
1519
+ function test_ListOfSupportedNonlinearOperators ()
1520
+ model = SCIP. Optimizer ()
1521
+ op = MOI. get (model, MOI. ListOfSupportedNonlinearOperators ())
1522
+ @test op isa Vector{Symbol}
1523
+ @test length (op) == 11
1524
+ return
1525
+ end
1526
+
1527
+ function test_nonlinear_epigraph_functions ()
1528
+ op (f, args... ) = MOI. ScalarNonlinearFunction (f, Any[args... ])
1529
+ default_set = MOI. Interval (1.0 , 2.0 )
1530
+ for (fn, set, t_value) in [
1531
+ (x -> op (:exp , 1.0 * x + 2.0 ), default_set, exp (3 )),
1532
+ (x -> op (:exp , 1.0 * x * x + 2.0 ), default_set, exp (3 )),
1533
+ (x -> op (:exp , 1.0 * x * x + 2.0 * x + 3.0 ), default_set, exp (6 )),
1534
+ # :/
1535
+ (x -> op (:/ , 2 , x), MOI. Interval (1.0 , 2.0 ), 1.0 ),
1536
+ (x -> op (:/ , 2 , x), MOI. Interval (1.0 , 1.5 ), 4 / 3 ),
1537
+ # :abs
1538
+ (x -> op (:abs , x), MOI. Interval (1.0 , 2.0 ), 1.0 ),
1539
+ (x -> op (:abs , x), MOI. Interval (- 2.0 , 2.0 ), 0.0 ),
1540
+ (x -> op (:abs , x), MOI. Interval (- 2.0 , - 1.3 ), 1.3 ),
1541
+ # :exp
1542
+ (x -> op (:exp , x), MOI. Interval (- 2.0 , - 1.3 ), exp (- 2 )),
1543
+ (x -> op (:exp , x), MOI. Interval (2.0 , 3.0 ), exp (2 )),
1544
+ # :log
1545
+ (x -> op (:- , op (:log , x)), MOI. Interval (2.0 , 3.0 ), - log (3 )),
1546
+ # :sin
1547
+ (x -> op (:sin , x), MOI. Interval (pi , 2 * pi ), - 1.0 ),
1548
+ (x -> op (:sin , x), MOI. Interval (0.0 , pi ), 0.0 ),
1549
+ # :cos
1550
+ (x -> op (:cos , x), MOI. Interval (pi , 2 * pi ), - 1.0 ),
1551
+ (x -> op (:cos , x), MOI. Interval (0.0 , pi ), - 1.0 ),
1552
+ (x -> op (:cos , x), MOI. Interval (- pi / 2 , pi / 2 ), 0.0 ),
1553
+ # :sqrt
1554
+ (x -> op (:- , op (:sqrt , x)), MOI. Interval (2.0 , 3.0 ), - sqrt (3 )),
1555
+ ]
1556
+ model = SCIP. Optimizer ()
1557
+ MOI. set (model, MOI. Silent (), true )
1558
+ x, _ = MOI. add_constrained_variable (model, set)
1559
+ t = MOI. add_variable (model)
1560
+ MOI. set (model, MOI. ObjectiveSense (), MOI. MIN_SENSE)
1561
+ F = MOI. ScalarAffineFunction{Float64}
1562
+ MOI. set (model, MOI. ObjectiveFunction {F} (), 1.0 * t)
1563
+ MOI. add_constraint (model, op (:- , t, fn (x)), MOI. GreaterThan (0.0 ))
1564
+ MOI. optimize! (model)
1565
+ @test ≈ (MOI. get (model, MOI. VariablePrimal (), t), t_value; atol = 1e-4 )
1566
+ end
1567
+ return
1568
+ end
1569
+
1570
+ function test_unsupported_nonlinear_operator ()
1571
+ model = SCIP. Optimizer ()
1572
+ x = MOI. add_variable (model)
1573
+ f = MOI. ScalarNonlinearFunction (:foo , Any[x])
1574
+ @test_throws (
1575
+ MOI. UnsupportedNonlinearOperator (:foo ),
1576
+ MOI. add_constraint (model, f, MOI. GreaterThan (0.0 )),
1577
+ )
1578
+ f = MOI. ScalarNonlinearFunction (:^ , Any[x, x])
1579
+ @test_throws (
1580
+ MOI. UnsupportedNonlinearOperator (:^ ),
1581
+ MOI. add_constraint (model, f, MOI. GreaterThan (0.0 )),
1582
+ )
1583
+ return
1584
+ end
1585
+
1503
1586
end # module TestMOIWrapper
1504
1587
1505
1588
TestMOIWrapper. runtests ()
0 commit comments