Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[RTM when tests pass] Refactor solution with classmethods #789

Merged
merged 10 commits into from
Nov 2, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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