From fcd31590ea754ed0da5c82d4e7ae74f3cde15765 Mon Sep 17 00:00:00 2001 From: mickaelbegon Date: Wed, 22 Jul 2026 09:40:07 -0400 Subject: [PATCH 1/2] Test printing OCPs without controls --- tests/shard6/test_controltype_none.py | 49 ++++++++++++++++++--------- 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/tests/shard6/test_controltype_none.py b/tests/shard6/test_controltype_none.py index a444bf31e..ba6f65e20 100644 --- a/tests/shard6/test_controltype_none.py +++ b/tests/shard6/test_controltype_none.py @@ -28,6 +28,7 @@ ConfigureVariables, StateDynamics, ) +from bioptim.gui.graph import OcpToGraph class NonControlledMethod(StateDynamics): @@ -99,10 +100,10 @@ def dynamics( controls: MX | SX, parameters: MX | SX, algebraic_states: MX | SX, + numerical_timeseries: MX | SX, nlp: NonLinearProgram, - my_ocp, ) -> DynamicsEvaluation: - t_phase = my_ocp.nlp[-1].tf + t_phase = nlp.tf return DynamicsEvaluation( dxdt=self.system_dynamics(a=states[0], b=states[1], c=states[2], t=time, t_phase=t_phase), @@ -176,18 +177,7 @@ def prepare_ocp( ------- The OptimalControlProgram ready to be solved """ - models = ( - NonControlledMethod(), - NonControlledMethod(), - NonControlledMethod(), - NonControlledMethod(), - NonControlledMethod(), - NonControlledMethod(), - NonControlledMethod(), - NonControlledMethod(), - NonControlledMethod(), - NonControlledMethod(), - ) + models = tuple(NonControlledMethod() for _ in range(n_phase)) n_shooting = [5 for i in range(n_phase)] # Gives m node shooting for my n phases problem final_time = [0.01 for i in range(n_phase)] # Set the final time for all my n phases @@ -212,10 +202,22 @@ def prepare_ocp( objective_functions = ObjectiveList() objective_functions.add( - ObjectiveFcn.Mayer.MINIMIZE_STATE, target=5, key="c", node=Node.END, quadratic=True, weight=1, phase=9 + ObjectiveFcn.Mayer.MINIMIZE_STATE, + target=5, + key="c", + node=Node.END, + quadratic=True, + weight=1, + phase=n_phase - 1, ) objective_functions.add( - ObjectiveFcn.Mayer.MINIMIZE_STATE, target=100, key="a", node=Node.END, quadratic=True, weight=0.001, phase=9 + ObjectiveFcn.Mayer.MINIMIZE_STATE, + target=100, + key="a", + node=Node.END, + quadratic=True, + weight=0.001, + phase=n_phase - 1, ) # Sets the bound for all the phases @@ -237,6 +239,21 @@ def prepare_ocp( ) +def test_print_control_type_none(capsys): + ocp = prepare_ocp( + n_phase=1, + time_min=[0.01], + time_max=[0.1], + use_sx=False, + ) + + ocp.print(to_console=True, to_graph=False) + graph = OcpToGraph(ocp)._prepare_print() + + assert "CONTROLS" in capsys.readouterr().out + assert "cluster_0" in graph.source + + @pytest.mark.parametrize("phase_dynamics", [PhaseDynamics.ONE_PER_NODE]) @pytest.mark.parametrize("use_sx", [False, True]) def test_main_control_type_none(use_sx, phase_dynamics): From cb58f0bae62a21a61adeb5b0746a45c1bf3c888f Mon Sep 17 00:00:00 2001 From: mickaelbegon Date: Sun, 26 Jul 2026 16:35:02 -0400 Subject: [PATCH 2/2] Trigger CI after unrelated Windows failure