@@ -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,147 @@ 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
+
1586
+ function test_delete_variable_with_bounds ()
1587
+ for sets in (
1588
+ (MOI. LessThan (1.0 ),),
1589
+ (MOI. GreaterThan (1.0 ),),
1590
+ (MOI. EqualTo (1.0 ),),
1591
+ (MOI. Interval (1.0 , 2.0 ),),
1592
+ (MOI. GreaterThan (1.0 ), MOI. LessThan (2.0 )),
1593
+ )
1594
+ model = SCIP. Optimizer ()
1595
+ x = MOI. add_variable (model)
1596
+ for set in sets
1597
+ MOI. add_constraint (model, x, set)
1598
+ end
1599
+ ret = MOI. get (model, MOI. ListOfConstraintTypesPresent ())
1600
+ @test length (ret) == length (sets)
1601
+ for set in sets
1602
+ (MOI. VariableIndex, typeof (set)) in ret
1603
+ end
1604
+ MOI. delete (model, x)
1605
+ @test isempty (MOI. get (model, MOI. ListOfConstraintTypesPresent ()))
1606
+ end
1607
+ return
1608
+ end
1609
+
1610
+ function test_BoundAlreadySet ()
1611
+ model = SCIP. Optimizer ()
1612
+ x = MOI. add_variable (model)
1613
+ MOI. add_constraint (model, x, MOI. GreaterThan (1.0 ))
1614
+ MOI. add_constraint (model, x, MOI. LessThan (2.0 ))
1615
+ @test_throws (
1616
+ MOI. LowerBoundAlreadySet,
1617
+ MOI. add_constraint (model, x, MOI. GreaterThan (1.0 )),
1618
+ )
1619
+ @test_throws (
1620
+ MOI. UpperBoundAlreadySet,
1621
+ MOI. add_constraint (model, x, MOI. LessThan (1.0 )),
1622
+ )
1623
+ return
1624
+ end
1625
+
1626
+ function test_delete_bounds ()
1627
+ model = SCIP. Optimizer ()
1628
+ x = MOI. add_variable (model)
1629
+ c_l = MOI. add_constraint (model, x, MOI. GreaterThan (1.0 ))
1630
+ c_u = MOI. add_constraint (model, x, MOI. LessThan (2.0 ))
1631
+ MOI. delete (model, c_u)
1632
+ MOI. add_constraint (model, x, MOI. LessThan (3.0 ))
1633
+ @test MOI. get (model, MOI. ConstraintSet (), c_u) == MOI. LessThan (3.0 )
1634
+ MOI. delete (model, c_l)
1635
+ MOI. add_constraint (model, x, MOI. GreaterThan (- 1.0 ))
1636
+ @test MOI. get (model, MOI. ConstraintSet (), c_l) == MOI. GreaterThan (- 1.0 )
1637
+ return
1638
+ end
1639
+
1640
+ function test_get_binary_with_bounds ()
1641
+ model = SCIP. Optimizer ()
1642
+ x = MOI. add_variable (model)
1643
+ c = MOI. add_constraint (model, x, MOI. Interval (0.5 , 1.1 ))
1644
+ MOI. add_constraint (model, x, MOI. ZeroOne ())
1645
+ @test MOI. get (model, MOI. ConstraintSet (), c) == MOI. Interval (0.5 , 1.1 )
1646
+ return
1647
+ end
1648
+
1503
1649
end # module TestMOIWrapper
1504
1650
1505
1651
TestMOIWrapper. runtests ()
0 commit comments