@@ -1203,6 +1203,36 @@ function test_farkas_dual_min()
12031203 @test clb_dual[2 ] ≈ - c_dual atol = 1e-6
12041204end
12051205
1206+ function test_farkas_dual_min_ii ()
1207+ MOI. empty! (OPTIMIZER)
1208+ x = MOI. add_variables (model, 2 )
1209+ MOI. set (model, MOI. ObjectiveSense (), MOI. MIN_SENSE)
1210+ MOI. set (
1211+ model,
1212+ MOI. ObjectiveFunction {MOI.ScalarAffineFunction{Float64}} (),
1213+ MOI. ScalarAffineFunction ([MOI. ScalarAffineTerm (- 1.0 , x[1 ])], 0.0 ),
1214+ )
1215+ clb = MOI. add_constraint .(
1216+ model, MOI. SingleVariable .(x), MOI. LessThan (0.0 )
1217+ )
1218+ c = MOI. add_constraint (
1219+ model,
1220+ MOI. ScalarAffineFunction (MOI. ScalarAffineTerm .([- 2.0 , - 1.0 ], x), 0.0 ),
1221+ MOI. LessThan (- 1.0 ),
1222+ )
1223+ MOI. optimize! (model)
1224+ @test MOI. get (model, MOI. TerminationStatus ()) == MOI. INFEASIBLE
1225+ @test MOI. get (model, MOI. DualStatus ()) == MOI. INFEASIBILITY_CERTIFICATE
1226+ clb_dual = MOI. get .(model, MOI. ConstraintDual (), clb)
1227+ c_dual = MOI. get (model, MOI. ConstraintDual (), c)
1228+ @show clb_dual, c_dual
1229+ @test clb_dual[1 ] < - 1e-6
1230+ @test clb_dual[2 ] < - 1e-6
1231+ @test c_dual[1 ] < - 1e-6
1232+ @test clb_dual[1 ] ≈ 2 * c_dual atol = 1e-6
1233+ @test clb_dual[2 ] ≈ c_dual atol = 1e-6
1234+ end
1235+
12061236function test_farkas_dual_max ()
12071237 MOI. empty! (OPTIMIZER)
12081238 x = MOI. add_variables (model, 2 )
@@ -1233,6 +1263,69 @@ function test_farkas_dual_max()
12331263 @test clb_dual[2 ] ≈ - c_dual atol = 1e-6
12341264end
12351265
1266+ function test_farkas_dual_max_ii ()
1267+ model = Gurobi. Optimizer ()
1268+ MOI. set (model, MOI. Silent (), true )
1269+ MOI. set (model, MOI. RawParameter (" InfUnbdInfo" ), 1 )
1270+ x = MOI. add_variables (model, 2 )
1271+ MOI. set (model, MOI. ObjectiveSense (), MOI. MAX_SENSE)
1272+ MOI. set (
1273+ model,
1274+ MOI. ObjectiveFunction {MOI.ScalarAffineFunction{Float64}} (),
1275+ MOI. ScalarAffineFunction ([MOI. ScalarAffineTerm (- 1.0 , x[1 ])], 0.0 ),
1276+ )
1277+ clb = MOI. add_constraint .(
1278+ model, MOI. SingleVariable .(x), MOI. LessThan (0.0 )
1279+ )
1280+ c = MOI. add_constraint (
1281+ model,
1282+ MOI. ScalarAffineFunction (MOI. ScalarAffineTerm .([- 2.0 , - 1.0 ], x), 0.0 ),
1283+ MOI. LessThan (- 1.0 ),
1284+ )
1285+ MOI. optimize! (model)
1286+ @test MOI. get (model, MOI. TerminationStatus ()) == MOI. INFEASIBLE
1287+ @test MOI. get (model, MOI. DualStatus ()) == MOI. INFEASIBILITY_CERTIFICATE
1288+ clb_dual = MOI. get .(model, MOI. ConstraintDual (), clb)
1289+ c_dual = MOI. get (model, MOI. ConstraintDual (), c)
1290+ @show clb_dual, c_dual
1291+ @test clb_dual[1 ] < - 1e-6
1292+ @test clb_dual[2 ] < - 1e-6
1293+ @test c_dual[1 ] < - 1e-6
1294+ @test clb_dual[1 ] ≈ 2 * c_dual atol = 1e-6
1295+ @test clb_dual[2 ] ≈ c_dual atol = 1e-6
1296+ end
1297+
12361298end
12371299
12381300runtests (TestMOIWrapper)
1301+
1302+
1303+ # env = Ref{Ptr{Cvoid}}()
1304+ # ret = GRBloadenv(env, C_NULL)
1305+ # GRBsetintparam(env[], "InfUnbdInfo", 1)
1306+ # model = Ref{Ptr{Cvoid}}()
1307+ # GRBloadmodel(
1308+ # env[], # *env
1309+ # model, # **modelp
1310+ # C_NULL, # *Pname
1311+ # Cint(2), # numvars
1312+ # Cint(1), # numconstrs
1313+ # Cint(-1), # objsense (minimization)
1314+ # 0.0, # objcon
1315+ # Cdouble[1.0, 0.0], # *obj
1316+ # Cchar[GRB_LESS_EQUAL], # *sense
1317+ # Cdouble[-1.0], # *rhs
1318+ # Cint[0, 1], # *vbeg
1319+ # Cint[1, 1], # vlen
1320+ # Cint[0, 0], # *vind
1321+ # Cdouble[-2.0, -1.0], # *vval
1322+ # Cdouble[-GRB_INFINITY, -GRB_INFINITY], # *lb
1323+ # Cdouble[0.0, 0.0], # *ub
1324+ # C_NULL, # *vtype
1325+ # C_NULL, # **varnames
1326+ # C_NULL, # **constrnames
1327+ # )
1328+ # GRBoptimize(model[])
1329+ # dual = Vector{Cdouble}(undef, 1)
1330+ # GRBgetdblattrarray(model[], "FarkasDual", 0, 1, dual)
1331+ # dual
0 commit comments