Skip to content

Commit 694dcc8

Browse files
committed
More farkas tests
1 parent 8d364b2 commit 694dcc8

File tree

2 files changed

+100
-1
lines changed

2 files changed

+100
-1
lines changed

src/MOI_wrapper.jl

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2548,7 +2548,11 @@ function MOI.get(
25482548
MOI.check_result_index_bounds(model, attr)
25492549
if model.has_infeasibility_cert
25502550
dual = _farkas_variable_dual(model, Cint(column(model, c) - 1))
2551-
return min(dual, 0.0)
2551+
if MOI.get(model, MOI.ObjectiveSense()) == MOI.MIN_SENSE
2552+
return min(dual, 0.0)
2553+
else
2554+
return min(-dual, 0.0)
2555+
end
25522556
end
25532557
reduced_cost = Ref{Cdouble}()
25542558
ret = GRBgetdblattrelement(
@@ -2583,6 +2587,7 @@ function MOI.get(
25832587
MOI.check_result_index_bounds(model, attr)
25842588
if model.has_infeasibility_cert
25852589
dual = _farkas_variable_dual(model, Cint(column(model, c) - 1))
2590+
@show dual
25862591
return max(dual, 0.0)
25872592
end
25882593
reduced_cost = Ref{Cdouble}()
@@ -2657,6 +2662,7 @@ function MOI.get(
26572662
model, "FarkasDual", Cint(_info(model, c).row - 1), valueP
26582663
)
26592664
_check_ret(model, ret)
2665+
@show valueP[]
26602666
return -valueP[]
26612667
end
26622668
ret = GRBgetdblattrelement(

test/MOI/MOI_wrapper.jl

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1203,6 +1203,36 @@ function test_farkas_dual_min()
12031203
@test clb_dual[2] -c_dual atol = 1e-6
12041204
end
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+
12061236
function 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
12341264
end
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+
12361298
end
12371299

12381300
runtests(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

Comments
 (0)