Skip to content

Commit

Permalink
Merge pull request #789 from Ipuch/init_solution_2
Browse files Browse the repository at this point in the history
Refactor solution with classmethods
  • Loading branch information
pariterre committed Nov 2, 2023
2 parents 67a6ae9 + bfc7606 commit 3edb545
Show file tree
Hide file tree
Showing 10 changed files with 660 additions and 400 deletions.
4 changes: 2 additions & 2 deletions bioptim/examples/getting_started/example_simulation.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ def main():
X = InitialGuess([0, 0, 0, 0])
U = InitialGuess([-1, 1])

sol_from_initial_guess = Solution(ocp, [X, U])
sol_from_initial_guess = Solution.from_initial_guess(ocp, [X, U])
s = sol_from_initial_guess.integrate(shooting_type=Shooting.SINGLE, integrator=SolutionIntegrator.OCP)
print(f"Final position of q from single shooting of initial guess = {s.states['q'][:, -1]}")
# Uncomment the next line to animate the integration
Expand All @@ -37,7 +37,7 @@ def main():
U = np.random.rand(2, 31)
U = InitialGuess(U, interpolation=InterpolationType.EACH_FRAME)

sol_from_initial_guess = Solution(ocp, [X, U])
sol_from_initial_guess = Solution.from_initial_guess(ocp, [X, U])
s = sol_from_initial_guess.integrate(shooting_type=Shooting.SINGLE, integrator=SolutionIntegrator.OCP)
print(f"Final position of q from single shooting of initial guess = {s.states['q'][:, -1]}")
# Uncomment the next line to animate the integration
Expand Down
4 changes: 2 additions & 2 deletions bioptim/examples/torque_driven_ocp/example_soft_contact.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ def initial_states_from_single_shooting(model, ns, tf, ode_solver):
p = InitialGuessList()
s = InitialGuessList()

sol_from_initial_guess = Solution(ocp, [x, u, p, s])
sol_from_initial_guess = Solution.from_initial_guess(ocp, [x, u, p, s])
s = sol_from_initial_guess.integrate(shooting_type=Shooting.SINGLE, integrator=SolutionIntegrator.OCP)
# s.animate()

Expand All @@ -92,7 +92,7 @@ def initial_states_from_single_shooting(model, ns, tf, ode_solver):
p = InitialGuessList()
s = InitialGuessList()

sol_from_initial_guess = Solution(ocp, [x, u, p, s])
sol_from_initial_guess = Solution.from_initial_guess(ocp, [x, u, p, s])
s = sol_from_initial_guess.integrate(shooting_type=Shooting.SINGLE, integrator=SolutionIntegrator.OCP)
# s.animate()

Expand Down
2 changes: 1 addition & 1 deletion bioptim/gui/plot.py
Original file line number Diff line number Diff line change
Expand Up @@ -687,7 +687,7 @@ def update_data(self, v: dict):

self.ydata = []

sol = Solution(self.ocp, v)
sol = Solution.from_vector(self.ocp, v)

if all([nlp.ode_solver.is_direct_collocation for nlp in self.ocp.nlp]):
# no need to integrate when using direct collocation
Expand Down
3 changes: 2 additions & 1 deletion bioptim/optimization/non_linear_program.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@

import casadi
from casadi import SX, MX, Function, horzcat
import numpy as np

from .optimization_variable import OptimizationVariable, OptimizationVariableContainer
from ..dynamics.ode_solver import OdeSolver
from ..limits.path_conditions import InitialGuessList, BoundsList
from ..misc.enums import ControlType, PhaseDynamics
from ..misc.enums import ControlType, PhaseDynamics, Shooting
from ..misc.options import OptionList
from ..misc.mapping import NodeMapping
from ..dynamics.dynamics_evaluation import DynamicsEvaluation
Expand Down
2 changes: 1 addition & 1 deletion bioptim/optimization/optimal_control_program.py
Original file line number Diff line number Diff line change
Expand Up @@ -1584,7 +1584,7 @@ def solve(
self.ocp_solver.solve()
self.is_warm_starting = False

return Solution(self, self.ocp_solver.get_optimized_value())
return Solution.from_dict(self, self.ocp_solver.get_optimized_value())

def set_warm_start(self, sol: Solution):
"""
Expand Down
8 changes: 4 additions & 4 deletions bioptim/optimization/receding_horizon_optimization.py
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ def _initialize_solution(self, states: list, controls: list):
)
s_init = InitialGuessList()
p_init = InitialGuessList()
return Solution(solution_ocp, [x_init, u_init_for_solution, p_init, s_init])
return Solution.from_initial_guess(solution_ocp, [x_init, u_init_for_solution, p_init, s_init])

def advance_window(self, sol: Solution, steps: int = 0, **advance_options):
state_bounds_have_changed = self.advance_window_bounds_states(sol, **advance_options)
Expand Down Expand Up @@ -456,7 +456,7 @@ def _initialize_solution(self, states: list, controls: list):
)
s_init = InitialGuessList()
p_init = InitialGuessList()
return Solution(solution_ocp, [x_init, u_init_for_solution, p_init, s_init])
return Solution.from_initial_guess(solution_ocp, [x_init, u_init_for_solution, p_init, s_init])

def _initialize_state_idx_to_cycle(self, options):
if "states" not in options:
Expand Down Expand Up @@ -691,7 +691,7 @@ def _initialize_solution(self, states: list, controls: list):
)
s_init = InitialGuessList()
p_init = InitialGuessList()
return Solution(solution_ocp, [x_init, u_init_for_solution, p_init, s_init])
return Solution.from_initial_guess(solution_ocp, [x_init, u_init_for_solution, p_init, s_init])

def _initialize_one_cycle(self, states: np.ndarray, controls: np.ndarray):
"""return a solution for a single window kept of the MHE"""
Expand Down Expand Up @@ -731,7 +731,7 @@ def _initialize_one_cycle(self, states: np.ndarray, controls: np.ndarray):
)
s_init = InitialGuessList()
p_init = InitialGuessList()
return Solution(solution_ocp, [x_init, u_init_for_solution, p_init, s_init])
return Solution.from_initial_guess(solution_ocp, [x_init, u_init_for_solution, p_init, s_init])


class NonlinearModelPredictiveControl(RecedingHorizonOptimization):
Expand Down

0 comments on commit 3edb545

Please sign in to comment.