Skip to content

Commit 6fe1a3d

Browse files
dlcole3Copilot
andauthored
Support Sequential Backwards Pass (#30)
* Added sequential backwards pass * Added sequential backwards pass option * Removed duplicate Export Co-authored-by: Copilot <[email protected]> --------- Co-authored-by: Copilot <[email protected]>
1 parent 8228ae5 commit 6fe1a3d

File tree

8 files changed

+224
-139
lines changed

8 files changed

+224
-139
lines changed

lib/PlasmoBenders/Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "PlasmoBenders"
22
uuid = "491f1417-53b2-48aa-b9da-44cdd6c031b7"
33
authors = ["David Cole"]
4-
version = "0.1.4"
4+
version = "0.2.0"
55

66
[deps]
77
Plasmo = "d3f7391f-f14a-50cc-bbe4-76a32d1bad3c"

lib/PlasmoBenders/examples/Benders_MILP.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
using Revise
2-
using Plasmo, JuMP, HiGHS, Plots, PlasmoBenders
2+
using Plasmo, JuMP, HiGHS, PlasmoBenders
33

44
g = OptiGraph()
55
set_optimizer(g, HiGHS.Optimizer)
@@ -32,7 +32,7 @@ for i in 1:length(subgraphs)
3232
set_optimizer(subgraphs[i], optimizer_with_attributes(HiGHS.Optimizer, "output_flag" => false))
3333
end
3434

35-
BendersOpt = BendersAlgorithm(g, subgraphs[1]; max_iters = 30, add_slacks = true, fix_slacks = true, strengthened = true)
35+
BendersOpt = BendersAlgorithm(g, subgraphs[1]; max_iters = 30, add_slacks = true, sequential_backward_pass = true, strengthened = true)
3636

3737
t2 = @elapsed begin
3838
run_algorithm!(BendersOpt)

lib/PlasmoBenders/examples/Benders_MILP_parallel.jl

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using Revise
2-
using Plasmo, JuMP, HiGHS, Plots, PlasmoBenders
3-
using Plasmo, HiGHS, JuMP
2+
using Plasmo, HiGHS, JuMP, PlasmoBenders
43

54
g0 = OptiGraph()
65
g1 = OptiGraph()
@@ -38,7 +37,7 @@ for i in gs
3837
set_optimizer(i, solver)
3938
end
4039

41-
BendersOpt = BendersAlgorithm(g0, g1; max_iters = 20, parallelize_benders = true, regularize = false)
40+
BendersOpt = BendersAlgorithm(g0, g1; max_iters = 20, sequential_backward_pass = true, regularize = false, strengthened = true)
4241

4342
t2 = @elapsed begin
4443
run_algorithm!(BendersOpt)

lib/PlasmoBenders/src/Benders.jl

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ mutable struct BendersOptions <: AbstractPBOptions
3636
multicut::Bool
3737
feasibility_cuts::Bool
3838
regularize::Bool
39+
sequential_backward_pass::Bool
3940
parallelize_benders::Bool
4041
parallelize_forward::Bool
4142
parallelize_backward::Bool
@@ -54,6 +55,7 @@ mutable struct BendersOptions <: AbstractPBOptions
5455
options.multicut = false
5556
options.feasibility_cuts = false
5657
options.regularize = false
58+
options.sequential_backward_pass = false
5759
options.parallelize_benders = false
5860
options.parallelize_forward = false
5961
options.parallelize_backward = false
@@ -329,6 +331,7 @@ function BendersAlgorithm(
329331
multicut::Bool = true,
330332
feasibility_cuts::Bool = false,
331333
regularize::Bool = false,
334+
sequential_backward_pass::Bool = false,
332335
parallelize_benders::Bool = false,
333336
parallelize_forward::Bool = false,
334337
parallelize_backward::Bool = false,
@@ -357,6 +360,7 @@ function BendersAlgorithm(
357360
set_multicut!(optimizer, multicut)
358361
set_feasibility_cuts!(optimizer, feasibility_cuts)
359362
set_regularize!(optimizer, regularize)
363+
set_sequential_backward_pass!(optimizer, sequential_backward_pass)
360364
set_parallelize_benders!(optimizer, parallelize_benders)
361365
set_parallelize_forward!(optimizer, parallelize_forward)
362366
set_parallelize_backward!(optimizer, parallelize_backward)
@@ -371,6 +375,22 @@ function BendersAlgorithm(
371375
if parallelize_forward
372376
@warn("`parallelize_forward` is not yet supported. Benders will run, but the forward pass will not be parallelized")
373377
end
378+
if sequential_backward_pass && parallelize_backward
379+
@warn(
380+
"`sequential_backward_pass` and `parallelize_backward` cannot both be set to true. " *
381+
"`parallelize_backward` is being set to `false`"
382+
)
383+
parallelize_backward = false
384+
set_parallelize_backward!(optimizer, false)
385+
end
386+
if sequential_backward_pass && parallelize_benders
387+
@warn(
388+
"`sequential_backward_pass` and `parallelize_benders` cannot both be set to true. " *
389+
"`sequential_backward_pass` is being set to `false`"
390+
)
391+
sequential_backward_pass = false
392+
set_sequential_backward_pass!(optimizer, false)
393+
end
374394
if feasibility_cuts
375395
@warn(
376396
"`feasibility_cuts` have been implemented but are still under development. " *
@@ -497,6 +517,8 @@ function BendersAlgorithm(
497517
# Construct regularization abilities if needed
498518
if get_regularize(optimizer)
499519
_construct_regularize!(optimizer)
520+
@info("You have set regularize to `true`, so the algorithm will perform an extra optimization step with a zero objective. " *
521+
"Current Plasmo versions throw a warning if the objective is zero. These warnings during `run_algorithm!` can be ignored.")
500522
end
501523
end
502524

@@ -720,22 +742,23 @@ function _backward_pass!(optimizer::BendersAlgorithm; strengthened::Bool = false
720742
len_solve_order = length(optimizer.solve_order)
721743

722744
# Perform backward pass in parallel
723-
#Threads.@threads for i in 1:len_solve_order
724745
if get_parallelize_backward(optimizer) || get_parallelize_benders(optimizer)
725-
Threads.@threads for i in 1:len_solve_order
746+
Threads.@threads for i in len_solve_order:-1:1
726747
_optimize_in_backward_pass(optimizer, i)
727748
end
728749
else
729-
for i in 1:len_solve_order
750+
for i in len_solve_order:-1:1
730751
_optimize_in_backward_pass(optimizer, i)
731752
end
732753
end
733754

734755
# Add constraint on the cost-to-go to last node Bender's cut
735-
if get_strengthened(optimizer)
736-
_add_strengthened_cuts!(optimizer)
737-
else
738-
_add_Benders_cuts!(optimizer)
756+
if !(get_sequential_backward_pass(optimizer))
757+
if get_strengthened(optimizer)
758+
_add_strengthened_cuts!(optimizer)
759+
else
760+
_add_Benders_cuts!(optimizer)
761+
end
739762
end
740763

741764
return nothing

0 commit comments

Comments
 (0)