From 4eb7a63423e0005c8b97ac9a513147f486ed0b50 Mon Sep 17 00:00:00 2001 From: David Cole Date: Tue, 11 Nov 2025 10:52:59 -0500 Subject: [PATCH] Fixed bug and added tests --- lib/PlasmoBenders/Project.toml | 2 +- lib/PlasmoBenders/src/solution.jl | 5 +++-- lib/PlasmoBenders/test/LP_solve.jl | 24 ++++++++++++++++++++++++ lib/PlasmoBenders/test/MIP_solve.jl | 24 ++++++++++++++++++++++++ 4 files changed, 52 insertions(+), 3 deletions(-) diff --git a/lib/PlasmoBenders/Project.toml b/lib/PlasmoBenders/Project.toml index b5ad68d..8dbb0f3 100644 --- a/lib/PlasmoBenders/Project.toml +++ b/lib/PlasmoBenders/Project.toml @@ -1,7 +1,7 @@ name = "PlasmoBenders" uuid = "491f1417-53b2-48aa-b9da-44cdd6c031b7" authors = ["David Cole"] -version = "0.3.0" +version = "0.3.1" [deps] Plasmo = "d3f7391f-f14a-50cc-bbe4-76a32d1bad3c" diff --git a/lib/PlasmoBenders/src/solution.jl b/lib/PlasmoBenders/src/solution.jl index c784832..2859709 100644 --- a/lib/PlasmoBenders/src/solution.jl +++ b/lib/PlasmoBenders/src/solution.jl @@ -107,7 +107,7 @@ function _optimize_in_forward_pass_multithread!(optimizer::BendersAlgorithm{Remo @async begin next_object = optimizer.solve_order[i] - is_feasible, obj_val, duals, t_solve = _optimize_remote_graph_forward(optimizer, next_object) + is_feasible, obj_val, duals, t_solve = _optimize_remote_graph_forward(optimizer, next_object, i) optimizer.time_subproblem_solves += t_solve if !is_feasible @@ -131,10 +131,11 @@ function _optimize_in_forward_pass_multithread!(optimizer::BendersAlgorithm{Remo end end -function _optimize_remote_graph_forward(optimizer::BendersAlgorithm, next_object::RemoteOptiGraph) +function _optimize_remote_graph_forward(optimizer::BendersAlgorithm, next_object::RemoteOptiGraph, i::Int) feasibility_cuts = get_feasibility_cuts(optimizer) regularize = get_regularize(optimizer) add_slacks = get_add_slacks(optimizer) + is_MIP = get_is_MIP(optimizer) comp_vars = optimizer.comp_vars[next_object] var_copy_map = optimizer.var_copy_map[next_object] diff --git a/lib/PlasmoBenders/test/LP_solve.jl b/lib/PlasmoBenders/test/LP_solve.jl index 158f975..5f4500a 100644 --- a/lib/PlasmoBenders/test/LP_solve.jl +++ b/lib/PlasmoBenders/test/LP_solve.jl @@ -158,6 +158,18 @@ function test_graphs() @test isapprox(BendersAlg.best_upper_bound, 5.5, rtol = 1e-6) @test isapprox(get_gap(BendersAlg), 0, rtol = 1e-6) + gtest = build_graph() + BendersAlg = BendersAlgorithm(gtest, local_subgraphs(gtest)[1], max_iters = 20, multicut = true, regularize = false, parallelize_benders = false); + run_algorithm!(BendersAlg) + @test isapprox(BendersAlg.best_upper_bound, 5.5, rtol = 1e-6) + @test isapprox(get_gap(BendersAlg), 0, rtol = 1e-6) + + gtest = build_graph() + BendersAlg = BendersAlgorithm(gtest, local_subgraphs(gtest)[2], max_iters = 20, multicut = true, parallelize_benders = true); + run_algorithm!(BendersAlg) + @test isapprox(BendersAlg.best_upper_bound, 5.5, rtol = 1e-6) + @test isapprox(get_gap(BendersAlg), 0, rtol = 1e-6) + # RemoteOptiGraphs gtest = build_remote_graph() BendersAlg = BendersAlgorithm(gtest, local_subgraphs(gtest)[1], max_iters = 20); @@ -215,6 +227,18 @@ function test_graphs() run_algorithm!(BendersAlg) @test isapprox(BendersAlg.best_upper_bound, 5.5, rtol = 1e-6) @test isapprox(get_gap(BendersAlg), 0, rtol = 1e-6) + + gtest = build_remote_graph() + BendersAlg = BendersAlgorithm(gtest, local_subgraphs(gtest)[1], max_iters = 20, multicut = true, regularize = false, parallelize_benders = false); + run_algorithm!(BendersAlg) + @test isapprox(BendersAlg.best_upper_bound, 5.5, rtol = 1e-6) + @test isapprox(get_gap(BendersAlg), 0, rtol = 1e-6) + + gtest = build_remote_graph() + BendersAlg = BendersAlgorithm(gtest, local_subgraphs(gtest)[2], max_iters = 20, multicut = true, parallelize_benders = true); + run_algorithm!(BendersAlg) + @test isapprox(BendersAlg.best_upper_bound, 5.5, rtol = 1e-6) + @test isapprox(get_gap(BendersAlg), 0, rtol = 1e-6) end function run_tests() diff --git a/lib/PlasmoBenders/test/MIP_solve.jl b/lib/PlasmoBenders/test/MIP_solve.jl index feedf45..f14c82e 100644 --- a/lib/PlasmoBenders/test/MIP_solve.jl +++ b/lib/PlasmoBenders/test/MIP_solve.jl @@ -130,6 +130,18 @@ module Test_MIP_solves run_algorithm!(BendersAlg) @test isapprox(BendersAlg.best_upper_bound, 5.8, rtol = 1e-6) @test isapprox(get_gap(BendersAlg), 0, rtol = 1e-6) + + gtest = build_graph() + BendersAlg = BendersAlgorithm(gtest, local_subgraphs(gtest)[2], max_iters = 20, multicut = true, regularize = false, parallelize_benders = false, strengthened = true); + run_algorithm!(BendersAlg) + @test isapprox(BendersAlg.best_upper_bound, 5.8, rtol = 1e-6) + @test isapprox(get_gap(BendersAlg), 0, rtol = 1e-6) + + gtest = build_graph() + BendersAlg = BendersAlgorithm(gtest, local_subgraphs(gtest)[2], max_iters = 20, multicut = true, parallelize_benders = true, strengthened = true); + run_algorithm!(BendersAlg) + @test isapprox(BendersAlg.best_upper_bound, 5.8, rtol = 1e-6) + @test isapprox(get_gap(BendersAlg), 0, rtol = 1e-6) # RemoteOptiGraph gtest = build_remote_graph() @@ -166,6 +178,18 @@ module Test_MIP_solves run_algorithm!(BendersAlg) @test isapprox(BendersAlg.best_upper_bound, 5.8, rtol = 1e-6) @test isapprox(get_gap(BendersAlg), 0, rtol = 1e-6) + + gtest = build_remote_graph() + BendersAlg = BendersAlgorithm(gtest, local_subgraphs(gtest)[2], max_iters = 20, multicut = true, regularize = false, parallelize_benders = false, strengthened = true); + run_algorithm!(BendersAlg) + @test isapprox(BendersAlg.best_upper_bound, 5.8, rtol = 1e-6) + @test isapprox(get_gap(BendersAlg), 0, rtol = 1e-6) + + gtest = build_remote_graph() + BendersAlg = BendersAlgorithm(gtest, local_subgraphs(gtest)[2], max_iters = 20, multicut = true, parallelize_benders = true, strengthened = true); + run_algorithm!(BendersAlg) + @test isapprox(BendersAlg.best_upper_bound, 5.8, rtol = 1e-6) + @test isapprox(get_gap(BendersAlg), 0, rtol = 1e-6) end function run_tests()