@@ -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