From f6e36afefc1a31667618de70cc3521910f8a88c8 Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Tue, 5 May 2026 12:51:05 +1200 Subject: [PATCH 1/4] Slightly improve a tolerance issue in KirlikSayin From a previous solve, z_k may be a value like z+eps where z in Z and eps is the feasibility tolerance. However, if scalars[k] is integer valued, then presolve may (somewhat reasonably) deduce that this problem is infeasible. Instead of rounding z_k, changing EqualTo to LessThan seemed to work on the instances I have. I don't know why. There is also a weird situation in which Gurobi declared a problem unbounded. I can't reproduce without running the entire thing, but I think it is a mix of presolve proving that there is no finite solution (because its infeasible) and yet there being a "feasible" MIP solution in memory from the previous solve. It comes down to the weird mix of tolerances in MIP starts, presolve, simplex, and this equality constraint. This is most probably a bug in Gurobi, in that it should either report optimal or infeasible. But not unbounded. I've seem something similar in SDDP.jl. --- src/algorithms/KirlikSayin.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/algorithms/KirlikSayin.jl b/src/algorithms/KirlikSayin.jl index daebc7c..e0f39f9 100644 --- a/src/algorithms/KirlikSayin.jl +++ b/src/algorithms/KirlikSayin.jl @@ -170,7 +170,7 @@ function minimize_multiobjective!( zₖ_constraint = MOI.Utilities.normalize_and_add_constraint( inner, scalars[k], - MOI.EqualTo(zₖ), + MOI.LessThan(zₖ), ) optimize_inner!(model) if !_is_scalar_status_optimal(model) From 1e6d94e1afe53aad7cd93c01f8b08ac7b147a833 Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Tue, 5 May 2026 14:15:09 +1200 Subject: [PATCH 2/4] Apply suggestion from @odow --- src/algorithms/KirlikSayin.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/algorithms/KirlikSayin.jl b/src/algorithms/KirlikSayin.jl index e0f39f9..a885ca4 100644 --- a/src/algorithms/KirlikSayin.jl +++ b/src/algorithms/KirlikSayin.jl @@ -170,7 +170,7 @@ function minimize_multiobjective!( zₖ_constraint = MOI.Utilities.normalize_and_add_constraint( inner, scalars[k], - MOI.LessThan(zₖ), + MOI.LessThan(zₖ + 1e-5), ) optimize_inner!(model) if !_is_scalar_status_optimal(model) From 729d7a6a229239fc823e9f0d78ee77cfb72914db Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Tue, 5 May 2026 14:36:11 +1200 Subject: [PATCH 3/4] Update log line checks in test_model.jl --- test/test_model.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_model.jl b/test/test_model.jl index 6c11ec0..92978ba 100644 --- a/test/test_model.jl +++ b/test/test_model.jl @@ -258,12 +258,12 @@ function test_printing() return end contents = read(joinpath(dir, "log.txt"), String) - for line in [ + for line in Any[ "Algorithm: KirlikSayin", "1 0.00000e+00 0.00000e+00", "----------------------------------------------", "termination_status: OPTIMAL", - "result_count: 10", + r"result_count: [0-9]+", "Time spent in subproblems: ", ] @test occursin(line, contents) From 58b61f3c5d0bf14d1c3b6b18af2db774215941d3 Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Tue, 5 May 2026 16:34:08 +1200 Subject: [PATCH 4/4] Apply suggestion from @odow --- src/algorithms/KirlikSayin.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/algorithms/KirlikSayin.jl b/src/algorithms/KirlikSayin.jl index a885ca4..e0f39f9 100644 --- a/src/algorithms/KirlikSayin.jl +++ b/src/algorithms/KirlikSayin.jl @@ -170,7 +170,7 @@ function minimize_multiobjective!( zₖ_constraint = MOI.Utilities.normalize_and_add_constraint( inner, scalars[k], - MOI.LessThan(zₖ + 1e-5), + MOI.LessThan(zₖ), ) optimize_inner!(model) if !_is_scalar_status_optimal(model)