Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions tests/shard4/test_variational_integrator_examples.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ def test_variational_pendulum(use_sx):

# --- Solve the ocp --- #
sol = ocp.solve(Solver.IPOPT())
TestUtils.assert_solver_success(sol, max_iterations=100)
states = sol.decision_states(to_merge=SolutionMerge.NODES)
controls = sol.decision_controls(to_merge=SolutionMerge.NODES)

Expand Down Expand Up @@ -64,6 +65,7 @@ def test_variational_pendulum_with_holonomic_constraints(use_sx):

# --- Solve the ocp --- #
sol = ocp.solve(Solver.IPOPT())
TestUtils.assert_solver_success(sol, max_iterations=100)
states = sol.decision_states(to_merge=SolutionMerge.NODES)
controls = sol.decision_controls(to_merge=SolutionMerge.NODES)

Expand Down
12 changes: 12 additions & 0 deletions tests/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,18 @@


class TestUtils:
@staticmethod
def assert_solver_success(solution: Solution, max_iterations: int | None = None):
"""Assert convergence and optionally guard against a large iteration-count regression."""
assert solution.status == 0, (
f"Solver did not converge (status={solution.status}, iterations={solution.iterations})"
)
assert isinstance(solution.iterations, int) and solution.iterations >= 0
if max_iterations is not None:
assert solution.iterations <= max_iterations, (
f"Solver iteration regression: {solution.iterations} iterations, expected at most {max_iterations}"
)

@staticmethod
def bioptim_folder() -> str:
return TestUtils._capitalize_folder_drive(str(Path(__file__).parent / "../bioptim"))
Expand Down
Loading