diff --git a/docs/src/examples/air_conditioning_forward.jl b/docs/src/examples/air_conditioning_forward.jl index 27a97a2e1..45c3eb15b 100644 --- a/docs/src/examples/air_conditioning_forward.jl +++ b/docs/src/examples/air_conditioning_forward.jl @@ -37,8 +37,6 @@ SDDP.train( forward_pass = SDDP.AlternativeForwardPass(non_convex), post_iteration_callback = SDDP.AlternativePostIterationCallback(non_convex), iteration_limit = 10, - # TODO(odow): bug with Threaded? - parallel_scheme = SDDP.Serial(), ) Test.@test isapprox(SDDP.calculate_bound(non_convex), 62_500.0, atol = 0.1) Test.@test isapprox(SDDP.calculate_bound(convex), 62_500.0, atol = 0.1) diff --git a/src/algorithm.jl b/src/algorithm.jl index abb4034a0..7f9671259 100644 --- a/src/algorithm.jl +++ b/src/algorithm.jl @@ -1026,6 +1026,14 @@ function train( forward_pass_callback::Function = (x) -> nothing, post_iteration_callback = result -> nothing, ) + if any(node -> node.objective_state !== nothing, values(model.nodes)) + # FIXME(odow): Threaded is broken for objective states + parallel_scheme = Serial() + end + if forward_pass isa AlternativeForwardPass + # FIXME(odow): Threaded is broken for AlternativeForwardPass + parallel_scheme = Serial() + end if log_frequency <= 0 msg = "`log_frequency` must be at least `1`. Got $log_frequency." throw(ArgumentError(msg)) diff --git a/src/plugins/forward_passes.jl b/src/plugins/forward_passes.jl index 5b528c19d..a56ae65b5 100644 --- a/src/plugins/forward_passes.jl +++ b/src/plugins/forward_passes.jl @@ -81,7 +81,7 @@ function forward_pass( # incoming state is more than δ away from the other states, add it # as a possible starting state. if distance(starting_states, incoming_state_value) > - options.cycle_discretization_delta + options.cycle_discretization_delta push!(starting_states, incoming_state_value) end # TODO(odow): diff --git a/test/plugins/stopping_rules.jl b/test/plugins/stopping_rules.jl index f89ba17b4..8ab4a1083 100644 --- a/test/plugins/stopping_rules.jl +++ b/test/plugins/stopping_rules.jl @@ -316,7 +316,6 @@ function test_FirstStageStoppingRule() model; print_level = 0, stopping_rules = [SDDP.FirstStageStoppingRule()], - parallel_scheme = SDDP.Serial(), ), ) graph = SDDP.Graph(0, [1, 2], [(0 => 1, 0.5), (0 => 2, 0.5)]) @@ -338,7 +337,6 @@ function test_FirstStageStoppingRule() model; print_level = 0, stopping_rules = [SDDP.FirstStageStoppingRule()], - parallel_scheme = SDDP.Serial(), ), ) return diff --git a/test/user_interface.jl b/test/user_interface.jl index b7aa287ca..442c983fc 100644 --- a/test/user_interface.jl +++ b/test/user_interface.jl @@ -480,7 +480,7 @@ function test_objective_state() end @test_throws( ErrorException("No objective state defined."), - SDDP.simulate(model, 1; parallel_scheme = SDDP.Serial()), + SDDP.simulate(model, 1), ) @test_throws( ErrorException("add_objective_state can only be called once."), diff --git a/test/visualization/value_functions.jl b/test/visualization/value_functions.jl index eb7cd475d..b546a1615 100644 --- a/test/visualization/value_functions.jl +++ b/test/visualization/value_functions.jl @@ -103,13 +103,7 @@ function test_ValueFunction_objective_state() @stageobjective(sp, price * x.out) end end - SDDP.train( - model; - iteration_limit = 10, - print_level = 0, - # TODO(odow): FIXME: SDDP.Threaded() gets the wrong answer? - parallel_scheme = SDDP.Serial(), - ) + SDDP.train(model; iteration_limit = 10, print_level = 0) V1 = SDDP.ValueFunction(model[1]) @test_throws AssertionError SDDP.evaluate(V1, Dict(:x => 1.0)) @test SDDP.evaluate(V1, Dict(:x => 1.0); objective_state = 1) ==