Skip to content

Commit ed53e61

Browse files
committed
Handle scip limits in BranchingDynamics::step_transition. Finish fix #98
1 parent 44e0d1f commit ed53e61

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

libecole/src/dynamics/branching.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,11 @@ auto BranchingDynamics::step_dynamics(scip::Model& model, std::size_t const& act
5050
}
5151
model.solve_iter_branch(SCIPcolGetVar(lp_cols[action]));
5252

53-
return {model.solve_iter_is_done(), action_set(model, pseudo_candidates)};
53+
auto const done = model.solve_iter_is_done();
54+
if (done) {
55+
return {done, {}};
56+
}
57+
return {done, action_set(model, pseudo_candidates)};
5458
}
5559

5660
} // namespace ecole::dynamics

libecole/tests/src/dynamics/test-branching.cpp

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ TEST_CASE("BranchingDynamics unit tests", "[unit][dynamics]") {
2525

2626
TEST_CASE("BranchingDynamics functional tests", "[dynamics]") {
2727
bool const pseudo_candidates = GENERATE(true, false);
28-
dynamics::BranchingDynamics dyn{pseudo_candidates};
28+
auto dyn = dynamics::BranchingDynamics{pseudo_candidates};
2929
auto model = get_model();
3030

3131
SECTION("Return valid action set") {
@@ -56,3 +56,25 @@ TEST_CASE("BranchingDynamics functional tests", "[dynamics]") {
5656
REQUIRE_THROWS_AS(dyn.step_dynamics(model, action), std::exception);
5757
}
5858
}
59+
60+
TEST_CASE("BranchingDynamics handles limits", "[dynamics]") {
61+
bool const pseudo_candidates = GENERATE(true, false);
62+
auto dyn = dynamics::BranchingDynamics{pseudo_candidates};
63+
auto model = get_model();
64+
65+
SECTION("Node limit") {
66+
auto const node_limit = GENERATE(0, 1, 2);
67+
model.set_param("limits/totalnodes", node_limit);
68+
}
69+
70+
SECTION("Time limit") {
71+
auto const time_limit = GENERATE(0, 1, 2);
72+
model.set_param("limits/time", time_limit);
73+
}
74+
75+
auto [done, action_set] = dyn.reset_dynamics(model);
76+
while (!done) {
77+
REQUIRE(action_set.has_value());
78+
std::tie(done, action_set) = dyn.step_dynamics(model, action_set.value()[0]);
79+
}
80+
}

0 commit comments

Comments
 (0)