@@ -1047,6 +1047,99 @@ function test_model_filename()
1047
1047
return
1048
1048
end
1049
1049
1050
+ function test_model_nlp_boolean ()
1051
+ model = MOI. Utilities. UniversalFallback (MOI. Utilities. Model {Int} ())
1052
+ x = MOI. add_variables (model, 2 )
1053
+ MOI. add_constraint .(model, x, MOI. ZeroOne ())
1054
+ nlp = MOI. Nonlinear. Model ()
1055
+ a, b = x
1056
+ MOI. Nonlinear. add_constraint (nlp, :(($ a || $ b)), MOI. EqualTo (1.0 ))
1057
+ MOI. Nonlinear. add_constraint (nlp, :(($ a && $ b)), MOI. EqualTo (0.0 ))
1058
+ backend = MOI. Nonlinear. ExprGraphOnly ()
1059
+ evaluator = MOI. Nonlinear. Evaluator (nlp, backend, x)
1060
+ MOI. set (model, MOI. NLPBlock (), MOI. NLPBlockData (evaluator))
1061
+ solver = MiniZinc. Optimizer {Int} (MiniZinc. Chuffed ())
1062
+ MOI. set (solver, MOI. RawOptimizerAttribute (" model_filename" ), " test.mzn" )
1063
+ index_map, _ = MOI. optimize! (solver, model)
1064
+ @test MOI. get (solver, MOI. TerminationStatus ()) === MOI. OPTIMAL
1065
+ @test MOI. get (solver, MOI. ResultCount ()) >= 1
1066
+ y = [index_map[v] for v in x]
1067
+ sol = round .(Bool, MOI. get (solver, MOI. VariablePrimal (), y))
1068
+ @test (sol[1 ] || sol[2 ]) == true
1069
+ @test (sol[1 ] && sol[2 ]) == false
1070
+ @test read (" test.mzn" , String) ==
1071
+ " var bool: x1;\n var bool: x2;\n constraint (x1 \\ / x2) == true;\n constraint (x1 /\\ x2) == false;\n solve satisfy;\n "
1072
+ rm (" test.mzn" )
1073
+ return
1074
+ end
1075
+
1076
+ function test_model_nlp_boolean_nested ()
1077
+ model = MOI. Utilities. UniversalFallback (MOI. Utilities. Model {Int} ())
1078
+ x = MOI. add_variables (model, 2 )
1079
+ MOI. add_constraint .(model, x, MOI. ZeroOne ())
1080
+ y = MOI. add_variable (model)
1081
+ MOI. add_constraint (model, y, MOI. Integer ())
1082
+ MOI. add_constraint (model, y, MOI. Interval (0 , 10 ))
1083
+ nlp = MOI. Nonlinear. Model ()
1084
+ a, b = x
1085
+ # a || (b && (y < 5))
1086
+ MOI. Nonlinear. add_constraint (
1087
+ nlp,
1088
+ :(($ a || ($ b && ($ y < 5 )))),
1089
+ MOI. EqualTo (1.0 ),
1090
+ )
1091
+ MOI. Nonlinear. add_constraint (nlp, :($ a < 1 ), MOI. EqualTo (1.0 ))
1092
+ backend = MOI. Nonlinear. ExprGraphOnly ()
1093
+ evaluator = MOI. Nonlinear. Evaluator (nlp, backend, x)
1094
+ MOI. set (model, MOI. NLPBlock (), MOI. NLPBlockData (evaluator))
1095
+ solver = MiniZinc. Optimizer {Int} (MiniZinc. Chuffed ())
1096
+ MOI. set (solver, MOI. RawOptimizerAttribute (" model_filename" ), " test.mzn" )
1097
+ index_map, _ = MOI. optimize! (solver, model)
1098
+ @test MOI. get (solver, MOI. TerminationStatus ()) === MOI. OPTIMAL
1099
+ @test MOI. get (solver, MOI. ResultCount ()) >= 1
1100
+ sol_x = [index_map[v] for v in [x; y]]
1101
+ sol = round .(Int, MOI. get (solver, MOI. VariablePrimal (), sol_x))
1102
+ @test sol[1 ] == 0
1103
+ @test sol[2 ] == 1
1104
+ @test sol[3 ] < 5
1105
+ @test read (" test.mzn" , String) ==
1106
+ " var bool: x1;\n var bool: x2;\n var 0 .. 10: x3;\n constraint (x1 \\ / (x2 /\\ (x3 < 5))) == true;\n constraint (x1 < 1) == true;\n solve satisfy;\n "
1107
+ rm (" test.mzn" )
1108
+ return
1109
+ end
1110
+
1111
+ function test_model_nlp_boolean_jump ()
1112
+ model = MOI. Utilities. UniversalFallback (MOI. Utilities. Model {Int} ())
1113
+ x = MOI. add_variables (model, 2 )
1114
+ MOI. add_constraint .(model, x, MOI. ZeroOne ())
1115
+ nlp = MOI. Nonlinear. Model ()
1116
+ a, b = x
1117
+ MOI. Nonlinear. add_constraint (nlp, :(($ a || $ b) - 1.0 ), MOI. EqualTo (0.0 ))
1118
+ MOI. Nonlinear. add_constraint (nlp, :(($ a && $ b) - 0.0 ), MOI. EqualTo (0.0 ))
1119
+ backend = MOI. Nonlinear. ExprGraphOnly ()
1120
+ evaluator = MOI. Nonlinear. Evaluator (nlp, backend, x)
1121
+ MOI. set (model, MOI. NLPBlock (), MOI. NLPBlockData (evaluator))
1122
+ solver = MiniZinc. Optimizer {Int} (MiniZinc. Chuffed ())
1123
+ MOI. set (solver, MOI. RawOptimizerAttribute (" model_filename" ), " test.mzn" )
1124
+ index_map, _ = MOI. optimize! (solver, model)
1125
+ @test MOI. get (solver, MOI. TerminationStatus ()) === MOI. OPTIMAL
1126
+ @test MOI. get (solver, MOI. ResultCount ()) >= 1
1127
+ y = [index_map[v] for v in x]
1128
+ sol = round .(Bool, MOI. get (solver, MOI. VariablePrimal (), y))
1129
+ @test (sol[1 ] || sol[2 ]) == true
1130
+ @test (sol[1 ] && sol[2 ]) == false
1131
+ @test read (" test.mzn" , String) ==
1132
+ " var bool: x1;\n var bool: x2;\n constraint ((x1 \\ / x2) - 1) == false;\n constraint ((x1 /\\ x2) - 0) == false;\n solve satisfy;\n "
1133
+ rm (" test.mzn" )
1134
+ return
1135
+ end
1136
+
1137
+ function test_model_solver_name ()
1138
+ solver = MiniZinc. Optimizer {Int} (MiniZinc. Chuffed ())
1139
+ @test MOI. get (solver, MOI. SolverName ()) == " MiniZinc"
1140
+ return
1141
+ end
1142
+
1050
1143
end
1051
1144
1052
1145
TestMiniZinc. runtests ()
0 commit comments