From 23d51047304f2a07c3dbd030043f009f840cd0fc Mon Sep 17 00:00:00 2001 From: Mac-eve Date: Tue, 11 Jul 2023 13:28:17 +0200 Subject: [PATCH 01/54] init and SOCP class --- bioptim/__init__.py | 1 + bioptim/optimization/stochastic_optimal_control_program.py | 0 2 files changed, 1 insertion(+) create mode 100644 bioptim/optimization/stochastic_optimal_control_program.py diff --git a/bioptim/__init__.py b/bioptim/__init__.py index 1ae597958..6aa2770fe 100644 --- a/bioptim/__init__.py +++ b/bioptim/__init__.py @@ -213,5 +213,6 @@ from .optimization.solution import Solution from .optimization.optimization_variable import OptimizationVariableList from .optimization.variable_scaling import VariableScalingList, VariableScaling +from .optimization.stochastic_optimal_control_program import StochasticOptimalControlProgram from .misc.casadi_expand import lt, le, gt, ge, if_else, if_else_zero diff --git a/bioptim/optimization/stochastic_optimal_control_program.py b/bioptim/optimization/stochastic_optimal_control_program.py new file mode 100644 index 000000000..e69de29bb From b1c4b2fa86951f7a9d51847b1a0ae5ee1a6041ff Mon Sep 17 00:00:00 2001 From: Mac-eve Date: Tue, 11 Jul 2023 13:28:24 +0200 Subject: [PATCH 02/54] configure_problem --- bioptim/dynamics/configure_problem.py | 274 ++++++++++++++++++++++++-- 1 file changed, 260 insertions(+), 14 deletions(-) diff --git a/bioptim/dynamics/configure_problem.py b/bioptim/dynamics/configure_problem.py index 88847011b..3500daa99 100644 --- a/bioptim/dynamics/configure_problem.py +++ b/bioptim/dynamics/configure_problem.py @@ -1,6 +1,6 @@ from typing import Callable, Any -from casadi import MX, vertcat, Function +from casadi import MX, vertcat, Function, DM import numpy as np from .dynamics_functions import DynamicsFunctions @@ -609,6 +609,7 @@ def configure_dynamics_function(ocp, nlp, dyn_func, expand: bool = True, **extra nlp.states.scaled.mx_reduced, nlp.controls.scaled.mx_reduced, nlp.parameters.mx, + nlp.stochastic_variables.mx, nlp, **extra_params, ) @@ -622,9 +623,10 @@ def configure_dynamics_function(ocp, nlp, dyn_func, expand: bool = True, **extra nlp.states.scaled.mx_reduced, nlp.controls.scaled.mx_reduced, nlp.parameters.mx, + nlp.stochastic_variables.mx, ], [dynamics_dxdt], - ["x", "u", "p"], + ["x", "u", "p", "s"], ["xdot"], ) if expand: @@ -637,12 +639,15 @@ def configure_dynamics_function(ocp, nlp, dyn_func, expand: bool = True, **extra nlp.states.scaled.mx_reduced, nlp.controls.scaled.mx_reduced, nlp.parameters.mx, + nlp.stochastic_variables.mx, nlp.states_dot.scaled.mx_reduced, ], [dynamics_eval.defects], - ["x", "u", "p", "xdot"], + ["x", "u", "p", "s", "xdot"], ["defects"], - ).expand() + ) + if expand: + nlp.implicit_dynamics_func = nlp.implicit_dynamics_func.expand() @staticmethod def configure_contact_function(ocp, nlp, dyn_func: Callable, **extra_params): @@ -880,6 +885,7 @@ def configure_new_variable( as_states: bool, as_controls: bool, as_states_dot: bool = False, + as_stochastic: bool = False, fatigue: FatigueList = None, combine_name: str = None, combine_state_control_plot: bool = False, @@ -905,6 +911,8 @@ def configure_new_variable( If the new variable should be added to the state_dot variable set as_controls: bool If the new variable should be added to the control variable set + as_stochastic: bool + If the new variable should be added to the stochastic variable set fatigue: FatigueList The list of fatigable item combine_name: str @@ -1003,6 +1011,7 @@ def define_cx_unscaled(_cx_scaled: list, scaling: np.ndarray) -> list: [] if not copy_states_dot else [ocp.nlp[nlp.use_states_dot_from_phase_idx].states_dot[0][name].mx] ) mx_controls = [] if not copy_controls else [ocp.nlp[nlp.use_controls_from_phase_idx].controls[0][name].mx] + mx_stochastic = [] # todo: if mapping on variables, what do we do with mapping on the nodes for i in nlp.variable_mappings[name].to_second.map_idx: @@ -1017,23 +1026,27 @@ def define_cx_unscaled(_cx_scaled: list, scaling: np.ndarray) -> list: if not copy_controls: mx_controls.append(MX.sym(var_name, 1, 1)) + mx_stochastic.append(MX.sym(var_name, 1, 1)) + mx_states = vertcat(*mx_states) mx_states_dot = vertcat(*mx_states_dot) mx_controls = vertcat(*mx_controls) + mx_stochastic = vertcat(*mx_stochastic) if not axes_idx: axes_idx = BiMapping(to_first=range(len(name_elements)), to_second=range(len(name_elements))) - legend = [] - for idx, name_el in enumerate(name_elements): - if idx is not None and idx in axes_idx.to_first.map_idx: - current_legend = f"{name}_{name_el}" - for i in range(ocp.n_phases): - if as_states: - current_legend += f"-{ocp.nlp[i].use_states_from_phase_idx}" - if as_controls: - current_legend += f"-{ocp.nlp[i].use_controls_from_phase_idx}" - legend += [current_legend] + if not skip_plot: + legend = [] + for idx, name_el in enumerate(name_elements): + if idx is not None and idx in axes_idx.to_first.map_idx: + current_legend = f"{name}_{name_el}" + for i in range(ocp.n_phases): + if as_states: + current_legend += f"-{ocp.nlp[i].use_states_from_phase_idx}" + if as_controls: + current_legend += f"-{ocp.nlp[i].use_controls_from_phase_idx}" + legend += [current_legend] if as_states: for node_index in range((0 if ocp.assume_phase_dynamics else nlp.ns) + 1): @@ -1105,6 +1118,55 @@ def define_cx_unscaled(_cx_scaled: list, scaling: np.ndarray) -> list: ) nlp.states_dot.append(name, cx[0], cx_scaled[0], mx_states_dot, nlp.variable_mappings[name], node_index) + if as_stochastic: + for node_index in range((0 if ocp.assume_phase_dynamics else nlp.ns) + 1): + n_cx = nlp.ode_solver.polynomial_degree + 1 if isinstance(nlp.ode_solver, OdeSolver.COLLOCATION) else 3 + if n_cx < 3: + n_cx = 3 + cx_scaled = define_cx_scaled(n_col=n_cx, n_shooting=1, initial_node=node_index) + nlp.stochastic_variables.append(name, cx_scaled[0], cx_scaled[0], mx_stochastic, nlp.variable_mappings[name], node_index) + + @staticmethod + def configure_integrated_value( + name: str, + name_elements: list, + ocp, + nlp, + initial_matrix: DM, + ): + """ + Add a new integrated value. This creates an MX (not an optimization variable) that is integrated using the + integrated_value_functions function provided. This integrated_value can be used in the constraints and objectives + without having to recompute them over and over again. + Parameters + ---------- + name: str + The name of the new variable to add + name_elements: list[str] + The name of each element of the vector + ocp: OptimalControlProgram + A reference to the ocp + nlp: NonLinearProgram + A reference to the phase + initial_matrix: DM + The initial value of the integrated value + """ + + # TODO: compute values at collocation points + # but for now only cx_start can be used + n_cx = nlp.ode_solver.polynomial_degree + 1 if isinstance(nlp.ode_solver, OdeSolver.COLLOCATION) else 3 + if n_cx < 3: + n_cx = 3 + + dummy_mapping = Mapping(list(range(len(name_elements)))) + initial_vector = nlp.integrated_values.reshape_to_vector(initial_matrix) + cx_scaled_next_formatted = [initial_vector for _ in range(n_cx)] + nlp.integrated_values.append(name, cx_scaled_next_formatted, cx_scaled_next_formatted, initial_matrix, dummy_mapping, 0) + for node_index in range(1, nlp.ns + 1): # cannot use assume_phase_dynamics = True + cx_scaled_next = nlp.integrated_value_functions[name](nlp, node_index) + cx_scaled_next_formatted = [cx_scaled_next for _ in range(n_cx)] + nlp.integrated_values.append(name, cx_scaled_next_formatted, cx_scaled_next_formatted, cx_scaled_next, dummy_mapping, node_index) + @staticmethod def configure_q(ocp, nlp, as_states: bool, as_controls: bool, as_states_dot: bool = False): """ @@ -1196,6 +1258,190 @@ def configure_qdddot(ocp, nlp, as_states: bool, as_controls: bool): axes_idx = ConfigureProblem._apply_phase_mapping(ocp, nlp, name) ConfigureProblem.configure_new_variable(name, name_qdddot, ocp, nlp, as_states, as_controls, axes_idx=axes_idx) + + @staticmethod + def configure_stochastic_k(ocp, nlp, n_noised_controls: int, n_feedbacks: int): + """ + Configure the optimal feedback gain matrix K. + Parameters + ---------- + nlp: NonLinearProgram + A reference to the phase + """ + name = "k" + + if name in nlp.variable_mappings: + raise NotImplementedError(f"Stochastic variables and mapping cannot be use together for now.") + + name_k = [] + control_names = [f"control_{i}" for i in range(n_noised_controls)] + feedback_names = [f"feedback_{i}" for i in range(n_feedbacks)] + for name_1 in control_names: + for name_2 in feedback_names: + name_k += [name_1 + "_&_" + name_2] + nlp.variable_mappings[name] = BiMapping(list(range(len(control_names)*len(feedback_names))), list(range(len(control_names)*len(feedback_names)))) + ConfigureProblem.configure_new_variable( + name, + name_k, + ocp, + nlp, + as_states=False, + as_controls=False, + as_states_dot=False, + as_stochastic=True, + skip_plot=True, + ) + + @staticmethod + def configure_stochastic_c(ocp, nlp, n_noised_states: int): + """ + Configure the stochastic variable matrix C representing the injection of motor noise (df/dw). + Parameters + ---------- + nlp: NonLinearProgram + A reference to the phase + """ + name = "c" + + if name in nlp.variable_mappings: + raise NotImplementedError(f"Stochastic variables and mapping cannot be use together for now.") + + name_c = [] + for name_1 in [f"X_{i}" for i in range(n_noised_states)]: + for name_2 in [f"X_{i}" for i in range(n_noised_states)]: + name_c += [name_1 + "_&_" + name_2] + nlp.variable_mappings[name] = BiMapping(list(range(n_noised_states ** 2)), list(range(n_noised_states ** 2))) + + ConfigureProblem.configure_new_variable( + name, + name_c, + ocp, + nlp, + as_states=False, + as_controls=False, + as_states_dot=False, + as_stochastic=True, + skip_plot=True, + ) + + @staticmethod + def configure_stochastic_a(ocp, nlp, n_noised_states: int): + """ + Configure the stochastic variable matrix A representing the propagation of motor noise (df/dx). + Parameters + ---------- + nlp: NonLinearProgram + A reference to the phase + """ + name = "a" + + if name in nlp.variable_mappings: + raise NotImplementedError(f"Stochastic variables and mapping cannot be use together for now.") + + name_a = [] + for name_1 in [f"X_{i}" for i in range(n_noised_states)]: + for name_2 in [f"X_{i}" for i in range(n_noised_states)]: + name_a += [name_1 + "_&_" + name_2] + nlp.variable_mappings[name] = BiMapping(list(range(n_noised_states ** 2)), list(range(n_noised_states ** 2))) + + ConfigureProblem.configure_new_variable( + name, + name_a, + ocp, + nlp, + as_states=False, + as_controls=False, + as_states_dot=False, + as_stochastic=True, + skip_plot=True, + ) + + @staticmethod + def configure_stochastic_cov(ocp, nlp, n_noised_states: int, initial_matrix: DM): + """ + Configure the covariance matrix P representing the motor noise. + Parameters + ---------- + nlp: NonLinearProgram + A reference to the phase + """ + name = "cov" + + if name in nlp.variable_mappings: + raise NotImplementedError(f"Stochastic variables and mapping cannot be use together for now.") + + name_cov = [] + for name_1 in [f"X_{i}" for i in range(n_noised_states)]: + for name_2 in [f"X_{i}" for i in range(n_noised_states)]: + name_cov += [name_1 + "_&_" + name_2] + nlp.variable_mappings[name] = BiMapping(list(range(n_noised_states**2)), list(range(n_noised_states**2))) + ConfigureProblem.configure_integrated_value( + name, + name_cov, + ocp, + nlp, + initial_matrix=initial_matrix, + ) + + @staticmethod + def configure_stochastic_ee_ref(ocp, nlp, n_references: int): + """ + Configure the reference kinematics. + Parameters + ---------- + nlp: NonLinearProgram + A reference to the phase + """ + name = "ee_ref" + + if name in nlp.variable_mappings: + raise NotImplementedError(f"Stochastic variables and mapping cannot be use together for now.") + + name_ee_ref = [f"reference_{i}" for i in range(n_references)] + nlp.variable_mappings[name] = BiMapping(list(range(n_references)), list(range(n_references))) + ConfigureProblem.configure_new_variable( + name, + name_ee_ref, + ocp, + nlp, + as_states=False, + as_controls=False, + as_states_dot=False, + as_stochastic=True, + skip_plot=True, + ) + + @staticmethod + def configure_stochastic_m(ocp, nlp, n_noised_states: int): + """ + Configure the helper matrix M (from Gillis 2013 : https://doi.org/10.1109/CDC.2013.6761121). + Parameters + ---------- + nlp: NonLinearProgram + A reference to the phase + """ + name = "m" + + if name in nlp.variable_mappings: + raise NotImplementedError(f"Stochastic variables and mapping cannot be use together for now.") + + name_m = [] + for name_1 in [f"X_{i}" for i in range(n_noised_states)]: + for name_2 in [f"X_{i}" for i in range(n_noised_states)]: + name_m += [name_1 + "_&_" + name_2] + nlp.variable_mappings[name] = BiMapping(list(range(n_noised_states**2)), list(range(n_noised_states**2))) + ConfigureProblem.configure_new_variable( + name, + name_m, + ocp, + nlp, + as_states=False, + as_controls=False, + as_states_dot=False, + as_stochastic=True, + skip_plot=True, + ) + @staticmethod def configure_tau(ocp, nlp, as_states: bool, as_controls: bool, fatigue: FatigueList = None): """ From 31456c20348fd4fecbfc76a5f117d81b76d5fb45 Mon Sep 17 00:00:00 2001 From: Mac-eve Date: Tue, 11 Jul 2023 13:42:59 +0200 Subject: [PATCH 03/54] dynamics --- .gitignore | 3 +++ bioptim/dynamics/dynamics_functions.py | 4 ++-- bioptim/dynamics/ode_solver.py | 2 ++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 0bf0fd2e2..7ad9c94ef 100644 --- a/.gitignore +++ b/.gitignore @@ -114,3 +114,6 @@ c_generated_code # Bioptim files bioptim/sandbox/ *.pkl + +# Mac dev +*.DS_store diff --git a/bioptim/dynamics/dynamics_functions.py b/bioptim/dynamics/dynamics_functions.py index 12ae0af0a..76a42d364 100644 --- a/bioptim/dynamics/dynamics_functions.py +++ b/bioptim/dynamics/dynamics_functions.py @@ -42,7 +42,7 @@ class DynamicsFunctions: """ @staticmethod - def custom(states: MX.sym, controls: MX.sym, parameters: MX.sym, nlp) -> DynamicsEvaluation: + def custom(states: MX.sym, controls: MX.sym, parameters: MX.sym, stochastic_variables: MX.sym, nlp) -> DynamicsEvaluation: """ Interface to custom dynamic function provided by the user. @@ -65,7 +65,7 @@ def custom(states: MX.sym, controls: MX.sym, parameters: MX.sym, nlp) -> Dynamic The defects of the implicit dynamics """ - return nlp.dynamics_type.dynamic_function(states, controls, parameters, nlp) + return nlp.dynamics_type.dynamic_function(states, controls, parameters, stochastic_variables, nlp) @staticmethod def torque_driven( diff --git a/bioptim/dynamics/ode_solver.py b/bioptim/dynamics/ode_solver.py index 6d91283a2..4f25eda7c 100644 --- a/bioptim/dynamics/ode_solver.py +++ b/bioptim/dynamics/ode_solver.py @@ -144,6 +144,7 @@ def integrator(self, ocp, nlp, node_index: int) -> list: "p_scaled": nlp.controls.scaled.cx_start if nlp.control_type in (ControlType.CONSTANT, ControlType.NONE) else horzcat(nlp.controls.scaled.cx_start, nlp.controls.scaled.cx_end), + "stochastic_variables": nlp.stochastic_variables.cx_start, "ode": nlp.dynamics_func, "implicit_ode": nlp.implicit_dynamics_func, } @@ -304,6 +305,7 @@ def integrator(self, ocp, nlp, node_index: int) -> list: "x_scaled": [nlp.states.scaled.cx_start] + nlp.states.scaled.cx_intermediates_list, "p_unscaled": nlp.controls.cx_start, "p_scaled": nlp.controls.scaled.cx_start, + "stochastic_variables": nlp.stochastic_variables.cx_start, "ode": nlp.dynamics_func, "implicit_ode": nlp.implicit_dynamics_func, } From ceac023b03f575e72676e28a71e2e8bd51603c87 Mon Sep 17 00:00:00 2001 From: Mac-eve Date: Tue, 11 Jul 2023 13:43:15 +0200 Subject: [PATCH 04/54] examples --- .../arm_reaching_muscle_driven.py | 914 ++ .../arm_reaching_torque_driven.py | 698 + .../models/LeuvenArmModel.bioMod | 167 + .../models/mesh/arm_r_humerus.vtp | 1228 ++ .../models/mesh/arm_r_ulna.vtp | 842 ++ .../models/mesh/ground_ribs.vtp | 10998 ++++++++++++++++ .../models/mesh/pendulum.vtp | 1973 +++ 7 files changed, 16820 insertions(+) create mode 100644 bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py create mode 100644 bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py create mode 100644 bioptim/examples/stochastic_optimal_control/models/LeuvenArmModel.bioMod create mode 100644 bioptim/examples/stochastic_optimal_control/models/mesh/arm_r_humerus.vtp create mode 100644 bioptim/examples/stochastic_optimal_control/models/mesh/arm_r_ulna.vtp create mode 100644 bioptim/examples/stochastic_optimal_control/models/mesh/ground_ribs.vtp create mode 100644 bioptim/examples/stochastic_optimal_control/models/mesh/pendulum.vtp diff --git a/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py b/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py new file mode 100644 index 000000000..c0867ee12 --- /dev/null +++ b/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py @@ -0,0 +1,914 @@ +""" +This example replicates the results from "An approximate stochastic optimal control framework to simulate nonlinear +neuro-musculoskeletal models in the presence of noise"(https://doi.org/10.1371/journal.pcbi.1009338). +The task is to unfold the arm to reach a target further from the trunk. +Noise is added on the motor execution (wM) and on the feedback (wEE=wP and wEE_dot=wPdot). +The expected joint angles (x_mean) are optimized like in a deterministic OCP, but the covariance matrix is minimized to +reduce uncertainty. This covariance matrix is computed from the expected states. +""" + +import platform + +from typing import Callable +import pickle +import biorbd_casadi as biorbd +import matplotlib.pyplot as plt +import casadi as cas +import numpy as np +import scipy.io as sio + +# import sys +# sys.path.append("/home/charbie/Documents/Programmation/BiorbdOptim") +from bioptim import ( + OptimalControlProgram, + StochasticOptimalControlProgram, + Bounds, + InitialGuess, + ObjectiveFcn, + Solver, + ObjectiveList, + NonLinearProgram, + DynamicsEvaluation, + DynamicsFunctions, + ConfigureProblem, + DynamicsList, + BoundsList, + InterpolationType, + OcpType, + PenaltyController, + Node, + ConstraintList, + ConstraintFcn, + MultinodeConstraintList, + MultinodeObjectiveList, +) + + +class LeuvenArmModel: + """ + This allows to generate the same model as in the paper. + """ + + def __init__(self): + self.dM_coefficients = np.array([[0, 0, 0.0100, 0.0300, -0.0110, 1.9000], + [0, 0, 0.0100, -0.0190, 0, 0.0100], + [0.0400, -0.0080, 1.9000, 0, 0, 0.0100], + [-0.0420, 0, 0.0100, 0, 0, 0.0100], + [0.0300, -0.0110, 1.9000, 0.0320, -0.0100, 1.9000], + [-0.0390, 0, 0.0100, -0.0220, 0, 0.0100]]) + self.LMT_coefficients = np.array([[1.1000, -5.206336195535022], + [0.8000, -7.538918356984516], + [1.2000, -3.938098437958920], + [0.7000, -3.031522725559912], + [1.1000, -2.522778221157014], + [0.8500, -1.826368199415192]]) + self.vMtilde_max = np.ones((6, 1)) * 10 + self.Fiso = np.array([572.4000, 445.2000, 699.6000, 381.6000, 159.0000, 318.0000]) + self.Faparam = np.array( + [0.814483478343008, 1.055033428970575, 0.162384573599574, 0.063303448465465, 0.433004984392647, + 0.716775413397760, -0.029947116970696, 0.200356847296188]) + self.Fvparam = np.array([-0.318323436899127, -8.149156043475250, -0.374121508647863, 0.885644059915004]) + self.Fpparam = np.array([-0.995172050006169, 53.598150033144236]) + self.muscleDampingCoefficient = np.ones((6, 1)) * 0.01 + + self.a_shoulder = self.dM_coefficients[:, 0] + self.b_shoulder = self.dM_coefficients[:, 1] + self.c_shoulder = self.dM_coefficients[:, 2] + self.a_elbow = self.dM_coefficients[:, 3] + self.b_elbow = self.dM_coefficients[:, 4] + self.c_elbow = self.dM_coefficients[:, 5] + self.l_base = self.LMT_coefficients[:, 0] + self.l_multiplier = self.LMT_coefficients[:, 1] + + # Active muscle force-length characteristic + self.b11 = self.Faparam[0] + self.b21 = self.Faparam[1] + self.b31 = self.Faparam[2] + self.b41 = self.Faparam[3] + self.b12 = self.Faparam[4] + self.b22 = self.Faparam[5] + self.b32 = self.Faparam[6] + self.b42 = self.Faparam[7] + self.b13 = 0.1 + self.b23 = 1 + self.b33 = 0.5 * cas.sqrt(0.5) + self.b43 = 0 + + self.e0 = 0.6 + self.e1 = self.Fvparam[0] + self.e2 = self.Fvparam[1] + self.e3 = self.Fvparam[2] + self.e4 = self.Fvparam[3] + + self.kpe = 4 + self.tau_coef = 0.1500 + + self.l1 = 0.3 + self.l2 = 0.33 + self.m2 = 1 + self.lc2 = 0.16 + self.I1 = 0.025 + self.I2 = 0.045 + + self.friction = np.array([[0.05, 0.025], [0.025, 0.05]]) + + def serialize(self) -> tuple[Callable, dict]: + return LeuvenArmModel, dict(dM_coefficients=self.dM_coefficients, + LMT_coefficients=self.LMT_coefficients, + vMtilde_max=self.vMtilde_max, + Fiso=self.Fiso, + Faparam=self.Faparam, + Fvparam=self.Fvparam, + Fpparam=self.Fpparam, + muscleDampingCoefficient=self.muscleDampingCoefficient, + friction=self.friction) + + @property + def nb_muscles(self): + return 6 + + @property + def nb_q(self): + return 2 + + @property + def nb_qdot(self): + return 2 + @property + def name_dof(self): + return ['shoulder', 'elbow'] + + @property + def muscle_names(self): + return [f'muscle_{i}' for i in range(self.nb_muscles)] + + def get_muscle_force(self, q, qdot): + """ + Fa: active muscle force [N] + Fp: passive muscle force [N] + lMtilde: normalized fiber lenght [-] + vMtilde: optimal fiber lenghts per second at which muscle is lengthening or shortening [-] + FMltilde: force-length multiplier [-] + FMvtilde: force-velocity multiplier [-] + Fce: Active muscle force [N] + Fpe: Passive elastic force [N] + Fm: Passive viscous force [N] + """ + theta_shoulder = q[0] + theta_elbow = q[1] + dtheta_shoulder = qdot[0] + dtheta_elbow = qdot[1] + + # Normalized muscle fiber length (without tendon) + l_full = self.a_shoulder * theta_shoulder + self.b_shoulder * cas.sin( + self.c_shoulder * theta_shoulder) / self.c_shoulder + self.a_elbow * theta_elbow + self.b_elbow * cas.sin( + self.c_elbow * theta_elbow) / self.c_elbow + lMtilde = l_full * self.l_multiplier + self.l_base + + # Fiber velocity normalized by the optimal fiber length + nCoeff = self.a_shoulder.shape[0] + v_full = self.a_shoulder * dtheta_shoulder + self.b_shoulder * cas.cos(self.c_shoulder * theta_shoulder) * cas.repmat( + dtheta_shoulder, nCoeff, 1) + self.a_elbow * dtheta_elbow + self.b_elbow * cas.cos(self.c_elbow * theta_elbow) * cas.repmat( + dtheta_elbow, nCoeff, 1) + vMtilde = self.l_multiplier * v_full + + vMtilde_normalizedToMaxVelocity = vMtilde / self.vMtilde_max + + num3 = lMtilde - self.b23 + den3 = self.b33 + self.b43 * lMtilde + FMtilde3 = self.b13 * cas.exp(-0.5 * num3 ** 2 / den3 ** 2) + + num1 = lMtilde - self.b21 + den1 = self.b31 + self.b41 * lMtilde + FMtilde1 = self.b11 * cas.exp(-0.5 * num1 ** 2 / den1 ** 2) + + num2 = lMtilde - self.b22 + den2 = self.b32 + self.b42 * lMtilde + FMtilde2 = self.b12 * cas.exp(-0.5 * num2 ** 2 / den2 ** 2) + + FMltilde = FMtilde1 + FMtilde2 + FMtilde3 + + FMvtilde = self.e1 * cas.log( + (self.e2 @ vMtilde_normalizedToMaxVelocity + self.e3) + cas.sqrt( + (self.e2 @ vMtilde_normalizedToMaxVelocity + self.e3) ** 2 + 1)) + self.e4 + + # Active muscle force + Fce = FMltilde * FMvtilde + + t5 = cas.exp(self.kpe * (lMtilde - 0.10e1) / self.e0) + Fpe = ((t5 - 0.10e1) - self.Fpparam[0]) / self.Fpparam[1] + + # Muscle force + damping + Fpv = self.muscleDampingCoefficient * vMtilde_normalizedToMaxVelocity + Fa = self.Fiso * Fce + Fp = self.Fiso * (Fpe + Fpv) + + return Fa, Fp + + + def torque_force_relationship(self, Fm, q): + theta_shoulder = q[0] + theta_elbow = q[1] + dM_matrix = cas.horzcat(self.a_shoulder + self.b_shoulder * cas.cos(self.c_shoulder @ theta_shoulder), + self.a_elbow + self.b_elbow * cas.cos(self.c_elbow @ theta_elbow)).T + tau = dM_matrix @ Fm + return tau + + def get_muscle_torque(self, q, qdot, mus_activations): + Fa, Fp = self.get_muscle_force(q, qdot) + Fm = mus_activations * Fa + Fp + muscles_tau = self.torque_force_relationship(Fm, q) + return muscles_tau + + def get_force_field(self, q, force_field_magnitude): + F_forceField = force_field_magnitude * (self.l1 * cas.cos(q[0]) + self.l2 * cas.cos(q[0] + q[1])) + hand_pos = cas.MX(2, 1) + hand_pos[0] = self.l2 * cas.sin(q[0] + q[1]) + self.l1 * cas.sin(q[0]) + hand_pos[1] = self.l2 * cas.sin(q[0] + q[1]) + tau_force_field = -F_forceField @ hand_pos + return tau_force_field + + def get_excitation_with_feedback(self, K, EE, EE_ref, wS): + return K @ ((EE - EE_ref) + wS) + + def end_effector_position(self, q): + theta_shoulder = q[0] + theta_elbow = q[1] + ee_pos = cas.vertcat(cas.cos(theta_shoulder) * self.l1 + cas.cos(theta_shoulder + theta_elbow) * self.l2, + cas.sin(theta_shoulder) * self.l1 + cas.sin(theta_shoulder + theta_elbow) * self.l2) + return ee_pos + + def end_effector_velocity(self, q, qdot): + theta_shoulder = q[0] + theta_elbow = q[1] + a = theta_shoulder + theta_elbow + dtheta_shoulder = qdot[0] + dtheta_elbow = qdot[1] + da = dtheta_shoulder + dtheta_elbow + ee_vel = cas.vertcat(dtheta_shoulder * cas.sin(theta_shoulder) * self.l1 + da * cas.sin(a) * self.l2, + -dtheta_shoulder * cas.cos(theta_shoulder) * self.l1 - da * cas.cos(a) * self.l2) + return ee_vel + + +def stochastic_forward_dynamics( + states: cas.MX | cas.SX, + controls: cas.MX | cas.SX, + parameters: cas.MX | cas.SX, + stochastic_variables: cas.MX | cas.SX, + nlp: NonLinearProgram, + wM, + wS, + force_field_magnitude, + with_gains, +) -> DynamicsEvaluation: + + q = DynamicsFunctions.get(nlp.states["q"], states) + qdot = DynamicsFunctions.get(nlp.states["qdot"], states) + mus_activations = DynamicsFunctions.get(nlp.states["muscles"], states) + mus_excitations = DynamicsFunctions.get(nlp.controls["muscles"], controls) + + mus_excitations_fb = mus_excitations + if with_gains: + ee_ref = DynamicsFunctions.get(nlp.stochastic_variables["ee_ref"], stochastic_variables) + k = DynamicsFunctions.get(nlp.stochastic_variables["k"], stochastic_variables) + K_matrix = cas.MX(4, 6) + for s0 in range(4): + for s1 in range(6): + K_matrix[s0, s1] = k[s0*6 + s1] + K_matrix = K_matrix.T + + hand_pos = nlp.model.end_effector_position(q) + hand_vel = nlp.model.end_effector_velocity(q, qdot) + ee = cas.vertcat(hand_pos, hand_vel) + + mus_excitations_fb += nlp.model.get_excitation_with_feedback(K_matrix, ee, ee_ref, wS) + + muscles_tau = nlp.model.get_muscle_torque(q, qdot, mus_activations) + + tau_force_field = nlp.model.get_force_field(q, force_field_magnitude) + + torques_computed = muscles_tau + wM + tau_force_field + dq_computed = qdot ### Do not use "DynamicsFunctions.compute_qdot(nlp, q, qdot)" it introduces errors!! + dactivations_computed = (mus_excitations_fb - mus_activations) / nlp.model.tau_coef + + a1 = nlp.model.I1 + nlp.model.I2 + nlp.model.m2 * nlp.model.l1 ** 2 + a2 = nlp.model.m2 * nlp.model.l1 * nlp.model.lc2 + a3 = nlp.model.I2 + + theta_elbow = q[1] + dtheta_shoulder = qdot[0] + dtheta_elbow = qdot[1] + + mass_matrix = cas.MX(2, 2) + mass_matrix[0, 0] = a1 + 2 * a2 * cas.cos(theta_elbow) + mass_matrix[0, 1] = a3 + a2 * cas.cos(theta_elbow) + mass_matrix[1, 0] = a3 + a2 * cas.cos(theta_elbow) + mass_matrix[1, 1] = a3 + + nleffects = cas.MX(2, 1) + nleffects[0] = a2 * cas.sin(theta_elbow) * (-dtheta_elbow * (2 * dtheta_shoulder + dtheta_elbow)) + nleffects[1] = a2 * cas.sin(theta_elbow) * dtheta_shoulder ** 2 + + dqdot_computed = cas.inv(mass_matrix) @ (torques_computed - nleffects - nlp.model.friction @ qdot) + + return DynamicsEvaluation(dxdt=cas.vertcat(dq_computed, dqdot_computed, dactivations_computed), defects=None) + +def configure_stochastic_optimal_control_problem(ocp: OptimalControlProgram, nlp: NonLinearProgram, wM, wS): + + ConfigureProblem.configure_q(ocp, nlp, True, False, False) + ConfigureProblem.configure_qdot(ocp, nlp, True, False, True) + ConfigureProblem.configure_qddot(ocp, nlp, False, False, True) + ConfigureProblem.configure_muscles(ocp, nlp, True, True) # Muscles activations as states + muscles excitations as controls + + # Stochastic variables + ConfigureProblem.configure_stochastic_k(ocp, nlp, n_noised_controls=6, n_feedbacks=4) + ConfigureProblem.configure_stochastic_ee_ref(ocp, nlp, n_references=4) + ConfigureProblem.configure_stochastic_m(ocp, nlp, n_noised_states=10) + mat_p_init = cas.DM_eye(10) * np.array([1e-4, 1e-4, 1e-7, 1e-7, 1e-6, 1e-6, 1e-6, 1e-6, 1e-6, 1e-6]) # P + ConfigureProblem.configure_stochastic_cov(ocp, nlp, n_noised_states=10, initial_matrix=mat_p_init) + ConfigureProblem.configure_dynamics_function(ocp, nlp, + dyn_func=lambda states, controls, parameters, + stochastic_variables, nlp, wM, wS: nlp.dynamics_type.dynamic_function(states, + controls, + parameters, + stochastic_variables, + nlp, + wM, + wS, + with_gains=False), + wM=wM, wS=wS, expand=False) + +def minimize_uncertainty(controllers: list[PenaltyController], key: str) -> cas.MX: + """ + Minimize the uncertainty (covariance matrix) of the states. + """ + dt = controllers[0].tf / controllers[0].ns + out = 0 + for i, ctrl in enumerate(controllers): + P_matrix = ctrl.integrated_values["cov"].reshape_to_matrix(ctrl.integrated_values, ctrl.states.cx.shape[0], + ctrl.states.cx.shape[0], Node.START, "cov") + P_partial = P_matrix[ctrl.states[key].index, ctrl.states[key].index] + out += cas.trace(P_partial) * dt + return out + +def get_ee(controller: PenaltyController, q, qdot) -> cas.MX: + hand_pos = controller.model.end_effector_position(q) + hand_vel = controller.model.end_effector_velocity(q, qdot) + ee = cas.vertcat(hand_pos, hand_vel) + return ee + +def ee_equals_ee_ref(controller: PenaltyController) -> cas.MX: + q = controller.states["q"].cx_start + qdot = controller.states["qdot"].cx_start + ee_ref = controller.stochastic_variables["ee_ref"].cx_start + ee = get_ee(controller, q, qdot) + return ee - ee_ref + + +def get_p_mat(nlp, node_index, force_field_magnitude, wM_magnitude, wS_magnitude): + + dt = nlp.tf / nlp.ns + + nlp.states.node_index = node_index - 1 + nlp.controls.node_index = node_index - 1 + nlp.stochastic_variables.node_index = node_index - 1 + nlp.integrated_values.node_index = node_index - 1 + + nx = nlp.states.cx_start.shape[0] + M_matrix = nlp.stochastic_variables["m"].reshape_to_matrix(nlp.stochastic_variables, nx, nx, Node.START, "m") + + wM = cas.MX.sym("wM", nlp.states['q'].cx_start.shape[0]) + wS = cas.MX.sym("wS", nlp.states['q'].cx_start.shape[0]*2) + sigma_w = cas.vertcat(wS, wM) * cas.MX_eye(6) + cov_sym = cas.MX.sym("cov", nlp.integrated_values.cx_start.shape[0]) + cov_sym_dict = {"cov": cov_sym} + cov_sym_dict["cov"].cx_start = cov_sym + cov_matrix = nlp.integrated_values.reshape_to_matrix(cov_sym_dict, nx, nx, Node.START, "cov") + + dx = stochastic_forward_dynamics(nlp.states.cx_start, nlp.controls.cx_start, + nlp.parameters, nlp.stochastic_variables.cx_start, + nlp, wM, wS, force_field_magnitude=force_field_magnitude, with_gains=True) + + ddx_dwM = cas.jacobian(dx.dxdt, cas.vertcat(wS, wM)) + dg_dw = - ddx_dwM * dt + ddx_dx = cas.jacobian(dx.dxdt, nlp.states.cx_start) + dg_dx = - (ddx_dx * dt / 2 + cas.MX_eye(ddx_dx.shape[0])) + + p_next = M_matrix @ (dg_dx @ cov_matrix @ dg_dx.T + dg_dw @ sigma_w @ dg_dw.T) @ M_matrix.T + func_eval = cas.Function("p_next", [nlp.states.cx_start, nlp.controls.cx_start, + nlp.parameters, nlp.stochastic_variables.cx_start, cov_sym, + wM, wS], [p_next])(nlp.states.cx_start, + nlp.controls.cx_start, + nlp.parameters, + nlp.stochastic_variables.cx_start, + nlp.integrated_values["cov"].cx_start, # Should be the right shape to work + wM_magnitude, + wS_magnitude) + p_vector = nlp.integrated_values.reshape_to_vector(func_eval) + return p_vector + +def reach_target_consistantly(controllers: list[PenaltyController]) -> cas.MX: + """ + Constraint the hand to reach the target consistently. + This is a multi-node constraint because the covariance matrix depends on all the precedent nodes, but it only + applies at the END node. + """ + + Q = cas.MX.sym("q_sym", controllers[-1].states["q"].cx_start.shape[0]) + Qdot = cas.MX.sym("qdot_sym", controllers[-1].states["qdot"].cx_start.shape[0]) + cov_sym = cas.MX.sym("cov", controllers[-1].integrated_values.cx_start.shape[0]) + cov_sym_dict = {"cov": cov_sym} + cov_sym_dict["cov"].cx_start = cov_sym + cov_matrix = controllers[-1].integrated_values["cov"].reshape_to_matrix(cov_sym_dict, controllers[-1].states.cx_start.shape[0], controllers[-1].states.cx_start.shape[0], Node.START, "cov") + + hand_pos = controllers[0].model.end_effector_position(Q) + hand_vel = controllers[0].model.end_effector_velocity(Q, Qdot) + + jac_marker_q = cas.jacobian(hand_pos, Q) + jac_marker_qdot = cas.jacobian(hand_vel, cas.vertcat(Q, Qdot)) + + P_matrix_q = cov_matrix[:2, :2] + P_matrix_qdot = cov_matrix[:4, :4] + + pos_constraint = jac_marker_q @ P_matrix_q @ jac_marker_q.T + vel_constraint = jac_marker_qdot @ P_matrix_qdot @ jac_marker_qdot.T + + out = cas.vertcat(pos_constraint[0, 0], pos_constraint[1, 1], vel_constraint[0, 0], vel_constraint[1, 1]) + + fun = cas.Function("reach_target_consistantly", [Q, Qdot, cov_sym], [out]) + val = fun(controllers[-1].states["q"].cx_start, controllers[-1].states["qdot"].cx_start, controllers[-1].integrated_values.cx_start) + # Since the stochastic variables are defined with ns+1, the cx_start actually refers to the last node (when using node=Node.END) + + return val + +def expected_feedback_effort(controllers: list[PenaltyController], wS_magnitude: cas.DM) -> cas.MX: + """ + ... + """ + dt = controllers[0].tf / controllers[0].ns + sensory_noise_matrix = wS_magnitude * cas.MX_eye(4) + + # create the casadi function to be evaluated + # Get the symbolic variables + ee_ref = controllers[0].stochastic_variables["ee_ref"].cx_start + cov_sym = cas.MX.sym("cov", controllers[0].integrated_values.cx_start.shape[0]) + cov_sym_dict = {"cov": cov_sym} + cov_sym_dict["cov"].cx_start = cov_sym + cov_matrix = controllers[0].integrated_values["cov"].reshape_to_matrix(cov_sym_dict, controllers[0].states.cx_start.shape[0], controllers[0].states.cx_start.shape[0], Node.START, "cov") + + k = controllers[0].stochastic_variables["k"].cx_start + K_matrix = cas.MX(4, 6) + for s0 in range(4): + for s1 in range(6): + K_matrix[s0, s1] = k[s0 * 6 + s1] + K_matrix = K_matrix.T + + # Compute the expected effort + hand_pos = controllers[0].model.end_effector_position(controllers[0].states["q"].cx_start) + hand_vel = controllers[0].model.end_effector_velocity(controllers[0].states["q"].cx_start, controllers[0].states["qdot"].cx_start) + trace_k_sensor_k = cas.trace(K_matrix @ sensory_noise_matrix @ K_matrix.T) + ee = cas.vertcat(hand_pos, hand_vel) + e_fb = K_matrix @ ((ee - ee_ref) + wS_magnitude) + jac_e_fb_x = cas.jacobian(e_fb, controllers[0].states.cx_start) + trace_jac_p_jack = cas.trace(jac_e_fb_x @ cov_matrix @ jac_e_fb_x.T) + expectedEffort_fb_mx = trace_jac_p_jack + trace_k_sensor_k + func = cas.Function('f_expectedEffort_fb', + [controllers[0].states.cx_start, controllers[0].stochastic_variables.cx_start, cov_sym], + [expectedEffort_fb_mx]) + + f_expectedEffort_fb = 0 + for i, ctrl in enumerate(controllers): + P_vector = ctrl.integrated_values.cx_start + out = func(ctrl.states.cx_start, ctrl.stochastic_variables.cx_start, P_vector) + f_expectedEffort_fb += out * dt + + return f_expectedEffort_fb + + +def zero_acceleration(controller: PenaltyController, wM: np.ndarray, wS: np.ndarray, force_field_magnitude:float) -> cas.MX: + dx = stochastic_forward_dynamics(controller.states.cx_start, controller.controls.cx_start, + controller.parameters.cx_start, controller.stochastic_variables.cx_start, + controller.get_nlp, wM, wS, force_field_magnitude=force_field_magnitude, with_gains=False) + return dx.dxdt[2:4] + +def track_final_marker(controller: PenaltyController) -> cas.MX: + q = controller.states["q"].cx_start + ee_pos = controller.model.end_effector_position(q) + return ee_pos + +def leuven_trapezoidal(controllers: list[PenaltyController], force_field_magnitude) -> cas.MX: + + wM = np.zeros((2, 1)) + wS = np.zeros((4, 1)) + dt = controllers[0].tf / controllers[0].ns + + dX_i = stochastic_forward_dynamics(controllers[0].states.cx_start, controllers[0].controls.cx_start, + controllers[0].parameters.cx_start, controllers[0].stochastic_variables.cx_start, + controllers[0].get_nlp, wM, wS, force_field_magnitude=force_field_magnitude, with_gains=False).dxdt + dX_i_plus = stochastic_forward_dynamics(controllers[1].states.cx_start, controllers[1].controls.cx_start, + controllers[1].parameters.cx_start, controllers[1].stochastic_variables.cx_start, + controllers[1].get_nlp, wM, wS, force_field_magnitude=force_field_magnitude, with_gains=False).dxdt + + out = controllers[1].states.cx_start - (controllers[0].states.cx_start + (dX_i + dX_i_plus) / 2 * dt) + + return out * 1e3 + +def prepare_socp( + final_time: float, + n_shooting: int, + ee_final_position: np.ndarray, + wM_magnitude: cas.DM, + wS_magnitude: cas.DM, + force_field_magnitude: float = 0, + problem_type: str = "CIRCLE", +) -> OptimalControlProgram: + """ + The initialization of an ocp + Parameters + ---------- + biorbd_model_path: str + The path to the biorbd model + final_time: float + The time in second required to perform the task + n_shooting: int + The number of shooting points to define int the direct multiple shooting program + ee_final_position: np.ndarray + The final position of the end effector + ee_initial_position: np.ndarray + The initial position of the end effector + force_field_magnitude: float + The magnitude of the force field + problem_type: str + The type of problem to solve (CIRCLE or BAR) + Returns + ------- + The OptimalControlProgram ready to be solved + """ + + bio_model = LeuvenArmModel() + + shoulder_pos_initial = 0.349065850398866 + shoulder_pos_final = 0.959931088596881 + elbow_pos_initial = 2.245867726451909 # Optimized in Tom's version + elbow_pos_final = 1.159394851847144 # Optimized in Tom's version + + # Add objective functions + objective_functions = ObjectiveList() + objective_functions.add(ObjectiveFcn.Lagrange.MINIMIZE_CONTROL, node=Node.ALL_SHOOTING, key="muscles", weight=1e3/2, quadratic=True) + objective_functions.add(ObjectiveFcn.Lagrange.MINIMIZE_STATE, node=Node.ALL_SHOOTING, key="muscles", weight=1e3/2, quadratic=True) + + multinode_objectives = MultinodeObjectiveList() + multinode_objectives.add(minimize_uncertainty, + nodes_phase=[0 for _ in range(n_shooting)], + nodes=[i for i in range(n_shooting)], + key="muscles", + weight=1e3 / 2, + quadratic=False) + multinode_objectives.add(expected_feedback_effort, + nodes_phase=[0 for _ in range(n_shooting)], + nodes=[i for i in range(n_shooting)], + wS_magnitude=wS_magnitude, + weight=1e3 / 2, + quadratic=False) + + # Constraints + constraints = ConstraintList() + constraints.add(ee_equals_ee_ref, node=Node.ALL_SHOOTING) + constraints.add(ConstraintFcn.TRACK_STATE, key="q", node=Node.START, target=np.array([shoulder_pos_initial, elbow_pos_initial])) + constraints.add(ConstraintFcn.TRACK_STATE, key="qdot", node=Node.START, target=np.array([0, 0])) + constraints.add(zero_acceleration, node=Node.START, wM=np.zeros((2, 1)), wS=np.zeros((4, 1)), force_field_magnitude=force_field_magnitude) + constraints.add(track_final_marker, node=Node.PENULTIMATE, target=ee_final_position) + constraints.add(ConstraintFcn.TRACK_STATE, key="qdot", node=Node.PENULTIMATE, target=np.array([0, 0])) + constraints.add(zero_acceleration, node=Node.PENULTIMATE, wM=np.zeros((2, 1)), wS=np.zeros((4, 1)), force_field_magnitude=force_field_magnitude) # Not possible sice the control on the last node is NaN + constraints.add(ConstraintFcn.TRACK_CONTROL, key="muscles", node=Node.ALL_SHOOTING, min_bound=0.001, max_bound=1) + constraints.add(ConstraintFcn.TRACK_STATE, key="muscles", node=Node.ALL, min_bound=0.001, max_bound=1) + constraints.add(ConstraintFcn.TRACK_STATE, key="q", node=Node.ALL, min_bound=0, max_bound=180) # This is a bug, it should be in radians + + if problem_type == "BAR": + max_bounds_lateral_variation = cas.inf + elif problem_type == "CIRCLE": + max_bounds_lateral_variation = 0.004 + else: + raise NotImplementedError("Wrong problem type") + + multinode_constraints = MultinodeConstraintList() + multinode_constraints.add(reach_target_consistantly, + nodes_phase=[0 for _ in range(n_shooting)], + nodes=[i for i in range(n_shooting)], + min_bound=np.array([-cas.inf, -cas.inf, -cas.inf, -cas.inf]), + max_bound=np.array([max_bounds_lateral_variation**2, 0.004**2, 0.05**2, 0.05**2])) + for i in range(n_shooting-1): + multinode_constraints.add(leuven_trapezoidal, + nodes_phase=[0, 0], + nodes=[i, i+1], + force_field_magnitude=force_field_magnitude) + + # Dynamics + dynamics = DynamicsList() + dynamics.add(configure_stochastic_optimal_control_problem, + dynamic_function=lambda states, controls, parameters, stochastic_variables, nlp, wM, wS, + with_gains: stochastic_forward_dynamics(states, controls, parameters, + stochastic_variables, nlp, wM, wS, + force_field_magnitude=force_field_magnitude, + with_gains=with_gains), + wM=np.zeros((2, 1)), wS=np.zeros((4, 1))) + + n_muscles = 6 + n_q = bio_model.nb_q + n_qdot = bio_model.nb_qdot + n_states = n_q + n_qdot + n_muscles + + states_min = np.ones((n_states, n_shooting+1)) * -cas.inf + states_max = np.ones((n_states, n_shooting+1)) * cas.inf + + x_bounds = BoundsList() + x_bounds.add(bounds=Bounds(states_min, states_max, interpolation=InterpolationType.EACH_FRAME)) + + u_bounds = BoundsList() + controls_min = np.ones((n_muscles, 3)) * -cas.inf + controls_max = np.ones((n_muscles, 3)) * cas.inf + u_bounds.add(bounds=Bounds(controls_min, controls_max)) + + input_sol_FLAG = False # True + if input_sol_FLAG: + #load pickle + with open(f"leuvenarm_muscle_driven_socp_{problem_type}_forcefield{force_field_magnitude}.pkl", 'rb') as f: + data = pickle.load(f) + q_sol = data["q_sol"] + qdot_sol = data["qdot_sol"] + activations_sol = data["activations_sol"] + excitations_sol = data["excitations_sol"] + k_sol = data["k_sol"] + ee_ref_sol = data["ee_ref_sol"] + m_sol = data["m_sol"] + # cov_sol = data["cov_sol"] + stochastic_variables_sol = data["stochastic_variables_sol"] + + # Initial guesses + if not input_sol_FLAG: + states_init = np.zeros((n_states, n_shooting + 1)) + states_init[0, :-1] = np.linspace(shoulder_pos_initial, shoulder_pos_final, n_shooting) + states_init[0, -1] = shoulder_pos_final + states_init[1, :-1] = np.linspace(elbow_pos_initial, elbow_pos_final, n_shooting) + states_init[1, -1] = elbow_pos_final + states_init[n_q + n_qdot:, :] = 0.01 + else: + states_init = cas.vertcat(q_sol, qdot_sol, activations_sol) + x_init = InitialGuess(states_init, interpolation=InterpolationType.EACH_FRAME) + + if not input_sol_FLAG: + controls_init = np.ones((n_muscles, n_shooting)) * 0.01 + else: + controls_init = excitations_sol[:, :-1] + u_init = InitialGuess(controls_init, interpolation=InterpolationType.EACH_FRAME) + + # TODO: This should probably be done automatically, not defined by the user + n_stochastic = n_muscles*(n_q + n_qdot) + n_q+n_qdot + n_states*n_states # K(6x4) + ee_ref(4x1) + M(10x10) + if not input_sol_FLAG: + stochastic_init = np.zeros((n_stochastic, n_shooting + 1)) + curent_index = 0 + stochastic_init[:n_muscles * (n_q + n_qdot), :] = 0.01 # K + curent_index += n_muscles * (n_q + n_qdot) + stochastic_init[curent_index: curent_index + n_q + n_qdot, :] = 0.01 # ee_ref + # stochastic_init[curent_index : curent_index + n_q+n_qdot, 0] = np.array([ee_initial_position[0], ee_initial_position[1], 0, 0]) # ee_ref + # stochastic_init[curent_index : curent_index + n_q+n_qdot, 1] = np.array([ee_final_position[0], ee_final_position[1], 0, 0]) + curent_index += n_q + n_qdot + stochastic_init[curent_index: curent_index + n_states * n_states, :] = 0.01 # M + else: + stochastic_init = stochastic_variables_sol + s_init = InitialGuess(stochastic_init, interpolation=InterpolationType.EACH_FRAME) + + s_bounds = BoundsList() + stochastic_min = np.ones((n_stochastic, 3)) * -cas.inf + stochastic_max = np.ones((n_stochastic, 3)) * cas.inf + s_bounds.add(bounds=Bounds(stochastic_min, stochastic_max)) + # TODO: we should probably change the name stochastic_variables -> helper_variables ? + + integrated_value_functions = {"cov": lambda nlp, node_index: get_p_mat(nlp, node_index, force_field_magnitude=force_field_magnitude, wM_magnitude=wM_magnitude, wS_magnitude=wS_magnitude)} + + return StochasticOptimalControlProgram( + bio_model, + dynamics, + n_shooting, + final_time, + x_init=x_init, + u_init=u_init, + s_init=s_init, + x_bounds=x_bounds, + u_bounds=u_bounds, + s_bounds=s_bounds, + objective_functions=objective_functions, + multinode_objectives=multinode_objectives, + constraints=constraints, + multinode_constraints=multinode_constraints, + ode_solver=None, + skip_continuity=True, + n_threads=1, + assume_phase_dynamics=False, + problem_type=OcpType.SOCP_EXPLICIT(wM_magnitude, wS_magnitude), + integrated_value_functions=integrated_value_functions + ) + +def main(): + + RUN_OPTIM_FLAG = True # False + PLOT_SOL_FLAG = False # True + VIZUALIZE_SOL_FLAG = False # True + + biorbd_model_path = "models/LeuvenArmModel.bioMod" + + ee_initial_position = np.array([0.0, 0.2742]) # Directly from Tom's version + ee_final_position = np.array([9.359873986980460e-12, 0.527332023564034]) # Directly from Tom's version + + # --- Prepare the ocp --- # + dt = 0.01 + # final_time = 0.8 + # n_shooting = int(final_time/dt) + 1 + # final_time += dt + n_shooting = 4 + final_time = 0.8 + + # --- Noise constants --- # + wM_std = 0.05 + wPq_std = 3e-4 + wPqdot_std = 0.0024 + + wM_magnitude = cas.DM(np.array([wM_std ** 2 / dt, wM_std ** 2 / dt])) + wPq_magnitude = cas.DM(np.array([wPq_std ** 2 / dt, wPq_std ** 2 / dt])) + wPqdot_magnitude = cas.DM(np.array([wPqdot_std ** 2 / dt, wPqdot_std ** 2 / dt])) + wS_magnitude = cas.vertcat(wPq_magnitude, wPqdot_magnitude) + + + # Solver parameters + solver = Solver.IPOPT(show_online_optim=False) + solver.set_linear_solver('mumps') + # solver.set_linear_solver('ma57') + solver.set_tol(1e-3) + solver.set_dual_inf_tol(3e-4) + solver.set_constr_viol_tol(1e-7) + # solver.set_maximum_iterations(10000) + solver.set_maximum_iterations(4) + solver.set_hessian_approximation('limited-memory') + solver.set_bound_frac(1e-8) + solver.set_bound_push(1e-8) + solver.set_nlp_scaling_method('none') + + problem_type = "CIRCLE" + force_field_magnitude = 0 + socp = prepare_socp(final_time=final_time, + n_shooting=n_shooting, + ee_final_position=ee_final_position, + wM_magnitude=wM_magnitude, + wS_magnitude=wS_magnitude, + problem_type=problem_type, + force_field_magnitude=force_field_magnitude) + + if RUN_OPTIM_FLAG: + sol_socp = socp.solve(solver) + print('ici') + # iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls + # 0 1.3548521e+00 2.05e+03 1.19e+00 0.0 0.00e+00 - 0.00e+00 0.00e+00 0 + # 1 2.2407650e+00 2.04e+03 6.94e+04 -0.9 1.03e+02 - 3.22e-03 9.61e-03f 1 + # 2 9.7836212e+02 1.71e+03 2.55e+04 0.6 9.97e+00 - 1.00e+00 9.72e-02h 1 + # 3 1.4109853e+03 1.30e+03 4.27e+04 0.8 3.47e+00 - 1.00e+00 1.00e+00h 1 + # 4 1.3315841e+03 2.54e+02 7.28e+04 1.5 5.41e+00 - 1.00e+00 8.05e-01h 1 + + q_sol = sol_socp.states["q"] + qdot_sol = sol_socp.states["qdot"] + activations_sol = sol_socp.states["muscles"] + excitations_sol = sol_socp.controls["muscles"] + k_sol = sol_socp.stochastic_variables["k"] + ee_ref_sol = sol_socp.stochastic_variables["ee_ref"] + m_sol = sol_socp.stochastic_variables["m"] + cov_sol_vect = sol_socp.integrated_values["cov"] + cov_sol = np.zeros((10, 10, n_shooting)) + for i in range(n_shooting): + for j in range(10): + for k in range(10): + cov_sol[j, k, i] = cov_sol_vect[j * 10 + k, i] + stochastic_variables_sol = np.vstack((k_sol, ee_ref_sol, m_sol)) + data = {"q_sol": q_sol, + "qdot_sol": qdot_sol, + "activations_sol": activations_sol, + "excitations_sol": excitations_sol, + "k_sol": k_sol, + "ee_ref_sol": ee_ref_sol, + "m_sol": m_sol, + "cov_sol": cov_sol, + "stochastic_variables_sol": stochastic_variables_sol} + + # # --- Save the results --- # + # with open(f"leuvenarm_muscle_driven_socp_{problem_type}_forcefield{force_field_magnitude}.pkl", "wb") as file: + # pickle.dump(data, file) + else: + with open(f"leuvenarm_muscle_driven_socp_{problem_type}_forcefield{force_field_magnitude}.pkl", "rb") as file: + data = pickle.load(file) + q_sol = data["q_sol"] + qdot_sol = data["qdot_sol"] + activations_sol = data["activations_sol"] + excitations_sol = data["excitations_sol"] + k_sol = data["k_sol"] + ee_ref_sol = data["ee_ref_sol"] + m_sol = data["m_sol"] + cov_sol = data["cov_sol"] + stochastic_variables_sol = np.vstack((k_sol, ee_ref_sol, m_sol)) + + # Save .mat files + sio.savemat(f"leuvenarm_muscle_driven_socp_{problem_type}_forcefield{force_field_magnitude}.mat", + {"q_sol": q_sol, + "qdot_sol": qdot_sol, + "activations_sol": activations_sol, + "excitations_sol": excitations_sol, + "k_sol": k_sol, + "ee_ref_sol": ee_ref_sol, + "m_sol": m_sol, + "stochastic_variables_sol": stochastic_variables_sol}) + + if VIZUALIZE_SOL_FLAG: + import bioviz + b = bioviz.Viz(model_path=biorbd_model_path) + b.load_movement(q_sol[:, :-1]) + b.exec() + + + # --- Plot the results --- # + if PLOT_SOL_FLAG: + model = LeuvenArmModel() + Q_sym = cas.MX.sym('Q', 2, 1) + Qdot_sym = cas.MX.sym('Qdot', 2, 1) + hand_pos_fcn = cas.Function("hand_pos", [Q_sym], [model.end_effector_position(Q_sym)]) + hand_vel_fcn = cas.Function("hand_vel", [Q_sym, Qdot_sym], [model.end_effector_velocity(Q_sym, Qdot_sym)]) + + states = socp.nlp[0].states.cx_start + controls = socp.nlp[0].controls.cx_start + parameters = socp.nlp[0].parameters.cx_start + stochastic_variables = socp.nlp[0].stochastic_variables.cx_start + nlp = socp.nlp[0] + wM_sym = cas.MX.sym('wM', 2, 1) + wS_sym = cas.MX.sym('wS', 4, 1) + out = stochastic_forward_dynamics(states, controls, parameters, stochastic_variables, nlp, wM_sym, wS_sym, force_field_magnitude=force_field_magnitude, with_gains=True) + dyn_fun = cas.Function("dyn_fun", [states, controls, parameters, stochastic_variables, wM_sym, wS_sym], [out.dxdt]) + + fig, axs = plt.subplots(3, 2) + n_simulations = 30 + q_simulated = np.zeros((n_simulations, 2, n_shooting + 1)) + qdot_simulated = np.zeros((n_simulations, 2, n_shooting + 1)) + mus_activation_simulated = np.zeros((n_simulations, 6, n_shooting + 1)) + hand_pos_simulated = np.zeros((n_simulations, 2, n_shooting + 1)) + hand_vel_simulated = np.zeros((n_simulations, 2, n_shooting + 1)) + for i_simulation in range(n_simulations): + wM = np.random.normal(0, wM_std, (2, n_shooting + 1)) + wPq = np.random.normal(0, wPq_std, (2, n_shooting + 1)) + wPqdot = np.random.normal(0, wPqdot_std, (2, n_shooting + 1)) + wS = cas.vertcat(wPq, wPqdot) + q_simulated[i_simulation, :, 0] = q_sol[:, 0] + qdot_simulated[i_simulation, :, 0] = qdot_sol[:, 0] + mus_activation_simulated[i_simulation, :, 0] = activations_sol[:, 0] + for i_node in range(n_shooting): + x_prev = cas.vertcat(q_simulated[i_simulation, :, i_node], qdot_simulated[i_simulation, :, i_node], mus_activation_simulated[i_simulation, :, i_node]) + hand_pos_simulated[i_simulation, :, i_node] = np.reshape(hand_pos_fcn(x_prev[:2])[:2], (2,)) + hand_vel_simulated[i_simulation, :, i_node] = np.reshape(hand_vel_fcn(x_prev[:2], x_prev[2:4])[:2], (2,)) + u = excitations_sol[:, i_node] + s = stochastic_variables_sol[:, i_node] + k1 = dyn_fun(x_prev, u, [], s, wM[:, i_node], wS[:, i_node]) + x_next = x_prev + dt * dyn_fun(x_prev + dt / 2 * k1, u, [], s, wM[:, i_node], wS[:, i_node]) + q_simulated[i_simulation, :, i_node + 1] = np.reshape(x_next[:2], (2, )) + qdot_simulated[i_simulation, :, i_node + 1] = np.reshape(x_next[2:4], (2, )) + mus_activation_simulated[i_simulation, :, i_node + 1] = np.reshape(x_next[4:], (6, )) + hand_pos_simulated[i_simulation, :, i_node + 1] = np.reshape(hand_pos_fcn(x_next[:2])[:2], (2,)) + hand_vel_simulated[i_simulation, :, i_node + 1] = np.reshape(hand_vel_fcn(x_next[:2], x_next[2:4])[:2], (2, )) + axs[0, 0].plot(hand_pos_simulated[i_simulation, 0, :], hand_pos_simulated[i_simulation, 1, :], color="tab:red") + axs[1, 0].plot(np.linspace(0, final_time, n_shooting + 1), q_simulated[i_simulation, 0, :], color="k") + axs[2, 0].plot(np.linspace(0, final_time, n_shooting + 1), q_simulated[i_simulation, 1, :], color="k") + axs[0, 1].plot(hand_vel_simulated[i_simulation, 0, :], hand_vel_simulated[i_simulation, 1, :], color="tab:red") + axs[1, 1].plot(np.linspace(0, final_time, n_shooting + 1), qdot_simulated[i_simulation, 0, :], color="k") + axs[2, 1].plot(np.linspace(0, final_time, n_shooting + 1), qdot_simulated[i_simulation, 1, :], color="k") + hand_pos_without_noise = np.zeros((2, n_shooting + 1)) + for i_node in range(n_shooting + 1): + hand_pos_without_noise[:, i_node] = np.reshape(hand_pos_fcn(q_sol[:, i_node])[:2], (2,)) + axs[0, 0].plot(hand_pos_without_noise[0, :], hand_pos_without_noise[1, :], color="k") + axs[0, 0].plot(ee_initial_position[0], ee_initial_position[1], color="tab:green", marker="o") + axs[0, 0].plot(ee_final_position[0], ee_final_position[1], color="tab:red", marker="o") + axs[0, 0].set_xlabel("X [m]") + axs[0, 0].set_ylabel("Y [m]") + axs[0, 0].set_title("Hand position simulated") + axs[1, 0].set_xlabel("Time [s]") + axs[1, 0].set_ylabel("Shoulder angle [rad]") + axs[2, 0].set_xlabel("Time [s]") + axs[2, 0].set_ylabel("Elbow angle [rad]") + axs[0, 1].set_xlabel("X velocity [m/s]") + axs[0, 1].set_ylabel("Y velocity [m/s]") + axs[0, 1].set_title("Hand velocity simulated") + axs[1, 1].set_xlabel("Time [s]") + axs[1, 1].set_ylabel("Shoulder velocity [rad/s]") + axs[2, 1].set_xlabel("Time [s]") + axs[2, 1].set_ylabel("Elbow velocity [rad/s]") + axs[0, 0].axis("equal") + plt.tight_layout() + plt.savefig("simulated_results.png", dpi=300) + plt.show() + + # TODO: integrate to see the error they commit with the trapezoidal + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py b/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py new file mode 100644 index 000000000..d6c6085b0 --- /dev/null +++ b/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py @@ -0,0 +1,698 @@ +""" +This example is adapted from arm_reaching_muscle_driven.py to make it torque driven and to add the stochastic and +continuity constraints implicitly. +""" + +import platform + +import pickle +import biorbd_casadi as biorbd +import matplotlib.pyplot as plt +import casadi as cas +import numpy as np +import scipy.io as sio + +import sys +# sys.path.append("/home/charbie/Documents/Programmation/BiorbdOptim") +from bioptim import ( + OptimalControlProgram, + StochasticOptimalControlProgram, + Bounds, + InitialGuess, + ObjectiveFcn, + Solver, + BiorbdModel, + ObjectiveList, + NonLinearProgram, + DynamicsEvaluation, + DynamicsFunctions, + ConfigureProblem, + DynamicsList, + BoundsList, + InterpolationType, + OcpType, + PenaltyController, + Node, + ConstraintList, + ConstraintFcn, + MultinodeConstraintList, + MultinodeObjectiveList, +) + +def get_force_field(q, force_field_magnitude): + l1 = 0.3 + l2 = 0.33 + F_forceField = force_field_magnitude * (l1 * cas.cos(q[0]) + l2 * cas.cos(q[0] + q[1])) + hand_pos = cas.MX(2, 1) + hand_pos[0] = l2 * cas.sin(q[0] + q[1]) + l1 * cas.sin(q[0]) + hand_pos[1] = l2 * cas.sin(q[0] + q[1]) + tau_force_field = -F_forceField @ hand_pos + return tau_force_field + +def get_excitation_with_feedback(K, EE, EE_ref, wS): + return K @ ((EE - EE_ref) + wS) + +def stochastic_forward_dynamics( + states: cas.MX | cas.SX, + controls: cas.MX | cas.SX, + parameters: cas.MX | cas.SX, + stochastic_variables: cas.MX | cas.SX, + nlp: NonLinearProgram, + wM, + wS, + force_field_magnitude, + with_gains, +) -> DynamicsEvaluation: + + q = DynamicsFunctions.get(nlp.states["q"], states) + qdot = DynamicsFunctions.get(nlp.states["qdot"], states) + qddot = DynamicsFunctions.get(nlp.states["qddot"], states) + qdddot = DynamicsFunctions.get(nlp.controls["qdddot"], controls) + tau = DynamicsFunctions.get(nlp.controls["tau"], controls) + n_states = nlp.states.cx_start.shape[0] + n_controls = nlp.controls.cx_start.shape[0] + n_q = q.shape[0] + n_qdot = qdot.shape[0] + n_tau = tau.shape[0] + + tau_fb = tau + if with_gains: + ee_ref = DynamicsFunctions.get(nlp.stochastic_variables["ee_ref"], stochastic_variables) + k = DynamicsFunctions.get(nlp.stochastic_variables["k"], stochastic_variables) + K_matrix = cas.MX(n_q+n_qdot, n_tau) + for s0 in range(n_q+n_qdot): + for s1 in range(n_tau): + K_matrix[s0, s1] = k[s0*n_tau + s1] + K_matrix = K_matrix.T + + hand_pos = nlp.model.markers(q)[2][:2] + hand_vel = nlp.model.marker_velocities(q, qdot)[2][:2] + ee = cas.vertcat(hand_pos, hand_vel) + + tau_fb += get_excitation_with_feedback(K_matrix, ee, ee_ref, wS) + + tau_force_field = get_force_field(q, force_field_magnitude) + + torques_computed = tau_fb + wM + tau_force_field + dq_computed = qdot + + friction = np.array([[0.05, 0.025], [0.025, 0.05]]) + + mass_matrix = nlp.model.mass_matrix(q) + non_linear_effects = nlp.model.non_linear_effects(q, qdot) + + dqdot_computed = qddot + dqddot_computed = qdddot + + dqdot_constraint = cas.inv(mass_matrix) @ (torques_computed - non_linear_effects - friction @ qdot) + + defects = cas.vertcat(dqdot_constraint - qddot) + + return DynamicsEvaluation(dxdt=cas.vertcat(dq_computed, dqdot_computed, dqddot_computed), defects=defects) + +def configure_stochastic_optimal_control_problem(ocp: OptimalControlProgram, nlp: NonLinearProgram, wM, wS): + + ConfigureProblem.configure_q(ocp, nlp, True, False, False) + ConfigureProblem.configure_qdot(ocp, nlp, True, False, True) + ConfigureProblem.configure_qddot(ocp, nlp, True, False, True) + ConfigureProblem.configure_qdddot(ocp, nlp, False, True) + ConfigureProblem.configure_tau(ocp, nlp, False, True) + + # Stochastic variables + ConfigureProblem.configure_stochastic_k(ocp, nlp, n_noised_controls=2, n_feedbacks=4) + ConfigureProblem.configure_stochastic_ee_ref(ocp, nlp, n_references=4) + ConfigureProblem.configure_stochastic_m(ocp, nlp, n_noised_states=6) + mat_p_init = cas.DM_eye(6) * np.array([1e-4, 1e-4, 1e-7, 1e-7, 1e-6, 1e-6]) # P, the oise on the acceleration should be chosen carefully (here arbitrary) + ConfigureProblem.configure_stochastic_cov(ocp, nlp, n_noised_states=6, initial_matrix=mat_p_init) + ConfigureProblem.configure_dynamics_function(ocp, nlp, + dyn_func=lambda states, controls, parameters, + stochastic_variables, nlp, wM, wS: nlp.dynamics_type.dynamic_function(states, + controls, + parameters, + stochastic_variables, + nlp, + wM, + wS, + with_gains=False), + wM=wM, wS=wS, expand=False) + return + +def minimize_uncertainty(controllers: list[PenaltyController], key: str) -> cas.MX: + """ + Minimize the uncertainty (covariance matrix) of the states. + """ + dt = controllers[0].tf / controllers[0].ns + out = 0 + for i, ctrl in enumerate(controllers): + P_matrix = ctrl.integrated_values["cov"].reshape_to_matrix(ctrl.integrated_values, ctrl.states.cx.shape[0], + ctrl.states.cx.shape[0], Node.START, "cov") + P_partial = P_matrix[ctrl.states[key].index, ctrl.states[key].index] + out += cas.trace(P_partial) * dt + return out + +def get_ee(controller: PenaltyController, q, qdot) -> cas.MX: + hand_pos = controller.model.markers(q)[2][:2] + hand_vel = controller.model.marker_velocities(q, qdot)[2][:2] + ee = cas.vertcat(hand_pos, hand_vel) + return ee + +def ee_equals_ee_ref(controller: PenaltyController) -> cas.MX: + q = controller.states["q"].cx_start + qdot = controller.states["qdot"].cx_start + ee_ref = controller.stochastic_variables["ee_ref"].cx_start + ee = get_ee(controller, q, qdot) + return ee - ee_ref + + +def get_p_mat(nlp, node_index, force_field_magnitude, wM_magnitude, wS_magnitude): + + dt = nlp.tf / nlp.ns + + nlp.states.node_index = node_index - 1 + nlp.controls.node_index = node_index - 1 + nlp.stochastic_variables.node_index = node_index - 1 + nlp.integrated_values.node_index = node_index - 1 + + n_q = nlp.states["q"].cx_start.shape[0] + n_qdot = nlp.states["qdot"].cx_start.shape[0] + n_tau = nlp.controls["tau"].cx_start.shape[0] + nx = nlp.states.cx_start.shape[0] + + M_matrix = nlp.stochastic_variables.reshape_to_matrix(nlp.stochastic_variables, nx, nx, Node.START, "m") + + wM = cas.MX.sym("wM", n_tau) + wS = cas.MX.sym("wS", n_q+n_qdot) + sigma_w = cas.vertcat(wS, wM) * cas.MX_eye(cas.vertcat(wS, wM).shape[0]) + cov_sym = cas.MX.sym("cov", nlp.integrated_values.cx_start.shape[0]) + cov_sym_dict = {"cov": cov_sym} + cov_sym_dict["cov"].cx_start = cov_sym + cov_matrix = nlp.integrated_values.reshape_to_matrix(cov_sym_dict, nx, nx, Node.START, "cov") + + dx = stochastic_forward_dynamics(nlp.states.cx_start, nlp.controls.cx_start, + nlp.parameters, nlp.stochastic_variables.cx_start, + nlp, wM, wS, force_field_magnitude=force_field_magnitude, with_gains=True) + + ddx_dwM = cas.jacobian(dx.dxdt, cas.vertcat(wS, wM)) + dg_dw = - ddx_dwM * dt + ddx_dx = cas.jacobian(dx.dxdt, nlp.states.cx_start) + dg_dx = - (ddx_dx * dt / 2 + cas.MX_eye(ddx_dx.shape[0])) + + p_next = M_matrix @ (dg_dx @ cov_matrix @ dg_dx.T + dg_dw @ sigma_w @ dg_dw.T) @ M_matrix.T + func_eval = cas.Function("p_next", [nlp.states.cx_start, nlp.controls.cx_start, + nlp.parameters, nlp.stochastic_variables.cx_start, cov_sym, + wM, wS], [p_next])(nlp.states.cx_start, + nlp.controls.cx_start, + nlp.parameters, + nlp.stochastic_variables.cx_start, + nlp.integrated_values["cov"].cx_start, # Should be the right shape to work + wM_magnitude, + wS_magnitude) + p_vector = nlp.integrated_values.reshape_to_vector(func_eval) + return p_vector + +def reach_target_consistantly(controllers: list[PenaltyController]) -> cas.MX: + """ + Constraint the hand to reach the target consistently. + This is a multi-node constraint because the covariance matrix depends on all the precedent nodes, but it only + applies at the END node. + """ + + Q = cas.MX.sym("q_sym", controllers[-1].states["q"].cx_start.shape[0]) + Qdot = cas.MX.sym("qdot_sym", controllers[-1].states["qdot"].cx_start.shape[0]) + cov_sym = cas.MX.sym("cov", controllers[-1].integrated_values.cx_start.shape[0]) + cov_sym_dict = {"cov": cov_sym} + cov_sym_dict["cov"].cx_start = cov_sym + cov_matrix = controllers[-1].integrated_values["cov"].reshape_to_matrix(cov_sym_dict, controllers[-1].states.cx_start.shape[0], controllers[-1].states.cx_start.shape[0], Node.START, "cov") + + hand_pos = controllers[0].model.markers(Q)[2][:2] + hand_vel = controllers[0].model.marker_velocities(Q, Qdot)[2][:2] + + jac_marker_q = cas.jacobian(hand_pos, Q) + jac_marker_qdot = cas.jacobian(hand_vel, cas.vertcat(Q, Qdot)) + + P_matrix_q = cov_matrix[:2, :2] + P_matrix_qdot = cov_matrix[:4, :4] + + pos_constraint = jac_marker_q @ P_matrix_q @ jac_marker_q.T + vel_constraint = jac_marker_qdot @ P_matrix_qdot @ jac_marker_qdot.T + + out = cas.vertcat(pos_constraint[0, 0], pos_constraint[1, 1], vel_constraint[0, 0], vel_constraint[1, 1]) + + fun = cas.Function("reach_target_consistantly", [Q, Qdot, cov_sym], [out]) + val = fun(controllers[-1].states["q"].cx_start, controllers[-1].states["qdot"].cx_start, controllers[-1].integrated_values.cx_start) + # Since the stochastic variables are defined with ns+1, the cx_start actually refers to the last node (when using node=Node.END) + + return val + +def expected_feedback_effort(controllers: list[PenaltyController], wS_magnitude: cas.DM) -> cas.MX: + """ + ... + """ + n_tau = controllers[0].controls["tau"].cx_start.shape[0] + n_q = controllers[0].states["q"].cx_start.shape[0] + n_qdot = controllers[0].states["qdot"].cx_start.shape[0] + + dt = controllers[0].tf / controllers[0].ns + sensory_noise_matrix = wS_magnitude * cas.MX_eye(4) + + # create the casadi function to be evaluated + # Get the symbolic variables + ee_ref = controllers[0].stochastic_variables["ee_ref"].cx_start + cov_sym = cas.MX.sym("cov", controllers[0].integrated_values.cx_start.shape[0]) + cov_sym_dict = {"cov": cov_sym} + cov_sym_dict["cov"].cx_start = cov_sym + cov_matrix = controllers[0].integrated_values["cov"].reshape_to_matrix(cov_sym_dict, controllers[0].states.cx_start.shape[0], controllers[0].states.cx_start.shape[0], Node.START, "cov") + + k = controllers[0].stochastic_variables["k"].cx_start + K_matrix = cas.MX(n_q+n_qdot, n_tau) + for s0 in range(n_q+n_qdot): + for s1 in range(n_tau): + K_matrix[s0, s1] = k[s0 * n_tau + s1] + K_matrix = K_matrix.T + + # Compute the expected effort + hand_pos = controllers[0].model.markers(controllers[0].states["q"].cx_start)[2][:2] + hand_vel = controllers[0].model.marker_velocities(controllers[0].states["q"].cx_start, controllers[0].states["qdot"].cx_start)[2][:2] + trace_k_sensor_k = cas.trace(K_matrix @ sensory_noise_matrix @ K_matrix.T) + ee = cas.vertcat(hand_pos, hand_vel) + e_fb = K_matrix @ ((ee - ee_ref) + wS_magnitude) + jac_e_fb_x = cas.jacobian(e_fb, controllers[0].states.cx_start) + trace_jac_p_jack = cas.trace(jac_e_fb_x @ cov_matrix @ jac_e_fb_x.T) + expectedEffort_fb_mx = trace_jac_p_jack + trace_k_sensor_k + func = cas.Function('f_expectedEffort_fb', + [controllers[0].states.cx_start, controllers[0].stochastic_variables.cx_start, cov_sym], + [expectedEffort_fb_mx]) + + f_expectedEffort_fb = 0 + for i, ctrl in enumerate(controllers): + P_vector = ctrl.integrated_values.cx_start + out = func(ctrl.states.cx_start, ctrl.stochastic_variables.cx_start, P_vector) + f_expectedEffort_fb += out * dt + + return f_expectedEffort_fb + + +def zero_acceleration(controller: PenaltyController, wM: np.ndarray, wS: np.ndarray, force_field_magnitude:float) -> cas.MX: + dx = stochastic_forward_dynamics(controller.states.cx_start, controller.controls.cx_start, + controller.parameters.cx_start, controller.stochastic_variables.cx_start, + controller.get_nlp, wM, wS, force_field_magnitude=force_field_magnitude, with_gains=False) + return dx.dxdt[2:4] + +def track_final_marker(controller: PenaltyController) -> cas.MX: + q = controller.states["q"].cx_start + ee_pos = controller.model.markers(q)[2][:2] + return ee_pos + +def leuven_trapezoidal(controllers: list[PenaltyController], force_field_magnitude) -> cas.MX: + + n_q = controllers[0].model.nb_q + n_qdot = controllers[0].model.nb_qdot + n_tau = controllers[0].model.nb_tau + + wM = np.zeros((n_tau, 1)) + wS = np.zeros((n_q+n_qdot, 1)) + dt = controllers[0].tf / controllers[0].ns + + dyn = stochastic_forward_dynamics(controllers[0].states.cx_start, controllers[0].controls.cx_start, + controllers[0].parameters.cx_start, controllers[0].stochastic_variables.cx_start, + controllers[0].get_nlp, wM, wS, force_field_magnitude=force_field_magnitude, + with_gains=False) + dX_i = dyn.dxdt + + if controllers[1].node_index != controllers[0].ns: + dX_i_plus = stochastic_forward_dynamics(controllers[1].states.cx_start, controllers[1].controls.cx_start, + controllers[1].parameters.cx_start, controllers[1].stochastic_variables.cx_start, + controllers[1].get_nlp, wM, wS, force_field_magnitude=force_field_magnitude, with_gains=False).dxdt + + continuity = controllers[1].states.cx_start - (controllers[0].states.cx_start + (dX_i + dX_i_plus) / 2 * dt) + continuity*=1e3 + else: + continuity = 0 + + implicit_dynamics = dyn.defects + + return cas.vertcat(continuity, implicit_dynamics) + +def prepare_socp( + biorbd_model_path: str, + final_time: float, + n_shooting: int, + ee_final_position: np.ndarray, + wM_magnitude: cas.DM, + wS_magnitude: cas.DM, + force_field_magnitude: float = 0, + problem_type: str = "CIRCLE", +) -> OptimalControlProgram: + """ + The initialization of an ocp + Parameters + ---------- + biorbd_model_path: str + The path to the biorbd model + final_time: float + The time in second required to perform the task + n_shooting: int + The number of shooting points to define int the direct multiple shooting program + ee_final_position: np.ndarray + The final position of the end effector + ee_initial_position: np.ndarray + The initial position of the end effector + force_field_magnitude: float + The magnitude of the force field + problem_type: str + The type of problem to solve (CIRCLE or BAR) + Returns + ------- + The OptimalControlProgram ready to be solved + """ + + bio_model = BiorbdModel(biorbd_model_path) + + n_tau = bio_model.nb_tau + n_q = bio_model.nb_q + n_qdot = bio_model.nb_qdot + n_states = n_q * 3 + n_controls = n_q * 2 + + shoulder_pos_initial = 0.349065850398866 + shoulder_pos_final = 0.959931088596881 + elbow_pos_initial = 2.245867726451909 # Optimized in Tom's version + elbow_pos_final = 1.159394851847144 # Optimized in Tom's version + + # Add objective functions + objective_functions = ObjectiveList() + objective_functions.add(ObjectiveFcn.Lagrange.MINIMIZE_CONTROL, node=Node.ALL_SHOOTING, key="tau", weight=1e3/2, quadratic=True) + + multinode_objectives = MultinodeObjectiveList() + multinode_objectives.add(minimize_uncertainty, + nodes_phase=[0 for _ in range(n_shooting)], + nodes=[i for i in range(n_shooting)], + key="qddot", + weight=1e3 / 2, + quadratic=False) + multinode_objectives.add(expected_feedback_effort, + nodes_phase=[0 for _ in range(n_shooting)], + nodes=[i for i in range(n_shooting)], + wS_magnitude=wS_magnitude, + weight=1e3 / 2, + quadratic=False) + + # Constraints + constraints = ConstraintList() + constraints.add(ee_equals_ee_ref, node=Node.ALL_SHOOTING) + constraints.add(ConstraintFcn.TRACK_STATE, key="q", node=Node.START, target=np.array([shoulder_pos_initial, elbow_pos_initial])) + constraints.add(ConstraintFcn.TRACK_STATE, key="qdot", node=Node.START, target=np.array([0, 0])) + constraints.add(zero_acceleration, node=Node.START, wM=np.zeros((n_tau, 1)), wS=np.zeros((n_q+n_qdot, 1)), force_field_magnitude=force_field_magnitude) + constraints.add(track_final_marker, node=Node.PENULTIMATE, target=ee_final_position) + constraints.add(ConstraintFcn.TRACK_STATE, key="qdot", node=Node.PENULTIMATE, target=np.array([0, 0])) + constraints.add(zero_acceleration, node=Node.PENULTIMATE, wM=np.zeros((n_tau, 1)), wS=np.zeros((n_q+n_qdot, 1)), force_field_magnitude=force_field_magnitude) # Not possible sice the control on the last node is NaN + constraints.add(ConstraintFcn.TRACK_STATE, key="q", node=Node.ALL, min_bound=0, max_bound=180) # This is a bug, it should be in radians + + if problem_type == "BAR": + max_bounds_lateral_variation = cas.inf + elif problem_type == "CIRCLE": + max_bounds_lateral_variation = 0.004 + else: + raise NotImplementedError("Wrong problem type") + + multinode_constraints = MultinodeConstraintList() + multinode_constraints.add(reach_target_consistantly, + nodes_phase=[0 for _ in range(n_shooting)], + nodes=[i for i in range(n_shooting)], + min_bound=np.array([-cas.inf, -cas.inf, -cas.inf, -cas.inf]), + max_bound=np.array([max_bounds_lateral_variation**2, 0.004**2, 0.05**2, 0.05**2])) + for i in range(n_shooting): + multinode_constraints.add(leuven_trapezoidal, + nodes_phase=[0, 0], + nodes=[i, i+1], + force_field_magnitude=force_field_magnitude) + + # Dynamics + dynamics = DynamicsList() + dynamics.add(configure_stochastic_optimal_control_problem, + dynamic_function=lambda states, controls, parameters, stochastic_variables, nlp, wM, wS, + with_gains: stochastic_forward_dynamics(states, controls, parameters, + stochastic_variables, nlp, wM, wS, + force_field_magnitude=force_field_magnitude, + with_gains=with_gains), + wM=np.zeros((n_tau, 1)), wS=np.zeros((n_q+n_qdot, 1)), expand=False) + + states_min = np.ones((n_states, n_shooting+1)) * -cas.inf + states_max = np.ones((n_states, n_shooting+1)) * cas.inf + + x_bounds = BoundsList() + x_bounds.add(bounds=Bounds(states_min, states_max, interpolation=InterpolationType.EACH_FRAME)) + + u_bounds = BoundsList() + controls_min = np.ones((n_controls, 3)) * -cas.inf + controls_max = np.ones((n_controls, 3)) * cas.inf + u_bounds.add(bounds=Bounds(controls_min, controls_max)) + + # Initial guesses + states_init = np.zeros((n_states, n_shooting + 1)) + states_init[0, :-1] = np.linspace(shoulder_pos_initial, shoulder_pos_final, n_shooting) + states_init[0, -1] = shoulder_pos_final + states_init[1, :-1] = np.linspace(elbow_pos_initial, elbow_pos_final, n_shooting) + states_init[1, -1] = elbow_pos_final + states_init[n_states:, :] = 0.01 + + x_init = InitialGuess(states_init, interpolation=InterpolationType.EACH_FRAME) + + controls_init = np.ones((n_controls, n_shooting)) * 0.01 + + u_init = InitialGuess(controls_init, interpolation=InterpolationType.EACH_FRAME) + + # TODO: This should probably be done automatically, not defined by the user + n_stochastic = n_tau*(n_q+n_qdot) + n_q+n_qdot + n_states*n_states # K(2x4) + ee_ref(4x1) + M(6x6) + stochastic_init = np.zeros((n_stochastic, n_shooting + 1)) + curent_index = 0 + stochastic_init[:n_tau*(n_q+n_qdot), :] = 0.01 # K + curent_index += n_tau*(n_q+n_qdot) + stochastic_init[curent_index: curent_index + n_q + n_qdot, :] = 0.01 # ee_ref + # stochastic_init[curent_index : curent_index + n_q+n_qdot, 0] = np.array([ee_initial_position[0], ee_initial_position[1], 0, 0]) # ee_ref + # stochastic_init[curent_index : curent_index + n_q+n_qdot, 1] = np.array([ee_final_position[0], ee_final_position[1], 0, 0]) + curent_index += n_q + n_qdot + stochastic_init[curent_index: curent_index + n_states * n_states, :] = 0.01 # M + + s_init = InitialGuess(stochastic_init, interpolation=InterpolationType.EACH_FRAME) + + s_bounds = BoundsList() + stochastic_min = np.ones((n_stochastic, 3)) * -cas.inf + stochastic_max = np.ones((n_stochastic, 3)) * cas.inf + s_bounds.add(bounds=Bounds(stochastic_min, stochastic_max)) + + integrated_value_functions = {"cov": lambda nlp, node_index: get_p_mat(nlp, node_index, force_field_magnitude=force_field_magnitude, wM_magnitude=wM_magnitude, wS_magnitude=wS_magnitude)} + + return StochasticOptimalControlProgram( + bio_model, + dynamics, + n_shooting, + final_time, + x_init=x_init, + u_init=u_init, + s_init=s_init, + x_bounds=x_bounds, + u_bounds=u_bounds, + s_bounds=s_bounds, + objective_functions=objective_functions, + multinode_objectives=multinode_objectives, + constraints=constraints, + multinode_constraints=multinode_constraints, + ode_solver=None, + skip_continuity=True, + n_threads=1, + assume_phase_dynamics=False, + problem_type=OcpType.SOCP_EXPLICIT(wM_magnitude, wS_magnitude), + integrated_value_functions=integrated_value_functions, + ) + +def main(): + + RUN_OPTIM_FLAG = True # False + PLOT_SOL_FLAG = True + VIZUALIZE_SOL_FLAG = True + + biorbd_model_path = "models/LeuvenArmModel.bioMod" + + ee_initial_position = np.array([0.0, 0.2742]) # Directly from Tom's version + ee_final_position = np.array([9.359873986980460e-12, 0.527332023564034]) # Directly from Tom's version + + # --- Prepare the ocp --- # + dt = 0.01 + # final_time = 0.8 + # n_shooting = int(final_time/dt) + 1 + # final_time += dt + n_shooting = 4 + final_time = 0.8 + + # --- Noise constants --- # + wM_std = 0.05 + wPq_std = 3e-4 + wPqdot_std = 0.0024 + + wM_magnitude = cas.DM(np.array([wM_std ** 2 / dt, wM_std ** 2 / dt])) + wPq_magnitude = cas.DM(np.array([wPq_std ** 2 / dt, wPq_std ** 2 / dt])) + wPqdot_magnitude = cas.DM(np.array([wPqdot_std ** 2 / dt, wPqdot_std ** 2 / dt])) + wS_magnitude = cas.vertcat(wPq_magnitude, wPqdot_magnitude) + + + # Solver parameters + solver = Solver.IPOPT(show_online_optim=False) + solver.set_linear_solver('mumps') + # solver.set_linear_solver('ma57') + solver.set_tol(1e-3) + solver.set_dual_inf_tol(3e-4) + solver.set_constr_viol_tol(1e-7) + # solver.set_maximum_iterations(10000) + solver.set_maximum_iterations(4) + solver.set_hessian_approximation('limited-memory') + solver.set_bound_frac(1e-8) + solver.set_bound_push(1e-8) + solver.set_nlp_scaling_method('none') + + problem_type = "CIRCLE" + force_field_magnitude = 0 + socp = prepare_socp(biorbd_model_path=biorbd_model_path, + final_time=final_time, + n_shooting=n_shooting, + ee_final_position=ee_final_position, + wM_magnitude=wM_magnitude, + wS_magnitude=wS_magnitude, + problem_type=problem_type, + force_field_magnitude=force_field_magnitude) + + if RUN_OPTIM_FLAG: + sol_socp = socp.solve(solver) + # print('ici') + + q_sol = sol_socp.states["q"] + qdot_sol = sol_socp.states["qdot"] + qddot_sol = sol_socp.states["qddot"] + qdddot_sol = sol_socp.controls["qdddot"] + tau_sol = sol_socp.controls["tau"] + k_sol = sol_socp.stochastic_variables["k"] + ee_ref_sol = sol_socp.stochastic_variables["ee_ref"] + m_sol = sol_socp.stochastic_variables["m"] + cov_sol_vect = sol_socp.integrated_values["cov"] + cov_sol = np.zeros((6, 6, n_shooting)) + for i in range(n_shooting): + for j in range(6): + for k in range(6): + cov_sol[j, k, i] = cov_sol_vect[j*6 + k, i] + stochastic_variables_sol = np.vstack((k_sol, ee_ref_sol, m_sol)) + data = {"q_sol": q_sol, + "qdot_sol": qdot_sol, + "qddot_sol": qddot_sol, + "qdddot_sol": qdddot_sol, + "tau_sol": tau_sol, + "k_sol": k_sol, + "ee_ref_sol": ee_ref_sol, + "m_sol": m_sol, + "cov_sol": cov_sol, + "stochastic_variables_sol": stochastic_variables_sol} + + # --- Save the results --- # + with open(f"leuvenarm_torque_driven_socp_{problem_type}_forcefield{force_field_magnitude}.pkl", "wb") as file: + pickle.dump(data, file) + else: + with open(f"leuvenarm_torque_driven_socp_{problem_type}_forcefield{force_field_magnitude}.pkl", "rb") as file: + data = pickle.load(file) + q_sol = data["q_sol"] + qdot_sol = data["qdot_sol"] + qddot_sol = data["qddot_sol"] + qdddot_sol = data["qdddot_sol"] + tau_sol = data["tau_sol"] + k_sol = data["k_sol"] + ee_ref_sol = data["ee_ref_sol"] + m_sol = data["m_sol"] + # cov_sol = data["cov_sol"] + stochastic_variables_sol = np.vstack((k_sol, ee_ref_sol, m_sol)) + + if VIZUALIZE_SOL_FLAG: + import bioviz + b = bioviz.Viz(model_path=biorbd_model_path) + b.load_movement(q_sol[:, :-1]) + b.exec() + + + # --- Plot the results --- # + if PLOT_SOL_FLAG: + model = biorbd.Model(biorbd_model_path) + Q_sym = cas.MX.sym('Q', 2, 1) + Qdot_sym = cas.MX.sym('Qdot', 2, 1) + hand_pos_fcn = cas.Function("hand_pos", [Q_sym], [model.markers(Q_sym)[2].to_mx()]) + hand_vel_fcn = cas.Function("hand_vel", [Q_sym, Qdot_sym], [model.markersVelocity(Q_sym, Qdot_sym)[2].to_mx()]) + + states = socp.nlp[0].states.cx_start + controls = socp.nlp[0].controls.cx_start + parameters = socp.nlp[0].parameters.cx_start + stochastic_variables = socp.nlp[0].stochastic_variables.cx_start + nlp = socp.nlp[0] + wM_sym = cas.MX.sym('wM', 2, 1) + wS_sym = cas.MX.sym('wS', 4, 1) + out = stochastic_forward_dynamics(states, controls, parameters, stochastic_variables, nlp, wM_sym, wS_sym, force_field_magnitude=force_field_magnitude, with_gains=True) + dyn_fun = cas.Function("dyn_fun", [states, controls, parameters, stochastic_variables, wM_sym, wS_sym], [out.dxdt]) + + fig, axs = plt.subplots(3, 2) + n_simulations = 30 + q_simulated = np.zeros((n_simulations, 2, n_shooting + 1)) + qdot_simulated = np.zeros((n_simulations, 2, n_shooting + 1)) + qddot_simulated = np.zeros((n_simulations, 2, n_shooting + 1)) + hand_pos_simulated = np.zeros((n_simulations, 2, n_shooting + 1)) + hand_vel_simulated = np.zeros((n_simulations, 2, n_shooting + 1)) + for i_simulation in range(n_simulations): + wM = np.random.normal(0, wM_std, (2, n_shooting + 1)) + wPq = np.random.normal(0, wPq_std, (2, n_shooting + 1)) + wPqdot = np.random.normal(0, wPqdot_std, (2, n_shooting + 1)) + wS = cas.vertcat(wPq, wPqdot) + q_simulated[i_simulation, :, 0] = q_sol[:, 0] + qdot_simulated[i_simulation, :, 0] = qdot_sol[:, 0] + qddot_simulated[i_simulation, :, 0] = qddot_sol[:, 0] + for i_node in range(n_shooting): + x_prev = cas.vertcat(q_simulated[i_simulation, :, i_node], qdot_simulated[i_simulation, :, i_node], qddot_simulated[i_simulation, :, i_node]) + hand_pos_simulated[i_simulation, :, i_node] = np.reshape(hand_pos_fcn(x_prev[:2])[:2], (2,)) + hand_vel_simulated[i_simulation, :, i_node] = np.reshape(hand_vel_fcn(x_prev[:2], x_prev[2:4])[:2], (2,)) + u = cas.vertcat(qdddot_sol[:, i_node], tau_sol[:, i_node]) + s = stochastic_variables_sol[:, i_node] + k1 = dyn_fun(x_prev, u, [], s, wM[:, i_node], wS[:, i_node]) + x_next = x_prev + dt * dyn_fun(x_prev + dt / 2 * k1, u, [], s, wM[:, i_node], wS[:, i_node]) + q_simulated[i_simulation, :, i_node + 1] = np.reshape(x_next[:2], (2, )) + qdot_simulated[i_simulation, :, i_node + 1] = np.reshape(x_next[2:4], (2, )) + qddot_simulated[i_simulation, :, i_node + 1] = np.reshape(x_next[4:], (2, )) + hand_pos_simulated[i_simulation, :, i_node + 1] = np.reshape(hand_pos_fcn(x_next[:2])[:2], (2,)) + hand_vel_simulated[i_simulation, :, i_node + 1] = np.reshape(hand_vel_fcn(x_next[:2], x_next[2:4])[:2], (2, )) + axs[0, 0].plot(hand_pos_simulated[i_simulation, 0, :], hand_pos_simulated[i_simulation, 1, :], color="tab:red") + axs[1, 0].plot(np.linspace(0, final_time, n_shooting + 1), q_simulated[i_simulation, 0, :], color="k") + axs[2, 0].plot(np.linspace(0, final_time, n_shooting + 1), q_simulated[i_simulation, 1, :], color="k") + axs[0, 1].plot(hand_vel_simulated[i_simulation, 0, :], hand_vel_simulated[i_simulation, 1, :], color="tab:red") + axs[1, 1].plot(np.linspace(0, final_time, n_shooting + 1), qdot_simulated[i_simulation, 0, :], color="k") + axs[2, 1].plot(np.linspace(0, final_time, n_shooting + 1), qdot_simulated[i_simulation, 1, :], color="k") + hand_pos_without_noise = np.zeros((2, n_shooting + 1)) + for i_node in range(n_shooting + 1): + hand_pos_without_noise[:, i_node] = np.reshape(hand_pos_fcn(q_sol[:, i_node])[:2], (2,)) + axs[0, 0].plot(hand_pos_without_noise[0, :], hand_pos_without_noise[1, :], color="k") + axs[0, 0].plot(ee_initial_position[0], ee_initial_position[1], color="tab:green", marker="o") + axs[0, 0].plot(ee_final_position[0], ee_final_position[1], color="tab:red", marker="o") + axs[0, 0].set_xlabel("X [m]") + axs[0, 0].set_ylabel("Y [m]") + axs[0, 0].set_title("Hand position simulated") + axs[1, 0].set_xlabel("Time [s]") + axs[1, 0].set_ylabel("Shoulder angle [rad]") + axs[2, 0].set_xlabel("Time [s]") + axs[2, 0].set_ylabel("Elbow angle [rad]") + axs[0, 1].set_xlabel("X velocity [m/s]") + axs[0, 1].set_ylabel("Y velocity [m/s]") + axs[0, 1].set_title("Hand velocity simulated") + axs[1, 1].set_xlabel("Time [s]") + axs[1, 1].set_ylabel("Shoulder velocity [rad/s]") + axs[2, 1].set_xlabel("Time [s]") + axs[2, 1].set_ylabel("Elbow velocity [rad/s]") + axs[0, 0].axis("equal") + plt.tight_layout() + plt.savefig("simulated_results.png", dpi=300) + plt.show() + + # TODO: integrate to see the error they commit with the trapezoidal + +if __name__ == "__main__": + main() diff --git a/bioptim/examples/stochastic_optimal_control/models/LeuvenArmModel.bioMod b/bioptim/examples/stochastic_optimal_control/models/LeuvenArmModel.bioMod new file mode 100644 index 000000000..29df4da81 --- /dev/null +++ b/bioptim/examples/stochastic_optimal_control/models/LeuvenArmModel.bioMod @@ -0,0 +1,167 @@ +version 3 + +// SEGMENT DEFINITION + +segment base + inertia + 0 0 0 + 0 0 0 + 0 0 0 + meshfile mesh/ground_ribs.vtp + meshrt 3.14/2 -3.14/2 0 xyz -0.14 -0.05 -0.02 +endsegment + +segment upperArm + parent base + RTinMatrix 1 + RT + 1 0 0 0 + 0 1 0 0 + 0 0 1 0 + 0 0 0 1 + rotations z + mass 1.4 + inertia + 0.0 0.0 0.0 + 0.0 0.0 0.0 + 0.0 0.0 0.025 + com 0.11 0 0 + meshfile mesh/arm_r_humerus.vtp + meshrt 0 0 3.14/2 xyz 0 0 0 +endsegment + +segment foreArm + parent upperArm + RTinMatrix 1 + RT + 1 0 0 0.33 + 0 1 0 0 + 0 0 1 0 + 0 0 0 1 + // -1 0 0 0.33 + // 0 1 0 0 + // 0 0 -1 0 + // 0 0 0 1 + rotations z + mass 1.0 + inertia + 0.0 0.0 0.0 + 0.0 0.0 0.0 + 0.0 0.0 0.045 + com 0.16 0 0 + meshfile mesh/arm_r_ulna.vtp + meshrt 0 0.16 3.14/2-0.1 xyz 0 0.02 0 +endsegment + + // Markers + marker target_start + parent base + position 0.02817553 0.28440442 0.0 + endmarker + marker target_end + parent base + position 0.017223 0.55190516 0.0 + endmarker + marker end_effector + parent foreArm + position 0.33 0 0 + endmarker + + + +// MUSCLE DEFINITION + +// upperArm > foreArm +musclegroup upperArm_to_foreArm + OriginParent upperArm + InsertionParent foreArm +endmusclegroup + + muscle muscle_1 + Type degroote + statetype degroote + musclegroup upperArm_to_foreArm + OriginPosition -0.039234999999999999 0.00347 0.14795 //? + InsertionPosition 0.0075100000000000002 -0.048390000000000002 0.02179 //? + optimalLength 0.1157 //? + maximalForce 624.29999999999995 //? + tendonSlackLength 0.27229999999999999 //? + pennationAngle 0 //? + maxVelocity 10 + endmuscle + + /* + /////////////////////////?????????????????????? + viapoint BIClong-P2 + parent base + muscle BIClong + musclegroup upperArm_to_foreArm + position -0.028944999999999999 0.01391 0.15639 + endviapoint + /////////////////////////?????????????????????? +*/ + + muscle muscle_2 + Type degroote + statetype degroote + musclegroup upperArm_to_foreArm + OriginPosition -0.039234999999999999 0.00347 0.14795 // ? + InsertionPosition 0.0075100000000000002 -0.048390000000000002 0.02179 // ? + optimalLength 0.1157 // ? + maximalForce 624.29999999999995 // ? + tendonSlackLength 0.27229999999999999 // ? + pennationAngle 0 // ? + maxVelocity 10 + endmuscle + + muscle muscle_3 + Type degroote + statetype degroote + musclegroup upperArm_to_foreArm + OriginPosition 0.0046750000000000003 -0.01231 0.13475000000000001 // ? + InsertionPosition 0.0075100000000000002 -0.048390000000000002 0.02179 // ? + optimalLength 0.1321 // ? + maximalForce 435.56 // ? + tendonSlackLength 0.1923 // ? + pennationAngle 0 // ? + maxVelocity 10 + endmuscle + + muscle muscle_4 + Type degroote + statetype degroote + musclegroup upperArm_to_foreArm + OriginPosition -0.039234999999999999 0.00347 0.14795 //? + InsertionPosition 0.0075100000000000002 -0.048390000000000002 0.02179 //? + optimalLength 0.1157 //? + maximalForce 624.29999999999995 //? + tendonSlackLength 0.27229999999999999 //? + pennationAngle 0 //? + maxVelocity 10 + endmuscle + + muscle muscle_5 + Type degroote + statetype degroote + musclegroup upperArm_to_foreArm + OriginPosition -0.039234999999999999 0.00347 0.14795 // ? + InsertionPosition 0.0075100000000000002 -0.048390000000000002 0.02179 // ? + optimalLength 0.1157 // ? + maximalForce 624.29999999999995 // ? + tendonSlackLength 0.27229999999999999 // ? + pennationAngle 0 // ? + maxVelocity 10 + endmuscle + + muscle muscle_6 + Type degroote + statetype degroote + musclegroup upperArm_to_foreArm + OriginPosition 0.0046750000000000003 -0.01231 0.13475000000000001 // ? + InsertionPosition 0.0075100000000000002 -0.048390000000000002 0.02179 // ? + optimalLength 0.1321 // ? + maximalForce 435.56 // ? + tendonSlackLength 0.1923 // ? + pennationAngle 0 // ? + maxVelocity 10 + endmuscle diff --git a/bioptim/examples/stochastic_optimal_control/models/mesh/arm_r_humerus.vtp b/bioptim/examples/stochastic_optimal_control/models/mesh/arm_r_humerus.vtp new file mode 100644 index 000000000..b01c13f6a --- /dev/null +++ b/bioptim/examples/stochastic_optimal_control/models/mesh/arm_r_humerus.vtp @@ -0,0 +1,1228 @@ + + + + + + + -0.241965 0.928387 -0.282046 + -0.421615 0.891296 -0.166834 + -0.670330 0.714611 -0.199971 + -0.776204 0.488631 -0.398431 + -0.649453 0.374399 -0.661844 + -0.390814 0.431251 -0.813195 + -0.165920 0.625156 -0.762660 + -0.101672 0.835461 -0.540063 + 0.133272 0.890320 -0.435395 + -0.021126 0.997308 0.070220 + -0.330078 0.933471 0.140289 + -0.761722 0.635977 0.123745 + -0.924037 0.314799 -0.216928 + -0.755872 0.122545 -0.643149 + -0.340825 0.210203 -0.916326 + 0.080834 0.456267 -0.886164 + 0.226855 0.811746 -0.538149 + 0.168803 0.921058 -0.350939 + 0.082124 0.974772 0.207547 + -0.235549 0.878284 0.416094 + -0.784827 0.490265 0.379061 + -0.996652 0.062476 -0.052741 + -0.776039 -0.146179 -0.613510 + -0.224178 -0.064771 -0.972393 + 0.281896 0.277214 -0.918524 + 0.472616 0.720796 -0.507038 + 0.438742 0.870076 -0.224663 + 0.283569 0.855822 0.432616 + 0.015634 0.885027 0.465276 + -0.624657 0.474151 0.620472 + -0.897849 -0.196578 0.393985 + -0.761345 -0.592749 -0.262684 + -0.256323 -0.565235 -0.784097 + 0.536690 -0.260257 -0.802640 + 0.738515 0.441236 -0.509810 + 0.660496 0.743760 -0.102798 + 0.644355 0.726915 0.237491 + 0.023599 0.879572 0.475179 + -0.625617 0.509551 0.590729 + -0.912367 0.192540 0.361268 + -0.812395 -0.553530 0.183355 + -0.649047 -0.704337 -0.287484 + 0.123341 -0.629996 -0.766741 + 0.707297 -0.140960 -0.692720 + 0.838022 0.473805 -0.270608 + 0.759529 0.547506 0.351216 + 0.936343 0.072560 0.343506 + 0.846878 0.348061 0.402059 + 0.187341 0.469829 0.862650 + -0.238380 0.268495 0.933320 + -0.778725 0.092855 0.620455 + -0.914913 -0.281887 0.288917 + -0.786499 -0.601681 0.139281 + -0.851564 -0.512150 -0.111983 + -0.303144 -0.457790 -0.835782 + 0.397720 -0.368529 -0.840241 + 0.683419 -0.398808 -0.611466 + 0.931200 -0.099411 -0.350690 + 0.998150 -0.008967 0.060136 + 0.757891 0.195298 0.622463 + -0.442859 0.707933 -0.550187 + 0.984627 -0.153851 0.082701 + 0.962952 0.002946 -0.269657 + 0.945927 -0.079786 0.314413 + 0.947308 -0.144622 0.285819 + 0.323654 -0.178892 0.929110 + 0.373107 -0.240141 0.896172 + -0.440819 -0.135038 0.887380 + -0.315257 -0.282541 0.905971 + -0.915464 -0.072115 0.395886 + -0.796242 -0.220124 0.563511 + -0.994844 -0.067766 0.075450 + -0.945503 0.001099 -0.325611 + -0.867654 -0.101187 -0.486763 + -0.362844 -0.042362 -0.930887 + -0.157149 -0.149505 -0.976193 + 0.467906 -0.037114 -0.882999 + 0.719646 -0.160479 -0.675542 + 0.962610 -0.055757 -0.265090 + 0.972865 -0.231316 0.005203 + 0.982466 -0.084589 0.166146 + 0.981535 -0.031981 -0.188592 + 0.885937 -0.044490 0.461667 + 0.115208 -0.037877 0.992619 + -0.610360 -0.017562 0.791929 + -0.950644 0.004913 0.310246 + -0.964308 0.006572 -0.264701 + -0.546217 0.059954 -0.835495 + 0.254958 0.036742 -0.966254 + 0.829007 -0.025922 -0.558637 + 0.994718 -0.025124 -0.099525 + 0.989941 -0.039806 -0.135769 + 0.893612 -0.060112 0.444797 + 0.218010 -0.042508 0.975020 + -0.554327 -0.007801 0.832263 + -0.952176 0.000464 0.305551 + -0.945622 0.056378 -0.320346 + -0.276729 0.081356 -0.957498 + 0.605275 0.016688 -0.795842 + 0.909055 -0.039602 -0.414790 + 0.954586 -0.022579 -0.297080 + 0.923616 -0.081184 0.374623 + 0.341090 -0.077575 0.936824 + -0.329519 -0.071182 0.941462 + -0.857923 -0.033758 0.512668 + -0.998439 0.031365 -0.046206 + -0.609832 0.072521 -0.789206 + 0.429353 0.035802 -0.902427 + -0.764894 -0.405399 0.500589 + -0.776410 -0.492635 0.393063 + -0.971393 -0.197380 0.132048 + -0.929065 -0.354124 0.106930 + -0.920533 -0.221924 -0.321510 + 0.391504 -0.215172 -0.894665 + 0.711999 -0.367368 -0.598413 + 0.716689 -0.471528 -0.513826 + 0.874237 -0.477134 -0.089734 + 0.892208 -0.450570 -0.030852 + 0.808883 -0.376434 0.451670 + 0.890101 -0.423324 -0.168868 + 0.891317 -0.415140 0.182242 + 0.882279 -0.192315 0.429650 + 0.909237 -0.136289 0.393336 + 0.933109 -0.259752 0.248670 + 0.907367 -0.213420 0.362129 + 0.306057 -0.190278 0.932804 + -0.380544 -0.362686 0.850673 + 0.318574 -0.330503 0.888413 + -0.235764 -0.407482 0.882255 + 0.402369 -0.113316 -0.908438 + 0.216276 -0.387801 -0.896011 + -0.262611 -0.652644 -0.710697 + -0.298542 -0.926215 -0.230214 + 0.074983 -0.737758 -0.670888 + 0.344718 -0.764863 -0.544200 + -0.600093 0.023092 -0.799596 + -0.747168 -0.111063 -0.655290 + -0.735035 -0.654455 -0.177237 + -0.719649 -0.689121 -0.084958 + -0.740419 -0.488711 -0.461456 + -0.484463 -0.795245 -0.364529 + 0.085201 0.658875 -0.747412 + -0.894608 0.346068 -0.282691 + -0.991060 0.012452 -0.132834 + -0.691517 -0.600558 -0.401415 + -0.944358 -0.148346 -0.293565 + -0.939052 -0.327945 -0.103120 + -0.109432 0.803847 -0.584684 + -0.995519 -0.041596 0.084923 + -0.987827 -0.111081 0.108896 + -0.914842 0.291406 0.279546 + -0.956325 0.291966 0.014111 + -0.843326 0.189985 -0.502700 + -0.740370 -0.083770 -0.666959 + -0.835304 -0.172746 0.521944 + -0.920294 0.110741 0.375228 + -0.086781 0.939184 -0.332268 + -0.724374 -0.134688 -0.676122 + -0.367459 -0.130611 -0.920823 + -0.507775 -0.174462 -0.843639 + 0.851820 0.523639 0.014296 + -0.841677 -0.503100 0.196142 + -0.694816 -0.662222 0.280521 + -0.793453 -0.607858 0.030671 + -0.694432 -0.557535 -0.454883 + -0.476099 -0.473900 -0.740776 + -0.518770 -0.346975 -0.781336 + 0.978328 -0.159539 0.131989 + -0.798819 -0.550527 -0.242503 + 0.829924 0.503123 -0.241026 + 0.738857 0.618423 0.267663 + 0.701330 0.710032 0.063173 + 0.622553 0.771087 -0.133614 + 0.787753 0.611330 -0.075634 + 0.885088 0.136826 -0.444858 + 0.947331 0.181647 0.263759 + 0.968711 0.237628 0.071643 + 0.904933 0.410747 -0.111278 + 0.883772 0.466501 0.036394 + 0.852569 -0.371496 -0.367583 + 0.904746 -0.315326 0.286364 + 0.941129 -0.323709 0.097406 + 0.948710 -0.290584 -0.124542 + 0.968900 -0.242881 0.047338 + 0.546025 -0.787578 0.285618 + 0.573760 -0.793951 0.201103 + 0.534371 -0.840657 -0.087998 + 0.510192 -0.859474 -0.031765 + -0.143870 -0.944136 0.296494 + -0.120397 -0.983277 0.136640 + -0.047506 -0.992501 -0.112631 + 0.067596 -0.993412 -0.092539 + -0.751091 -0.587499 0.301175 + -0.722285 -0.689261 0.056770 + -0.631867 -0.716261 -0.296167 + -0.568936 -0.822382 0.000331 + -0.960600 -0.146299 0.236316 + -0.966642 -0.254528 -0.028613 + -0.857656 -0.264803 -0.440801 + -0.890473 -0.424749 -0.163238 + 0.710035 -0.508625 -0.486981 + 0.683429 -0.238088 -0.690100 + 0.816331 0.205356 -0.539845 + 0.846203 0.358155 -0.394546 + 0.696073 0.685778 0.212584 + 0.821179 -0.174612 -0.543301 + 0.786005 0.037730 -0.617068 + 0.816454 -0.060255 -0.574258 + 0.732578 0.510246 -0.450532 + 0.962461 -0.242146 -0.122610 + 0.985225 -0.043929 0.165534 + 0.704197 0.558382 -0.438540 + 0.930785 0.340753 -0.132391 + -0.467923 0.336732 0.817104 + -0.999076 -0.042835 0.003570 + -0.944865 -0.111212 -0.307998 + 0.047043 0.483686 -0.873976 + -0.979213 -0.188544 -0.074787 + -0.956851 -0.103925 0.271358 + -0.848526 0.121085 0.515114 + -0.837348 -0.503961 0.211829 + -0.850657 -0.409592 0.329570 + -0.782532 -0.265550 0.563141 + -0.640367 0.008332 0.768024 + 0.439317 0.612040 0.657577 + -0.660774 -0.734556 0.154288 + -0.501274 -0.640305 0.582008 + -0.251396 -0.496841 0.830632 + -0.196072 -0.290156 0.936678 + -0.033799 0.160406 0.986472 + -0.269436 -0.771981 0.575717 + -0.053992 -0.517273 0.854116 + 0.148472 -0.168105 0.974524 + 0.610070 0.724889 0.319921 + 0.408025 0.170260 0.896954 + 0.046951 -0.996400 -0.070593 + 0.620239 -0.777421 -0.104505 + 0.975552 -0.207031 -0.073734 + 0.872972 0.444224 -0.201458 + 0.671892 0.730514 -0.122109 + -0.218241 -0.974348 0.054935 + 0.350171 -0.933821 -0.073203 + 0.825083 -0.562775 -0.050225 + 0.994194 -0.080934 -0.070905 + 0.945104 0.307372 -0.110907 + 0.656532 0.744358 -0.122050 + 0.323149 0.944250 -0.062985 + -0.076772 -0.876381 0.475461 + 0.307397 -0.655417 0.689881 + 0.669972 -0.226073 0.707127 + 0.734861 0.296480 0.609982 + 0.568857 0.713629 0.408823 + -0.981359 0.190579 0.024787 + 0.682279 0.729359 0.050310 + 0.872274 0.442821 0.207480 + 0.905862 0.254990 0.338222 + 0.984873 0.084914 0.151042 + 0.992939 0.103690 0.057620 + 0.941983 0.215575 0.257285 + 0.925266 0.378044 -0.031070 + 0.819973 0.512067 0.255796 + 0.680342 0.709262 0.184613 + 0.544797 0.825912 -0.145142 + 0.548692 0.835588 -0.027031 + 0.868139 0.496204 -0.010761 + 0.831372 0.434000 -0.347081 + 0.750196 0.621050 0.226941 + 0.952495 -0.041923 -0.301655 + 0.987109 -0.083437 -0.136582 + 0.979630 -0.104837 -0.171272 + 0.893032 0.240891 -0.380087 + 0.911056 0.169028 0.376041 + 0.792382 0.351870 0.498316 + 0.951678 0.105219 -0.288509 + 0.999143 0.041351 0.002027 + 0.808929 0.001830 0.587904 + 0.239201 0.155238 0.958480 + -0.979641 -0.038595 0.197011 + -0.957296 -0.084818 -0.276388 + -0.406128 0.099725 -0.908358 + 0.619177 0.170148 -0.766596 + 0.657723 0.101958 -0.746328 + 0.993211 -0.028962 -0.112661 + 0.955023 0.010542 -0.296346 + 0.981101 -0.008132 0.193325 + 0.930652 -0.060265 0.360908 + 0.606895 0.009545 0.794725 + 0.469673 -0.059830 0.880811 + -0.439364 0.052686 0.896763 + -0.332264 0.000635 0.943186 + -0.973364 -0.016781 0.228649 + -0.911411 0.035395 0.409973 + -0.903361 -0.030027 -0.427828 + -0.879859 0.090109 -0.466613 + -0.058423 0.069487 -0.995871 + -0.129454 0.076419 -0.988636 + 0.525425 0.037067 -0.850032 + 0.537427 0.032297 -0.842692 + 0.725348 0.013743 -0.688245 + 0.818898 0.006957 -0.573896 + 0.932518 -0.009304 -0.361005 + 0.938634 -0.087884 0.333530 + 0.488334 -0.129456 0.863001 + -0.109388 -0.102396 0.988711 + -0.760028 -0.039507 0.648688 + -0.999868 0.012122 0.010820 + -0.619478 0.050620 -0.783380 + 0.352019 0.040230 -0.935128 + 0.813742 0.041891 -0.579715 + + + + + -0.003244 0.022145 -0.007029 + -0.009188 0.021757 -0.003054 + -0.015251 0.017942 -0.003615 + -0.018211 0.012891 -0.007792 + -0.016575 0.009246 -0.013576 + -0.010928 0.009649 -0.017587 + -0.004086 0.014405 -0.017265 + -0.002427 0.019449 -0.012335 + -0.002748 0.022121 -0.006969 + 0.002353 0.023356 -0.002803 + -0.007155 0.022663 0.003832 + -0.017598 0.015852 0.002462 + -0.021310 0.008721 -0.004652 + -0.017751 0.002869 -0.014689 + -0.008703 0.003966 -0.020695 + 0.001233 0.010930 -0.020080 + 0.004971 0.020040 -0.011576 + 0.002739 0.023418 -0.002639 + 0.008170 0.022454 0.001271 + -0.003993 0.021530 0.010593 + -0.018156 0.012354 0.008207 + -0.022899 0.002425 -0.002320 + -0.018077 -0.002902 -0.014250 + -0.005922 -0.000902 -0.022249 + 0.006588 0.004748 -0.020926 + 0.012041 0.017227 -0.009431 + 0.008166 0.022208 0.002045 + 0.011549 0.021347 0.004581 + 0.000434 0.020121 0.014291 + -0.017473 0.010115 0.010857 + -0.022446 -0.000708 0.001880 + -0.017680 -0.007626 -0.011885 + -0.004088 -0.008184 -0.021088 + 0.011399 0.000412 -0.019046 + 0.015519 0.015315 -0.008920 + 0.012084 0.020805 0.005781 + 0.015023 0.015432 0.008561 + 0.004268 0.017597 0.020783 + -0.009263 0.012481 0.017274 + -0.014553 0.005099 0.012266 + -0.018456 -0.005989 0.001841 + -0.014168 -0.010596 -0.006234 + -0.004545 -0.013629 -0.015277 + 0.012713 -0.003616 -0.013976 + 0.020082 0.010297 -0.004429 + 0.015269 0.015821 0.009177 + 0.016555 0.007919 0.010461 + 0.016959 0.011885 0.015338 + 0.007396 0.012197 0.025325 + -0.003283 0.008705 0.026377 + -0.013737 0.001648 0.022501 + -0.016766 -0.004063 0.016965 + -0.012606 -0.009845 0.008658 + -0.009881 -0.016235 -0.002200 + -0.002202 -0.020117 -0.011343 + 0.013524 -0.010481 -0.008362 + 0.021547 -0.004656 -0.007384 + 0.025149 0.000617 -0.001751 + 0.025735 0.003363 0.003644 + 0.024020 0.006003 0.007184 + -0.010938 0.015935 -0.012544 + 0.012182 -0.023823 0.005011 + 0.011029 -0.041944 0.002473 + 0.012751 -0.042883 0.007851 + 0.013496 -0.025435 0.011856 + 0.008526 -0.041976 0.012286 + 0.010080 -0.027862 0.014966 + -0.000761 -0.042723 0.012073 + -0.000955 -0.029565 0.014659 + -0.007796 -0.042698 0.005221 + -0.005025 -0.028850 0.011905 + -0.007637 -0.026900 0.003416 + -0.008240 -0.043255 0.001167 + -0.007076 -0.026718 -0.003651 + -0.000496 -0.041919 -0.008140 + -0.000292 -0.025300 -0.009993 + 0.008762 -0.042400 -0.007335 + 0.011699 -0.023893 -0.006030 + 0.011456 -0.042134 -0.003658 + 0.013812 -0.024251 0.000533 + 0.011026 -0.041941 0.002471 + 0.011295 -0.070938 0.000594 + 0.012629 -0.073147 0.007015 + 0.003747 -0.071300 0.010301 + -0.006410 -0.071249 0.005919 + -0.007978 -0.071089 0.001440 + -0.007103 -0.070953 -0.003238 + -0.001930 -0.069544 -0.008766 + 0.005248 -0.069828 -0.008195 + 0.010276 -0.070448 -0.004992 + 0.011294 -0.070990 0.000587 + 0.009461 -0.096869 -0.002659 + 0.010547 -0.099296 0.005653 + 0.003011 -0.096196 0.009137 + -0.003479 -0.096289 0.009406 + -0.007278 -0.095051 0.005450 + -0.008139 -0.094138 -0.002078 + -0.002702 -0.094297 -0.011241 + 0.004935 -0.096129 -0.010073 + 0.009450 -0.096810 -0.002643 + 0.008569 -0.119485 -0.004240 + 0.009791 -0.116960 0.004989 + 0.004835 -0.117444 0.008255 + -0.003266 -0.116925 0.008734 + -0.006328 -0.117512 0.004643 + -0.008821 -0.117297 -0.003839 + -0.006297 -0.117521 -0.010624 + 0.002875 -0.118829 -0.011929 + -0.005818 -0.020940 0.014888 + -0.008856 -0.013017 0.018095 + -0.008528 -0.020831 0.004821 + -0.009350 -0.016567 0.006621 + -0.007876 -0.022419 -0.003686 + 0.011849 -0.017701 -0.006517 + 0.015308 -0.015891 -0.005226 + 0.018906 -0.009752 -0.005891 + 0.020639 -0.007164 -0.002529 + 0.021890 -0.005532 0.001109 + 0.023147 -0.003132 0.004990 + 0.016394 -0.015340 -0.002319 + 0.017376 -0.014082 0.001727 + 0.016320 -0.002660 0.009930 + 0.017201 -0.003261 0.017416 + 0.013916 -0.014016 0.007850 + 0.013998 -0.016768 0.014428 + 0.006757 -0.005730 0.024424 + -0.007994 -0.006661 0.024288 + 0.007661 -0.018510 0.018617 + -0.000738 -0.019969 0.018286 + 0.000073 -0.282517 -0.042841 + -0.001307 -0.285146 -0.043295 + -0.000876 -0.290486 -0.041449 + 0.002684 -0.293483 -0.036206 + 0.005130 -0.293851 -0.030730 + 0.011529 -0.301300 -0.028188 + -0.002660 -0.283083 -0.043811 + -0.004632 -0.285732 -0.041886 + -0.005840 -0.285336 -0.036744 + -0.004656 -0.285036 -0.031411 + -0.002703 -0.290263 -0.027093 + 0.001644 -0.302885 -0.025455 + -0.000048 -0.275476 -0.040749 + -0.005837 -0.275374 -0.032872 + -0.004980 -0.283163 -0.030496 + -0.004352 -0.286292 -0.025248 + -0.004472 -0.289312 -0.023766 + -0.004438 -0.297099 -0.022931 + -0.000219 -0.270320 -0.033987 + -0.005680 -0.274132 -0.025349 + -0.005405 -0.291137 -0.020941 + -0.003259 -0.288600 -0.015178 + -0.003140 -0.288734 -0.009550 + -0.004918 -0.287426 -0.002675 + -0.008215 -0.286556 0.000746 + -0.000784 -0.276645 -0.021791 + 0.002831 -0.278378 -0.017336 + 0.004227 -0.279963 -0.012833 + 0.001871 -0.279556 -0.004865 + -0.005255 -0.280590 -0.000547 + -0.007604 -0.281241 -0.000560 + 0.009713 -0.278483 -0.024464 + -0.006093 -0.270213 -0.019561 + -0.001314 -0.273361 -0.016955 + 0.000624 -0.274196 -0.011630 + -0.001128 -0.274224 -0.006328 + -0.004515 -0.274949 -0.003621 + -0.008726 -0.273296 -0.001730 + 0.000543 -0.269516 -0.019547 + -0.006970 -0.266334 -0.009127 + 0.015406 -0.284528 -0.025336 + 0.013312 -0.283321 -0.020057 + 0.012064 -0.284744 -0.012793 + 0.010340 -0.283020 -0.008705 + 0.008863 -0.281382 -0.004190 + 0.017580 -0.289385 -0.026864 + 0.015714 -0.288724 -0.018685 + 0.013674 -0.288393 -0.012535 + 0.013172 -0.285872 -0.009064 + 0.013613 -0.285364 -0.005840 + 0.017085 -0.294866 -0.027418 + 0.015569 -0.293575 -0.019386 + 0.013521 -0.292119 -0.012723 + 0.014469 -0.292237 -0.008933 + 0.014833 -0.292261 -0.006123 + 0.011632 -0.299754 -0.020104 + 0.010544 -0.297107 -0.013407 + 0.010647 -0.296786 -0.009133 + 0.009532 -0.298110 -0.004600 + 0.004218 -0.301180 -0.018558 + 0.003966 -0.298370 -0.011211 + 0.003981 -0.298598 -0.007254 + 0.003666 -0.299191 -0.002382 + -0.002499 -0.296840 -0.018021 + -0.000776 -0.295464 -0.010884 + -0.000540 -0.296957 -0.005080 + -0.001149 -0.298908 0.000018 + -0.003687 -0.291230 -0.016841 + -0.002756 -0.291286 -0.009557 + -0.004298 -0.291975 -0.002914 + -0.007010 -0.293095 0.000731 + 0.005384 -0.291532 -0.037754 + 0.007230 -0.291693 -0.030575 + 0.006180 -0.280740 -0.038445 + 0.008076 -0.279409 -0.031089 + 0.009639 -0.278443 -0.024458 + 0.006761 -0.285540 -0.036787 + 0.008795 -0.286054 -0.030469 + 0.006566 -0.290088 -0.035287 + 0.003730 -0.266854 -0.025257 + 0.006736 -0.264837 -0.016813 + 0.006186 -0.262338 -0.012123 + 0.003690 -0.273340 -0.034135 + 0.005615 -0.271728 -0.027749 + -0.007667 -0.260900 0.010428 + -0.011129 -0.261075 -0.000199 + -0.008536 -0.259852 -0.015319 + -0.001495 -0.260296 -0.025350 + -0.010141 -0.279368 0.004475 + -0.010110 -0.273404 0.009054 + -0.009356 -0.265051 0.011089 + -0.005826 -0.290703 0.005216 + -0.005376 -0.291468 0.010361 + -0.005761 -0.286223 0.013935 + -0.005254 -0.279402 0.016580 + -0.004235 -0.270576 0.014945 + -0.000776 -0.297935 0.007316 + -0.001010 -0.294387 0.013980 + 0.001717 -0.290229 0.018066 + 0.000610 -0.286407 0.019544 + -0.000330 -0.281830 0.020771 + 0.002317 -0.297589 0.011059 + 0.007460 -0.295108 0.014537 + 0.010172 -0.289351 0.016043 + 0.008882 -0.280127 0.015308 + 0.009263 -0.283447 0.016698 + 0.005069 -0.299011 0.001932 + 0.009922 -0.297249 0.000014 + 0.013551 -0.292249 -0.002188 + 0.013115 -0.286306 -0.001260 + 0.009440 -0.282017 0.000790 + 0.003432 -0.299874 0.006789 + 0.011076 -0.299271 0.006353 + 0.015577 -0.295345 0.006527 + 0.016858 -0.291095 0.005933 + 0.016818 -0.286690 0.006324 + 0.013095 -0.281181 0.006746 + 0.008211 -0.278995 0.007128 + 0.006782 -0.299695 0.010843 + 0.011682 -0.296932 0.013931 + 0.014112 -0.291093 0.016133 + 0.014688 -0.285733 0.015138 + 0.011296 -0.281280 0.014078 + -0.000979 -0.298563 0.004093 + 0.004632 -0.278044 0.011244 + 0.002939 -0.274501 0.008290 + 0.003082 -0.272393 0.004595 + 0.006112 -0.266775 -0.007410 + 0.006751 -0.271682 -0.006277 + 0.004070 -0.274857 0.001301 + 0.008000 -0.278592 -0.004304 + 0.005370 -0.277938 0.000189 + 0.007513 -0.280087 -0.000029 + 0.005973 -0.278931 0.009821 + 0.006291 -0.279137 0.003778 + 0.004212 -0.277520 0.005751 + 0.006441 -0.280080 -0.008673 + 0.006099 -0.280151 -0.017543 + 0.005123 -0.272035 -0.009627 + 0.004907 -0.271847 -0.014437 + 0.005456 -0.266769 -0.012823 + 0.006000 -0.261020 -0.015903 + 0.005545 -0.262529 -0.007731 + 0.002279 -0.262817 0.000811 + 0.003717 -0.246915 -0.014849 + 0.005378 -0.245431 -0.008828 + 0.001550 -0.245784 -0.001498 + -0.009665 -0.244816 0.005731 + -0.012037 -0.242822 -0.001386 + -0.011242 -0.242399 -0.011966 + -0.003615 -0.247872 -0.021303 + 0.000268 -0.246665 -0.017915 + 0.003721 -0.246949 -0.014852 + 0.005380 -0.192929 -0.010625 + 0.003402 -0.226637 -0.013316 + 0.005137 -0.226970 -0.007943 + 0.005411 -0.194794 -0.004278 + -0.000305 -0.225814 -0.000853 + 0.000467 -0.193890 0.000268 + -0.010525 -0.226541 0.003325 + -0.007298 -0.193380 0.001301 + -0.013335 -0.226722 -0.003529 + -0.013444 -0.193071 -0.004460 + -0.012748 -0.227827 -0.012980 + -0.012464 -0.192921 -0.012504 + -0.005256 -0.227419 -0.018903 + -0.002420 -0.192819 -0.017128 + -0.001158 -0.228425 -0.017326 + 0.002633 -0.193354 -0.014930 + 0.003408 -0.226693 -0.013317 + 0.005355 -0.193002 -0.010619 + 0.007425 -0.150734 -0.007848 + 0.007986 -0.152205 -0.000563 + 0.004291 -0.151938 0.003414 + 0.000289 -0.151330 0.005056 + -0.005137 -0.148847 0.003371 + -0.010171 -0.147607 -0.003716 + -0.008081 -0.148241 -0.012067 + 0.001852 -0.148773 -0.014361 + 0.008472 -0.119500 -0.004121 + + + + + 10 9 0 + 1 10 0 + 11 10 1 + 2 11 1 + 12 11 2 + 3 12 2 + 13 12 3 + 4 13 3 + 14 13 4 + 5 14 4 + 15 14 5 + 6 15 5 + 16 15 6 + 7 16 6 + 17 16 7 + 8 17 7 + 19 18 9 + 10 19 9 + 20 19 10 + 11 20 10 + 21 20 11 + 12 21 11 + 22 21 12 + 13 22 12 + 23 22 13 + 14 23 13 + 24 23 14 + 15 24 14 + 25 24 15 + 16 25 15 + 26 25 16 + 17 26 16 + 28 27 18 + 19 28 18 + 29 28 19 + 20 29 19 + 30 29 20 + 21 30 20 + 31 30 21 + 22 31 21 + 32 31 22 + 23 32 22 + 33 32 23 + 24 33 23 + 34 33 24 + 25 34 24 + 35 34 25 + 26 35 25 + 28 36 27 + 28 37 36 + 29 37 28 + 29 38 37 + 30 38 29 + 30 39 38 + 30 40 39 + 31 40 30 + 31 41 40 + 32 41 31 + 32 42 41 + 33 42 32 + 33 43 42 + 34 43 33 + 34 44 43 + 35 44 34 + 35 45 44 + 36 47 46 + 37 47 36 + 37 48 47 + 38 48 37 + 38 49 48 + 38 50 49 + 39 50 38 + 39 51 50 + 40 51 39 + 40 52 51 + 40 53 52 + 41 53 40 + 41 54 53 + 42 54 41 + 42 55 54 + 42 56 55 + 43 56 42 + 43 57 56 + 44 57 43 + 44 58 57 + 44 59 58 + 45 59 44 + 45 46 59 + 7 60 0 + 6 60 7 + 5 60 6 + 4 60 5 + 3 60 4 + 2 60 3 + 1 60 2 + 0 60 1 + 63 62 61 + 64 63 61 + 65 63 64 + 66 65 64 + 67 65 66 + 68 67 66 + 69 67 68 + 70 69 68 + 71 69 70 + 72 69 71 + 73 72 71 + 74 72 73 + 75 74 73 + 76 74 75 + 77 76 75 + 78 76 77 + 79 78 77 + 80 78 79 + 61 80 79 + 82 81 62 + 63 82 62 + 83 82 63 + 65 83 63 + 84 83 65 + 67 84 65 + 85 84 67 + 69 85 67 + 86 85 69 + 72 86 69 + 87 86 72 + 74 87 72 + 88 87 74 + 76 88 74 + 89 88 76 + 78 89 76 + 90 89 78 + 80 90 78 + 92 91 81 + 82 92 81 + 93 92 82 + 83 93 82 + 94 93 83 + 84 94 83 + 85 94 84 + 95 94 85 + 86 95 85 + 96 95 86 + 87 96 86 + 97 96 87 + 88 97 87 + 98 97 88 + 89 98 88 + 99 98 89 + 90 99 89 + 101 100 91 + 92 101 91 + 102 101 92 + 93 102 92 + 103 102 93 + 94 103 93 + 104 103 94 + 95 104 94 + 105 104 95 + 96 105 95 + 106 105 96 + 97 106 96 + 107 106 97 + 98 107 97 + 100 107 98 + 99 100 98 + 110 71 70 + 108 110 70 + 111 110 108 + 109 111 108 + 52 111 109 + 51 52 109 + 112 73 71 + 110 112 71 + 111 112 110 + 53 112 111 + 52 53 111 + 112 75 73 + 54 75 112 + 53 54 112 + 75 113 77 + 54 113 75 + 54 55 113 + 113 114 77 + 113 115 114 + 55 115 113 + 55 56 115 + 116 115 56 + 57 116 56 + 117 116 57 + 58 117 57 + 118 117 58 + 59 118 58 + 119 114 115 + 116 119 115 + 117 119 116 + 120 119 117 + 118 120 117 + 119 77 114 + 79 77 119 + 120 79 119 + 121 118 59 + 46 121 59 + 122 121 46 + 47 122 46 + 123 120 118 + 121 123 118 + 124 123 121 + 122 124 121 + 61 79 120 + 123 61 120 + 64 61 123 + 124 64 123 + 125 122 47 + 48 125 47 + 49 125 48 + 126 125 49 + 50 126 49 + 109 126 50 + 51 109 50 + 127 124 122 + 125 127 122 + 128 127 125 + 126 128 125 + 108 128 126 + 109 108 126 + 66 64 124 + 127 66 124 + 68 66 127 + 128 68 127 + 70 68 128 + 108 70 128 + 136 135 129 + 130 136 129 + 137 136 130 + 131 137 130 + 138 137 131 + 132 138 131 + 139 138 132 + 133 139 132 + 140 139 133 + 134 140 133 + 142 141 135 + 136 142 135 + 143 142 136 + 137 143 136 + 144 143 137 + 138 144 137 + 145 144 138 + 139 145 138 + 146 145 139 + 140 146 139 + 142 147 141 + 148 147 142 + 143 148 142 + 149 148 143 + 144 149 143 + 145 149 144 + 146 149 145 + 149 154 148 + 150 154 149 + 150 155 154 + 151 155 150 + 151 156 155 + 152 156 151 + 152 157 156 + 152 158 157 + 153 158 152 + 153 159 158 + 162 161 148 + 154 162 148 + 163 162 154 + 155 163 154 + 156 163 155 + 164 163 156 + 157 164 156 + 165 164 157 + 158 165 157 + 166 165 158 + 159 166 158 + 162 168 161 + 163 168 162 + 164 168 163 + 165 168 164 + 166 168 165 + 175 174 169 + 170 175 169 + 176 175 170 + 171 176 170 + 177 176 171 + 172 177 171 + 178 177 172 + 173 178 172 + 180 179 174 + 175 180 174 + 181 180 175 + 176 181 175 + 182 181 176 + 177 182 176 + 183 182 177 + 178 183 177 + 184 134 179 + 180 184 179 + 185 184 180 + 181 185 180 + 186 185 181 + 182 186 181 + 187 186 182 + 183 187 182 + 188 140 134 + 184 188 134 + 189 188 184 + 185 189 184 + 190 189 185 + 186 190 185 + 191 190 186 + 187 191 186 + 192 146 140 + 188 192 140 + 193 192 188 + 189 193 188 + 194 193 189 + 190 194 189 + 195 194 190 + 191 195 190 + 196 149 146 + 192 196 146 + 197 196 192 + 193 197 192 + 198 197 193 + 194 198 193 + 199 198 194 + 195 199 194 + 196 150 149 + 151 150 196 + 197 151 196 + 152 151 197 + 198 152 197 + 153 152 198 + 199 153 198 + 200 132 131 + 133 132 200 + 201 133 200 + 134 133 201 + 179 134 201 + 205 130 129 + 202 205 129 + 206 205 202 + 203 206 202 + 169 206 203 + 204 169 203 + 207 131 130 + 205 207 130 + 201 207 205 + 206 201 205 + 174 201 206 + 169 174 206 + 207 200 131 + 201 200 207 + 174 179 201 + 211 141 147 + 208 211 147 + 212 211 208 + 209 212 208 + 167 212 209 + 210 167 209 + 202 129 141 + 211 202 141 + 203 202 211 + 212 203 211 + 160 203 212 + 167 160 212 + 215 168 214 + 215 161 168 + 215 148 161 + 216 148 215 + 216 147 148 + 214 168 217 + 218 214 217 + 219 214 218 + 213 214 219 + 217 153 199 + 220 217 199 + 221 217 220 + 218 217 221 + 222 218 221 + 219 218 222 + 223 219 222 + 213 219 223 + 224 213 223 + 220 199 195 + 225 220 195 + 221 220 225 + 226 221 225 + 227 221 226 + 222 221 227 + 228 222 227 + 223 222 228 + 229 223 228 + 224 223 229 + 230 226 225 + 227 226 230 + 231 227 230 + 232 227 231 + 228 227 232 + 234 228 232 + 229 228 234 + 233 229 234 + 224 229 233 + 235 241 240 + 236 241 235 + 236 242 241 + 237 242 236 + 237 243 242 + 238 243 237 + 238 244 243 + 238 245 244 + 239 245 238 + 239 246 245 + 241 247 240 + 248 247 241 + 242 248 241 + 249 248 242 + 243 249 242 + 250 249 243 + 244 250 243 + 245 250 244 + 251 250 245 + 246 251 245 + 195 252 225 + 235 225 195 + 240 225 235 + 230 225 240 + 247 230 240 + 231 230 247 + 248 231 247 + 232 231 248 + 249 232 248 + 250 232 249 + 234 232 250 + 251 234 250 + 233 234 251 + 253 224 233 + 254 224 253 + 255 224 254 + 258 257 256 + 255 258 256 + 260 259 257 + 258 260 257 + 260 261 259 + 239 173 259 + 261 239 259 + 238 178 173 + 239 238 173 + 237 183 178 + 238 237 178 + 236 187 183 + 237 236 183 + 235 191 187 + 236 235 187 + 235 195 191 + 246 233 251 + 246 262 233 + 246 263 262 + 239 263 246 + 239 261 263 + 264 253 233 + 262 264 233 + 263 264 262 + 260 264 263 + 261 260 263 + 264 254 253 + 258 254 264 + 260 258 264 + 258 255 254 + 265 259 173 + 172 265 173 + 156 265 172 + 171 156 172 + 266 156 171 + 170 266 171 + 204 266 170 + 169 204 170 + 267 257 259 + 265 267 259 + 156 267 265 + 268 267 156 + 266 268 156 + 167 268 266 + 204 167 266 + 269 256 257 + 267 269 257 + 268 269 267 + 209 269 268 + 167 209 268 + 269 210 256 + 269 210 209 + 208 147 216 + 270 208 216 + 209 208 270 + 210 209 270 + 271 256 210 + 255 256 271 + 272 255 271 + 224 255 272 + 213 224 272 + 274 270 273 + 274 210 270 + 275 210 274 + 275 271 210 + 276 271 275 + 276 272 271 + 276 213 272 + 277 213 276 + 277 214 213 + 278 214 277 + 278 215 214 + 279 215 278 + 279 216 215 + 280 216 279 + 280 270 216 + 281 270 280 + 284 283 282 + 285 284 282 + 286 284 285 + 287 286 285 + 288 286 287 + 289 288 287 + 290 288 289 + 291 290 289 + 292 290 291 + 293 292 291 + 294 292 293 + 295 294 293 + 296 294 295 + 297 296 295 + 298 296 297 + 299 298 297 + 274 273 283 + 284 274 283 + 275 274 284 + 286 275 284 + 276 275 286 + 288 276 286 + 277 276 288 + 290 277 288 + 278 277 290 + 292 278 290 + 279 278 292 + 294 279 292 + 280 279 294 + 296 280 294 + 281 280 296 + 298 281 296 + 285 282 300 + 301 285 300 + 287 285 301 + 302 287 301 + 289 287 302 + 303 289 302 + 291 289 303 + 304 291 303 + 293 291 304 + 305 293 304 + 295 293 305 + 306 295 305 + 297 295 306 + 307 297 306 + 299 297 307 + 300 299 307 + 301 300 100 + 101 301 100 + 302 301 101 + 102 302 101 + 303 302 102 + 103 303 102 + 304 303 103 + 104 304 103 + 305 304 104 + 105 305 104 + 306 305 105 + 106 306 105 + 307 306 106 + 107 307 106 + 300 307 107 + 308 300 107 + 159 217 166 + 159 153 217 + + + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 159 162 165 168 171 174 177 180 183 186 189 192 195 198 201 204 207 210 213 216 219 222 225 228 231 234 237 240 243 246 249 252 255 258 261 264 267 270 273 276 279 282 285 288 291 294 297 300 303 306 309 312 315 318 321 324 327 330 333 336 339 342 345 348 351 354 357 360 363 366 369 372 375 378 381 384 387 390 393 396 399 402 405 408 411 414 417 420 423 426 429 432 435 438 441 444 447 450 453 456 459 462 465 468 471 474 477 480 483 486 489 492 495 498 501 504 507 510 513 516 519 522 525 528 531 534 537 540 543 546 549 552 555 558 561 564 567 570 573 576 579 582 585 588 591 594 597 600 603 606 609 612 615 618 621 624 627 630 633 636 639 642 645 648 651 654 657 660 663 666 669 672 675 678 681 684 687 690 693 696 699 702 705 708 711 714 717 720 723 726 729 732 735 738 741 744 747 750 753 756 759 762 765 768 771 774 777 780 783 786 789 792 795 798 801 804 807 810 813 816 819 822 825 828 831 834 837 840 843 846 849 852 855 858 861 864 867 870 873 876 879 882 885 888 891 894 897 900 903 906 909 912 915 918 921 924 927 930 933 936 939 942 945 948 951 954 957 960 963 966 969 972 975 978 981 984 987 990 993 996 999 1002 1005 1008 1011 1014 1017 1020 1023 1026 1029 1032 1035 1038 1041 1044 1047 1050 1053 1056 1059 1062 1065 1068 1071 1074 1077 1080 1083 1086 1089 1092 1095 1098 1101 1104 1107 1110 1113 1116 1119 1122 1125 1128 1131 1134 1137 1140 1143 1146 1149 1152 1155 1158 1161 1164 1167 1170 1173 1176 1179 1182 1185 1188 1191 1194 1197 1200 1203 1206 1209 1212 1215 1218 1221 1224 1227 1230 1233 1236 1239 1242 1245 1248 1251 1254 1257 1260 1263 1266 1269 1272 1275 1278 1281 1284 1287 1290 1293 1296 1299 1302 1305 1308 1311 1314 1317 1320 1323 1326 1329 1332 1335 1338 1341 1344 1347 1350 1353 1356 1359 1362 1365 1368 1371 1374 1377 1380 1383 1386 1389 1392 1395 1398 1401 1404 1407 1410 1413 1416 1419 1422 1425 1428 1431 1434 1437 1440 1443 1446 1449 1452 1455 1458 1461 1464 1467 1470 1473 1476 1479 1482 1485 1488 1491 1494 1497 1500 1503 1506 1509 1512 1515 1518 1521 1524 1527 1530 1533 1536 1539 1542 1545 1548 1551 1554 1557 1560 1563 1566 1569 1572 1575 1578 1581 1584 1587 1590 1593 1596 1599 1602 1605 1608 1611 1614 1617 1620 1623 1626 1629 1632 1635 1638 1641 1644 1647 1650 1653 1656 1659 1662 1665 1668 1671 1674 1677 1680 1683 1686 1689 1692 1695 1698 1701 1704 1707 1710 1713 1716 1719 1722 1725 1728 1731 1734 1737 1740 1743 1746 1749 1752 1755 1758 1761 1764 + + + + + diff --git a/bioptim/examples/stochastic_optimal_control/models/mesh/arm_r_ulna.vtp b/bioptim/examples/stochastic_optimal_control/models/mesh/arm_r_ulna.vtp new file mode 100644 index 000000000..7e709c8a3 --- /dev/null +++ b/bioptim/examples/stochastic_optimal_control/models/mesh/arm_r_ulna.vtp @@ -0,0 +1,842 @@ + + + + + + + 0.458916 0.735698 0.498140 + 0.646546 0.477163 0.595226 + 0.460386 0.574867 0.676441 + 0.647775 0.741283 0.175749 + 0.203947 0.631014 0.748483 + 0.514927 0.688032 0.511333 + 0.364044 0.920999 -0.138679 + -0.025867 0.997673 0.063086 + 0.800612 0.511790 -0.311595 + 0.798472 0.519953 0.303466 + 0.565094 0.817515 0.111074 + 0.833920 0.539215 -0.117368 + 0.509369 0.810645 -0.288787 + -0.197389 0.884489 -0.422749 + 0.720562 0.402587 -0.564548 + 0.527583 0.678220 -0.511541 + 0.247272 0.838187 -0.486105 + 0.057536 0.892322 -0.447718 + 0.846210 0.183183 -0.500373 + 0.661344 0.222359 -0.716366 + 0.483602 0.612276 -0.625498 + 0.401217 0.833109 -0.380728 + 0.188123 0.947836 -0.257328 + 0.541760 0.410975 -0.733209 + 0.377002 0.589443 0.714441 + -0.464898 0.667100 0.582106 + -0.242290 0.357706 0.901855 + 0.271312 0.106558 0.956575 + 0.642522 0.665532 0.379778 + 0.405220 0.616322 0.675237 + 0.353350 0.075415 0.932447 + 0.313341 0.147039 0.938188 + 0.530831 0.093905 0.842259 + 0.670951 0.394668 0.627743 + 0.806719 -0.322855 0.494943 + 0.917138 -0.075545 0.391346 + 0.961401 0.180013 0.208096 + 0.851940 0.476482 0.217169 + 0.767232 0.415748 0.488374 + 0.780836 -0.520314 0.345786 + 0.928668 -0.329299 0.170698 + 0.994630 -0.092270 0.046867 + 0.954951 0.273169 0.115966 + 0.919093 0.392267 -0.037344 + 0.778091 -0.619859 0.101735 + 0.886171 -0.461502 0.041430 + 0.982123 -0.179748 -0.055897 + 0.973560 0.177710 -0.143529 + 0.863294 0.076122 -0.498927 + 0.779048 -0.576295 -0.246916 + 0.865154 -0.444654 -0.231931 + 0.935912 -0.204794 -0.286581 + 0.879330 0.077646 -0.469841 + 0.576361 0.329417 -0.747859 + 0.859629 -0.408269 -0.307172 + 0.898215 -0.315491 -0.306064 + 0.837514 -0.234139 -0.493710 + 0.734732 -0.049436 -0.676554 + 0.044714 0.146605 -0.988184 + 0.592165 -0.372860 -0.714364 + 0.576335 -0.465357 -0.671774 + 0.590269 -0.453279 -0.667923 + 0.426949 -0.292715 -0.855589 + 0.290660 0.174925 -0.940701 + -0.429133 -0.048695 -0.901928 + -0.338600 -0.382424 -0.859711 + -0.442547 0.583604 -0.680851 + -0.684963 -0.003338 -0.728571 + -0.210798 0.904705 -0.370234 + -0.727449 0.237478 -0.643756 + -0.854147 0.520029 0.001852 + -0.206459 0.975506 0.075919 + -0.717547 0.598950 0.355507 + -0.332570 0.912458 0.238365 + -0.753402 0.418838 0.506912 + -0.278877 0.958925 -0.051874 + -0.989158 -0.103600 0.104088 + -0.820941 -0.298814 -0.486586 + -0.881009 0.041940 0.471236 + -0.751121 -0.405552 -0.520907 + -0.966419 -0.150011 -0.208641 + -0.944190 0.109647 0.310617 + -0.619636 0.234280 0.749109 + 0.146585 0.209130 0.966839 + 0.022774 0.155261 0.987611 + 0.011069 0.146231 0.989189 + -0.085363 0.205250 0.974980 + 0.274922 0.179486 0.944565 + 0.097497 0.412279 0.905826 + -0.845890 0.031235 0.532442 + -0.963413 -0.012721 0.267718 + -0.898746 0.066687 0.433368 + -0.996671 -0.063986 -0.050516 + 0.632346 -0.311680 -0.709221 + -0.561984 -0.302741 -0.769755 + -0.058347 0.645923 -0.761170 + -0.135879 -0.579322 -0.803693 + 0.392662 -0.705936 -0.589466 + 0.149945 -0.460509 -0.874899 + 0.220452 -0.422956 -0.878925 + -0.545099 -0.412621 -0.729802 + -0.550406 -0.394611 -0.735755 + -0.539912 -0.328555 -0.774950 + -0.613572 -0.310857 -0.725877 + 0.997006 -0.031041 0.070821 + 0.983810 -0.129388 0.124000 + 0.986125 -0.157970 0.051024 + 0.869833 -0.421598 0.256216 + 0.646443 -0.199927 0.736302 + 0.383170 0.205538 0.900519 + 0.606596 0.161212 0.778493 + 0.771385 -0.107864 0.627161 + 0.777407 -0.321356 0.540711 + 0.448972 0.374801 0.811141 + 0.814467 -0.556501 -0.164165 + 0.890631 -0.331612 -0.311144 + 0.576254 -0.775546 -0.257800 + 0.746491 -0.664086 -0.041728 + 0.814488 -0.568903 -0.113836 + 0.589365 -0.166003 -0.790627 + -0.767295 -0.188417 -0.612990 + -0.921793 -0.003920 0.387663 + -0.093538 0.160692 0.982562 + 0.650107 0.175633 0.739266 + 0.958246 -0.031070 -0.284254 + 0.634952 -0.746424 -0.199219 + 0.785681 -0.594690 -0.170438 + 0.662138 0.013292 -0.749264 + 0.916049 0.171680 -0.362465 + 0.804537 -0.539504 0.221076 + 0.854898 0.302530 0.421455 + 0.521645 -0.608983 0.597517 + 0.136396 0.083216 0.987153 + -0.212886 -0.713225 0.667825 + -0.033313 -0.810462 0.584843 + -0.313009 -0.182993 0.931954 + 0.237240 -0.717438 0.654980 + -0.375258 -0.148293 0.914981 + 0.478724 -0.542180 0.681190 + -0.203983 -0.804742 0.557478 + -0.976079 -0.141753 0.164852 + -0.251498 -0.669839 -0.698616 + -0.575388 -0.274393 -0.770479 + 0.077574 -0.722662 -0.686834 + -0.194234 -0.474098 -0.858781 + 0.102078 -0.874691 -0.473811 + -0.052963 -0.833727 -0.549632 + -0.038806 -0.413585 -0.909638 + 0.006202 -0.865646 -0.500618 + 0.304455 -0.952468 -0.010537 + 0.665127 -0.015867 -0.746561 + 0.582109 0.140767 -0.800833 + 0.821074 0.084950 -0.564465 + 0.816662 0.319662 -0.480500 + 0.862232 0.354156 0.362117 + 0.711975 0.600983 0.363195 + -0.063910 0.323128 0.944195 + 0.024750 0.534066 0.845081 + -0.540232 0.218870 0.812555 + -0.749416 0.124155 0.650355 + -0.833209 0.191805 0.518627 + -0.975187 -0.048451 -0.216015 + -0.876297 -0.075169 -0.475870 + -0.458836 -0.190342 -0.867893 + -0.256342 -0.210716 -0.943339 + 0.299986 -0.167009 -0.939210 + 0.062336 -0.098192 -0.993213 + 0.730915 -0.059856 -0.679839 + 0.685598 -0.111862 -0.719334 + 0.874037 0.014438 -0.485644 + 0.959529 0.039190 -0.278868 + 0.920824 0.140404 0.363826 + 0.578406 0.253496 0.775362 + -0.267078 0.133984 0.954315 + -0.207165 0.204877 0.956613 + -0.910180 0.005446 0.414178 + -0.963010 -0.088844 0.254400 + -0.870179 -0.189540 -0.454822 + -0.679173 -0.195789 -0.707383 + -0.132739 -0.236906 -0.962422 + -0.148435 -0.197284 -0.969044 + 0.389940 -0.196652 -0.899597 + 0.845740 0.022864 -0.533105 + 0.834209 0.034026 -0.550397 + 0.924194 0.069290 -0.375585 + 0.868560 0.006912 -0.495535 + 0.800176 0.149408 0.580858 + 0.845522 0.140790 0.515043 + -0.315983 0.099211 0.943563 + -0.216632 0.093186 0.971796 + -0.949626 -0.072316 0.304929 + -0.867000 -0.063429 0.494256 + -0.695223 -0.190820 -0.693002 + -0.818766 -0.169711 -0.548470 + -0.422556 -0.206263 -0.882554 + -0.545691 -0.141128 -0.826017 + 0.831043 -0.029503 -0.555426 + 0.834118 -0.004550 -0.539849 + 0.856199 0.003379 -0.516635 + 0.882293 -0.000156 -0.470701 + 0.860023 0.100141 0.500332 + 0.848110 0.153135 0.507207 + -0.075076 0.082152 0.993788 + 0.036533 0.114544 0.992746 + -0.749157 -0.055872 0.660031 + -0.735792 -0.003637 0.677198 + -0.855899 -0.135533 -0.499066 + -0.841058 -0.170777 -0.513281 + -0.577933 -0.151264 -0.801943 + -0.562007 -0.187873 -0.805514 + -0.501913 -0.174646 -0.847102 + + + + + -0.009357 -0.010036 0.007856 + -0.010113 -0.010628 0.012293 + -0.005751 -0.012393 0.009177 + -0.009587 -0.008686 0.004887 + -0.001042 -0.013203 0.007970 + 0.004926 -0.013329 0.007780 + -0.005391 -0.011931 0.004384 + -0.000688 -0.012641 0.003623 + 0.006213 -0.009919 0.001606 + -0.009776 -0.007221 0.002900 + -0.006989 -0.010853 0.002674 + -0.009685 -0.006639 0.000925 + -0.006101 -0.011527 0.000355 + 0.003168 -0.012140 -0.000014 + -0.010966 -0.007764 -0.002189 + -0.007740 -0.011973 -0.002722 + -0.003865 -0.014444 -0.003771 + 0.000227 -0.015392 -0.004438 + 0.003736 -0.017105 -0.007017 + -0.013733 -0.009489 -0.005649 + -0.011323 -0.012143 -0.005843 + -0.006664 -0.015670 -0.007238 + -0.004121 -0.016919 -0.007897 + 0.002128 -0.017355 -0.010678 + -0.010229 0.011257 0.008116 + -0.016565 0.009458 0.008913 + -0.022600 0.000150 0.008779 + -0.019672 -0.005675 0.008804 + -0.014884 -0.011751 0.011155 + -0.011490 -0.014190 0.014937 + -0.015357 0.008150 0.010269 + -0.016029 0.003307 0.011050 + -0.014180 -0.002495 0.010496 + -0.011123 -0.006937 0.008266 + -0.011660 0.005528 0.006181 + -0.012463 -0.000144 0.005497 + -0.011781 -0.004516 0.005016 + -0.010900 -0.007066 0.004913 + -0.007100 0.011211 0.004532 + -0.009296 0.007642 0.002884 + -0.011011 0.004319 0.002439 + -0.012036 0.000749 0.002667 + -0.012136 -0.002561 0.002978 + -0.005171 0.010977 0.000103 + -0.008128 0.007480 0.000066 + -0.010493 0.004523 0.000154 + -0.011811 0.000631 0.000208 + -0.011983 -0.002286 0.000202 + -0.006964 0.010672 -0.006821 + -0.008967 0.007762 -0.004901 + -0.011210 0.004318 -0.004404 + -0.012698 0.000330 -0.003141 + -0.013222 -0.004130 -0.004468 + -0.011417 0.010028 -0.011276 + -0.013548 0.004899 -0.009863 + -0.014871 0.000421 -0.008549 + -0.014754 -0.002771 -0.008016 + -0.015063 -0.006286 -0.007030 + -0.015004 0.005051 -0.014066 + -0.015594 0.001018 -0.013028 + -0.015723 -0.003174 -0.011095 + -0.017002 -0.005548 -0.010122 + -0.017284 -0.008048 -0.008299 + -0.016543 -0.010502 -0.008000 + -0.021637 0.001640 -0.012487 + -0.024802 -0.006831 -0.008613 + -0.017269 0.009055 -0.010983 + -0.025204 -0.000674 -0.010929 + -0.016279 0.011983 -0.006461 + -0.026911 0.002944 -0.009452 + -0.028321 0.006336 -0.003634 + -0.016319 0.012146 -0.001409 + -0.026861 0.006069 -0.000548 + -0.017285 0.011343 0.003255 + -0.025526 0.004302 0.003453 + -0.013178 0.010488 0.009742 + -0.027263 -0.023614 0.007713 + -0.026834 -0.017932 0.003210 + -0.027201 -0.016895 0.007715 + -0.026110 -0.010656 -0.003416 + -0.027814 -0.009128 -0.000839 + -0.027652 -0.007253 0.003922 + -0.025039 -0.008617 0.009391 + -0.015260 -0.047309 0.022131 + -0.015520 -0.039126 0.020773 + -0.013654 -0.034003 0.020165 + -0.011510 -0.026966 0.018995 + -0.011080 -0.019733 0.018229 + -0.011262 -0.016953 0.017075 + -0.024556 -0.047852 0.018535 + -0.025608 -0.042737 0.016368 + -0.026040 -0.038879 0.014619 + -0.027055 -0.032266 0.011806 + -0.009276 -0.049715 0.007928 + -0.019383 -0.050637 0.010018 + -0.008958 -0.015086 -0.012608 + -0.008341 -0.022540 -0.010901 + -0.007115 -0.026690 -0.004722 + -0.008486 -0.035129 0.000490 + -0.009268 -0.042353 0.003672 + -0.018624 -0.018964 -0.001087 + -0.019743 -0.029313 0.002405 + -0.019500 -0.035780 0.004815 + -0.020181 -0.042502 0.007588 + -0.007815 -0.049835 0.014590 + -0.006137 -0.040569 0.009859 + -0.004792 -0.032287 0.008138 + -0.003458 -0.025770 0.009526 + -0.000484 -0.021743 0.011659 + -0.003872 -0.023347 0.012984 + -0.007166 -0.022235 0.014586 + -0.009094 -0.036189 0.014504 + 0.002050 -0.017995 0.009994 + -0.005836 -0.017989 0.010815 + -0.003149 -0.023945 0.001898 + -0.006957 -0.038475 0.005361 + -0.002206 -0.022298 -0.007160 + -0.000570 -0.020324 -0.002135 + 0.001171 -0.019370 0.000979 + -0.011116 -0.071821 0.012425 + -0.020548 -0.071261 0.017357 + -0.022394 -0.072183 0.024932 + -0.014015 -0.070733 0.025700 + -0.007666 -0.069125 0.025577 + -0.009599 -0.070744 0.018446 + 0.009410 -0.243676 0.043255 + 0.012917 -0.241602 0.046665 + 0.008288 -0.240273 0.040753 + 0.012822 -0.236019 0.044892 + 0.012263 -0.240984 0.051220 + 0.014063 -0.233464 0.050313 + 0.009751 -0.241508 0.054184 + 0.010178 -0.235557 0.055045 + 0.006772 -0.242521 0.053265 + 0.004299 -0.243309 0.050507 + 0.004889 -0.237586 0.056111 + 0.000318 -0.244179 0.049408 + 0.001133 -0.239277 0.052473 + -0.000803 -0.245551 0.049697 + -0.002469 -0.247579 0.048385 + -0.006015 -0.241890 0.048676 + -0.004183 -0.246115 0.046044 + -0.001943 -0.241983 0.044509 + -0.001392 -0.244938 0.045709 + 0.000672 -0.241648 0.041950 + -0.000119 -0.243866 0.044798 + 0.003665 -0.243547 0.042997 + 0.008537 -0.240654 0.040981 + 0.009194 -0.243787 0.043481 + 0.002500 -0.244073 0.046853 + 0.003124 -0.225482 0.039989 + 0.005034 -0.232866 0.040708 + 0.007103 -0.223076 0.043483 + 0.010181 -0.230479 0.044736 + 0.006682 -0.221256 0.046859 + 0.010114 -0.229923 0.049335 + 0.001049 -0.222100 0.048268 + 0.004541 -0.229540 0.052339 + -0.000156 -0.232577 0.050018 + -0.003584 -0.224031 0.045977 + -0.004004 -0.233448 0.048293 + -0.003667 -0.224985 0.042367 + -0.004510 -0.234841 0.043795 + -0.000837 -0.225949 0.038975 + -0.001106 -0.234266 0.040381 + 0.002966 -0.225788 0.040306 + 0.004538 -0.232793 0.041066 + 0.000011 -0.187811 0.031452 + 0.002274 -0.213747 0.037198 + 0.003142 -0.187567 0.034797 + 0.005377 -0.212413 0.039724 + 0.003580 -0.187165 0.040381 + 0.005309 -0.211865 0.043653 + -0.004026 -0.188058 0.040096 + -0.000642 -0.211918 0.045857 + -0.004708 -0.212914 0.043240 + -0.008312 -0.189183 0.036362 + -0.003940 -0.213930 0.038421 + -0.006101 -0.188188 0.032633 + -0.001637 -0.214316 0.035827 + -0.000030 -0.187224 0.030550 + 0.002217 -0.213549 0.037330 + -0.007424 -0.139403 0.022247 + -0.003629 -0.162055 0.026292 + -0.000825 -0.162913 0.031307 + -0.003030 -0.139136 0.028764 + 0.001183 -0.162503 0.037559 + -0.000529 -0.138117 0.033173 + -0.006564 -0.164007 0.037147 + -0.008696 -0.139344 0.033072 + -0.012079 -0.164801 0.034128 + -0.013992 -0.140012 0.030945 + -0.009909 -0.163225 0.029049 + -0.013352 -0.139035 0.025877 + -0.003444 -0.162145 0.026204 + -0.007482 -0.139207 0.022155 + -0.010793 -0.099704 0.016770 + -0.008780 -0.119076 0.019882 + -0.005038 -0.118462 0.025591 + -0.006602 -0.099055 0.022925 + -0.001902 -0.117483 0.031475 + -0.003527 -0.097181 0.028574 + -0.008729 -0.118618 0.031817 + -0.011010 -0.097853 0.029224 + -0.016497 -0.119127 0.031035 + -0.019080 -0.098461 0.030054 + -0.016151 -0.119174 0.025712 + -0.018081 -0.099691 0.023002 + -0.008848 -0.119372 0.020601 + -0.010327 -0.099969 0.017220 + -0.011079 -0.071726 0.011842 + + + + + 1 2 0 + 4 3 0 + 2 4 0 + 4 5 3 + 5 6 3 + 5 7 6 + 5 8 7 + 10 9 3 + 6 10 3 + 7 10 6 + 10 11 9 + 10 12 11 + 10 10 12 + 7 10 10 + 7 13 10 + 8 13 7 + 15 14 11 + 12 15 11 + 16 15 12 + 10 16 12 + 17 16 10 + 13 17 10 + 18 17 13 + 8 18 13 + 20 19 14 + 15 20 14 + 21 20 15 + 16 21 15 + 22 21 16 + 17 22 16 + 23 22 17 + 18 23 17 + 25 30 24 + 31 30 25 + 26 31 25 + 32 31 26 + 27 32 26 + 33 32 27 + 28 33 27 + 0 33 28 + 29 0 28 + 30 34 24 + 35 34 30 + 31 35 30 + 36 35 31 + 32 36 31 + 37 36 32 + 33 37 32 + 3 37 33 + 0 3 33 + 39 38 24 + 34 39 24 + 40 39 34 + 35 40 34 + 41 40 35 + 36 41 35 + 42 41 36 + 37 42 36 + 9 42 37 + 3 9 37 + 44 43 38 + 39 44 38 + 45 44 39 + 40 45 39 + 46 45 40 + 41 46 40 + 47 46 41 + 42 47 41 + 11 47 42 + 9 11 42 + 49 48 43 + 44 49 43 + 50 49 44 + 45 50 44 + 51 50 45 + 46 51 45 + 52 51 46 + 47 52 46 + 14 52 47 + 11 14 47 + 54 53 48 + 49 54 48 + 55 54 49 + 50 55 49 + 56 55 50 + 51 56 50 + 57 56 51 + 52 57 51 + 19 57 52 + 14 19 52 + 59 58 53 + 54 59 53 + 60 59 54 + 55 60 54 + 61 60 55 + 56 61 55 + 62 61 56 + 57 62 56 + 63 62 57 + 19 63 57 + 59 64 58 + 60 64 59 + 65 64 60 + 61 65 60 + 62 65 61 + 63 65 62 + 66 64 65 + 67 66 65 + 68 66 67 + 69 68 67 + 70 68 69 + 71 68 70 + 72 71 70 + 73 71 72 + 74 73 72 + 25 73 74 + 26 25 74 + 66 58 64 + 66 53 58 + 68 53 66 + 68 48 53 + 68 43 48 + 71 43 68 + 71 38 43 + 73 38 71 + 73 24 38 + 25 24 73 + 25 75 24 + 78 77 76 + 77 80 79 + 78 80 77 + 78 81 80 + 78 82 81 + 79 67 65 + 80 67 79 + 80 69 67 + 80 70 69 + 81 70 80 + 81 72 70 + 81 74 72 + 82 74 81 + 82 26 74 + 84 89 83 + 84 90 89 + 85 90 84 + 85 91 90 + 86 91 85 + 86 92 91 + 86 76 92 + 87 76 86 + 87 78 76 + 88 78 87 + 88 82 78 + 29 82 88 + 29 26 82 + 28 26 29 + 28 27 26 + 100 63 95 + 96 100 95 + 101 100 96 + 97 101 96 + 102 101 97 + 98 102 97 + 103 102 98 + 99 103 98 + 94 103 99 + 93 94 99 + 100 65 63 + 100 79 65 + 100 77 79 + 101 77 100 + 101 76 77 + 102 76 101 + 102 92 76 + 103 92 102 + 103 91 92 + 103 90 91 + 94 90 103 + 94 89 90 + 83 111 104 + 105 111 104 + 106 111 105 + 107 111 106 + 108 111 107 + 109 111 108 + 110 111 109 + 87 111 110 + 86 111 87 + 85 111 86 + 84 111 85 + 83 111 84 + 104 111 83 + 4 113 5 + 2 113 4 + 1 113 2 + 29 113 1 + 88 113 29 + 87 113 88 + 110 113 87 + 109 113 110 + 108 113 109 + 112 113 108 + 5 113 112 + 104 115 93 + 99 115 93 + 98 115 99 + 97 115 98 + 114 115 97 + 108 115 114 + 107 115 108 + 106 115 107 + 105 115 106 + 104 115 105 + 93 115 104 + 96 116 97 + 23 116 96 + 95 23 96 + 117 114 97 + 116 117 97 + 18 117 116 + 23 18 116 + 117 118 114 + 8 118 117 + 18 8 117 + 112 108 114 + 118 112 114 + 5 112 118 + 8 5 118 + 94 93 119 + 120 94 119 + 89 94 120 + 121 89 120 + 122 89 121 + 83 89 122 + 123 83 122 + 104 83 123 + 124 104 123 + 93 104 124 + 119 93 124 + 127 126 125 + 128 126 127 + 128 129 126 + 130 129 128 + 130 131 129 + 132 131 130 + 132 133 131 + 132 134 133 + 135 134 132 + 135 136 134 + 137 136 135 + 137 138 136 + 137 139 138 + 140 139 137 + 140 141 139 + 142 141 140 + 142 143 141 + 144 143 142 + 144 145 143 + 144 146 145 + 147 146 144 + 147 148 146 + 126 149 125 + 129 149 126 + 131 149 129 + 133 149 131 + 134 149 133 + 136 149 134 + 138 149 136 + 139 149 138 + 141 149 139 + 143 149 141 + 145 149 143 + 146 149 145 + 148 149 146 + 152 151 150 + 152 153 151 + 154 153 152 + 154 155 153 + 156 155 154 + 156 157 155 + 156 158 157 + 159 158 156 + 159 160 158 + 161 160 159 + 161 162 160 + 163 162 161 + 163 164 162 + 165 164 163 + 165 166 164 + 153 127 151 + 153 128 127 + 155 128 153 + 155 130 128 + 157 130 155 + 157 132 130 + 157 135 132 + 158 135 157 + 158 137 135 + 160 137 158 + 160 140 137 + 162 140 160 + 162 142 140 + 164 142 162 + 164 144 142 + 166 144 164 + 166 147 144 + 169 168 167 + 169 170 168 + 171 170 169 + 171 172 170 + 173 172 171 + 173 174 172 + 173 175 174 + 176 175 173 + 176 177 175 + 178 177 176 + 178 179 177 + 180 179 178 + 180 181 179 + 152 150 168 + 170 152 168 + 154 152 170 + 172 154 170 + 156 154 172 + 174 156 172 + 159 156 174 + 175 159 174 + 161 159 175 + 177 161 175 + 163 161 177 + 179 163 177 + 165 163 179 + 181 165 179 + 184 183 182 + 185 184 182 + 186 184 185 + 187 186 185 + 188 186 187 + 189 188 187 + 190 188 189 + 191 190 189 + 192 190 191 + 193 192 191 + 194 192 193 + 195 194 193 + 169 167 183 + 184 169 183 + 171 169 184 + 186 171 184 + 173 171 186 + 188 173 186 + 176 173 188 + 190 176 188 + 178 176 190 + 192 178 190 + 180 178 192 + 194 180 192 + 198 197 196 + 199 198 196 + 200 198 199 + 201 200 199 + 202 200 201 + 203 202 201 + 204 202 203 + 205 204 203 + 206 204 205 + 207 206 205 + 208 206 207 + 209 208 207 + 185 182 197 + 198 185 197 + 187 185 198 + 200 187 198 + 189 187 200 + 202 189 200 + 191 189 202 + 204 191 202 + 193 191 204 + 206 193 204 + 195 193 206 + 208 195 206 + 199 196 119 + 124 199 119 + 201 199 124 + 123 201 124 + 203 201 123 + 122 203 123 + 205 203 122 + 121 205 122 + 207 205 121 + 120 207 121 + 209 207 120 + 210 209 120 + 20 63 19 + 21 63 20 + 95 63 21 + 22 95 21 + 23 95 22 + + + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 159 162 165 168 171 174 177 180 183 186 189 192 195 198 201 204 207 210 213 216 219 222 225 228 231 234 237 240 243 246 249 252 255 258 261 264 267 270 273 276 279 282 285 288 291 294 297 300 303 306 309 312 315 318 321 324 327 330 333 336 339 342 345 348 351 354 357 360 363 366 369 372 375 378 381 384 387 390 393 396 399 402 405 408 411 414 417 420 423 426 429 432 435 438 441 444 447 450 453 456 459 462 465 468 471 474 477 480 483 486 489 492 495 498 501 504 507 510 513 516 519 522 525 528 531 534 537 540 543 546 549 552 555 558 561 564 567 570 573 576 579 582 585 588 591 594 597 600 603 606 609 612 615 618 621 624 627 630 633 636 639 642 645 648 651 654 657 660 663 666 669 672 675 678 681 684 687 690 693 696 699 702 705 708 711 714 717 720 723 726 729 732 735 738 741 744 747 750 753 756 759 762 765 768 771 774 777 780 783 786 789 792 795 798 801 804 807 810 813 816 819 822 825 828 831 834 837 840 843 846 849 852 855 858 861 864 867 870 873 876 879 882 885 888 891 894 897 900 903 906 909 912 915 918 921 924 927 930 933 936 939 942 945 948 951 954 957 960 963 966 969 972 975 978 981 984 987 990 993 996 999 1002 1005 1008 1011 1014 1017 1020 1023 1026 1029 1032 1035 1038 1041 1044 1047 1050 1053 1056 1059 1062 1065 1068 1071 1074 1077 1080 1083 1086 1089 1092 1095 1098 1101 1104 1107 1110 1113 1116 1119 1122 1125 1128 1131 1134 1137 1140 1143 1146 1149 1152 1155 1158 1161 1164 1167 1170 1173 1176 1179 1182 1185 1188 1191 1194 + + + + + diff --git a/bioptim/examples/stochastic_optimal_control/models/mesh/ground_ribs.vtp b/bioptim/examples/stochastic_optimal_control/models/mesh/ground_ribs.vtp new file mode 100644 index 000000000..11978f0ba --- /dev/null +++ b/bioptim/examples/stochastic_optimal_control/models/mesh/ground_ribs.vtp @@ -0,0 +1,10998 @@ + + + + + + + 0.987667 0.151235 0.040521 + 0.622831 -0.649576 0.436041 + 0.332908 -0.530908 -0.779301 + 0.671050 0.674583 0.307621 + 0.663092 0.041999 0.747359 + 0.747551 0.553415 -0.367286 + 0.324162 -0.592725 0.737289 + -0.529533 -0.106446 -0.841584 + -0.042132 0.433245 -0.900291 + -0.472540 -0.878703 0.067730 + -0.023847 0.888271 -0.458699 + -0.253177 0.462313 -0.849805 + 0.420884 0.892963 -0.159604 + 0.505627 0.020400 0.862511 + 0.325694 -0.412785 0.850607 + -0.730314 0.021576 -0.682770 + -0.491299 -0.865503 0.097617 + -0.565498 -0.049177 -0.823282 + -0.384494 -0.229709 -0.894091 + -0.171152 0.278089 -0.945184 + 0.464193 0.884751 0.041720 + 0.377451 0.120927 0.918100 + 0.171422 -0.337909 0.925436 + -0.407110 -0.907443 0.103965 + -0.416820 -0.905734 0.076853 + -0.293742 -0.261769 -0.919343 + -0.010211 0.344296 -0.938806 + 0.438005 0.896299 0.069280 + 0.258131 0.204251 0.944272 + 0.014357 -0.299107 0.954112 + 0.085759 0.134724 0.987165 + 0.027757 0.637185 -0.770211 + -0.183346 -0.339125 -0.922702 + 0.153817 0.369461 -0.916427 + 0.432240 0.890052 0.144831 + 0.101669 0.163110 0.981355 + 0.016117 0.243988 0.969644 + 0.035240 0.367198 0.929475 + -0.244618 -0.705948 -0.664680 + -0.028630 -0.340481 -0.939815 + 0.283859 0.382002 -0.879487 + 0.408293 0.898720 0.159997 + 0.409138 0.907497 0.095166 + -0.124622 0.293703 0.947738 + -0.426968 -0.449043 0.784894 + -0.262777 -0.885783 -0.382541 + 0.118150 -0.353628 -0.927894 + 0.399467 0.403737 -0.823057 + 0.545065 0.465090 -0.697564 + 0.100586 0.852403 0.513119 + -0.351115 0.271748 0.896031 + -0.538037 -0.557813 0.631950 + -0.187950 -0.937796 -0.291914 + 0.349097 -0.221212 -0.910602 + 0.542151 -0.195486 -0.817225 + 0.637027 0.593448 -0.491951 + -0.468912 0.408659 0.783020 + -0.468767 0.383414 0.795771 + -0.602983 -0.590500 0.536396 + -0.021332 -0.892683 -0.450179 + -0.215864 -0.954180 -0.207227 + 0.721444 -0.184036 -0.667570 + 0.393115 0.824110 0.407803 + -0.347266 0.707912 0.615034 + -0.609379 0.384594 0.693358 + -0.781319 -0.107703 0.614768 + -0.950017 -0.188427 0.248923 + 0.039384 -0.851612 -0.522691 + 0.870793 -0.227039 -0.436088 + 0.914201 0.403160 -0.041203 + 0.202744 0.894434 0.398601 + -0.802182 0.343867 0.488118 + -0.799100 0.539850 0.264577 + -0.957301 -0.241183 -0.159389 + -0.007112 -0.894969 -0.446071 + 0.870306 -0.446419 -0.208034 + 0.996224 0.082677 0.026484 + 0.428873 0.798387 0.422666 + 0.406003 0.839072 0.362105 + -0.836422 0.547065 -0.033442 + -0.934665 -0.201938 -0.292613 + -0.142851 -0.926600 -0.347858 + 0.883449 -0.456113 0.107141 + 0.980312 0.001357 0.197449 + 0.852605 0.110456 0.510749 + 0.077876 0.973275 0.216034 + -0.826980 0.416052 -0.378159 + -0.833520 -0.168964 -0.526018 + 0.048778 -0.997475 -0.051623 + 0.874015 -0.077470 0.479683 + 0.974299 -0.215411 0.065869 + 0.847941 0.369942 -0.379656 + -0.327053 0.563661 -0.758500 + -0.406062 0.303087 -0.862120 + -0.245445 -0.222074 -0.943631 + 0.632625 -0.770262 -0.080512 + 0.974287 0.215284 0.066466 + 0.473575 -0.624408 0.621161 + 0.423190 -0.751034 -0.506812 + 0.599163 0.148798 0.786678 + 0.532008 0.586028 -0.611178 + 0.509219 0.860473 -0.016798 + 0.307097 -0.477246 0.823364 + -0.364637 0.110765 -0.924538 + -0.514515 -0.847397 0.131123 + 0.533141 0.315609 0.784953 + 0.430381 0.862120 -0.267435 + -0.237446 0.647681 -0.723967 + -0.107313 0.674887 -0.730076 + -0.049596 0.537739 -0.841651 + 0.269229 -0.334040 0.903290 + -0.578223 0.143752 -0.803115 + -0.555613 -0.828614 0.068502 + 0.400876 0.387420 0.830183 + 0.399709 0.855063 -0.330301 + -0.054499 0.276669 -0.959419 + -0.427710 0.033664 -0.903289 + -0.248859 -0.026789 -0.968169 + 0.084026 -0.307445 0.947849 + -0.503748 -0.859896 -0.082558 + 0.311591 0.494682 0.811296 + 0.413535 0.804717 -0.425934 + 0.059991 0.241721 -0.968490 + -0.105352 -0.092648 -0.990110 + -0.395018 -0.841298 -0.369023 + -0.086021 -0.367974 0.925849 + 0.126425 0.379974 0.916317 + 0.440470 0.625674 -0.643831 + 0.040031 -0.045773 -0.998150 + 0.005571 -0.108014 -0.994134 + -0.334544 -0.776563 -0.533882 + -0.264722 -0.542255 0.797422 + 0.013873 0.305413 0.952119 + 0.449698 0.806176 -0.384516 + 0.128117 -0.050216 -0.990487 + 0.051616 -0.173472 -0.983485 + -0.389415 -0.904506 -0.173852 + -0.293677 -0.436352 0.850500 + -0.079680 0.315824 0.945466 + 0.397480 0.908771 0.127059 + 0.242501 -0.021723 -0.969908 + 0.124394 -0.265075 -0.956170 + -0.513523 -0.824069 0.239175 + -0.195044 0.020026 0.980590 + -0.305054 0.215746 0.927575 + 0.176756 0.917163 0.357169 + 0.468429 0.296124 -0.832397 + 0.269893 -0.420285 -0.866325 + -0.400817 -0.805585 0.436323 + -0.201296 0.323551 0.924551 + -0.394891 0.395169 0.829399 + 0.080005 0.945393 0.315960 + 0.587573 0.456849 -0.667867 + 0.475059 -0.309714 -0.823648 + -0.392975 -0.906704 0.153162 + -0.444856 0.203124 0.872264 + -0.610434 0.311973 0.728041 + -0.064356 0.915125 0.398002 + 0.703856 0.521919 -0.481859 + 0.680397 -0.227413 -0.696666 + -0.151520 -0.974352 -0.166376 + -0.670943 -0.061228 0.738977 + -0.850183 0.168967 0.498637 + -0.471909 0.740580 0.478375 + 0.659852 0.750783 -0.030319 + 0.893105 -0.078646 -0.442920 + 0.069752 -0.923116 -0.378142 + -0.847747 -0.338314 0.408497 + -0.979538 0.123499 0.158911 + -0.497420 0.804996 0.323348 + 0.624899 0.746598 0.228239 + 0.969204 -0.188589 -0.158360 + 0.299304 -0.851230 -0.431074 + -0.843085 -0.532322 -0.076422 + -0.994589 0.082290 -0.063416 + -0.224815 0.935784 0.271600 + 0.706141 0.637314 0.308538 + 0.924396 -0.379859 0.034623 + 0.364845 -0.879770 -0.304782 + -0.532585 -0.771172 -0.348778 + -0.813446 -0.392914 -0.428864 + -0.459240 0.858921 -0.226613 + 0.719513 0.537421 0.439863 + 0.862136 -0.322452 0.390828 + 0.065334 -0.980284 -0.186479 + -0.178182 -0.906810 -0.382030 + -0.659251 0.297029 -0.690769 + -0.588000 -0.231971 -0.774884 + -0.368271 -0.826146 -0.426451 + 0.650281 0.759684 -0.003701 + 0.012120 0.609585 -0.792628 + 0.923921 0.029406 0.381453 + 0.065978 -0.848073 -0.525756 + -0.535704 0.008493 -0.844363 + -0.850333 -0.150034 -0.504405 + -0.557909 0.330854 -0.761100 + 0.144321 0.533855 -0.833169 + -0.263208 -0.837121 -0.479531 + 0.233117 -0.820959 -0.521231 + -0.506707 -0.741915 -0.439101 + -0.987906 0.102497 -0.116347 + -0.298515 0.954283 -0.015277 + 0.858404 0.227479 0.459778 + 0.580395 -0.768785 -0.268537 + 0.384099 -0.920577 -0.070747 + 0.792447 -0.387015 0.471431 + 0.507832 -0.715757 -0.479374 + -0.749832 -0.531246 -0.394372 + -0.990781 0.135460 0.001878 + -0.058248 0.894578 0.443100 + 0.683814 0.453953 0.571249 + 0.995190 -0.094100 0.027255 + 0.954312 -0.263043 0.141763 + 0.804643 0.403781 0.435328 + 0.973912 0.067028 -0.216800 + 0.309766 -0.679697 -0.664873 + -0.821664 -0.541289 -0.178534 + -0.821905 0.337374 0.458966 + 0.101039 0.867201 0.487599 + 0.890748 0.447213 0.081044 + 0.866109 0.404624 0.293486 + 0.772862 0.568968 -0.280996 + 0.855463 0.168005 -0.489855 + 0.304563 -0.703884 -0.641707 + -0.715590 -0.684840 0.137571 + -0.690926 0.146855 0.707853 + 0.719381 0.651044 0.242140 + 0.683355 0.723944 -0.094505 + 0.579198 0.763941 -0.284471 + 0.731500 0.247852 -0.635199 + 0.719416 0.204658 -0.663744 + 0.248220 -0.722620 -0.645141 + -0.653242 -0.668648 0.355226 + -0.402595 0.580222 0.707997 + -0.236669 0.675873 0.697985 + 0.578416 0.674841 -0.458285 + 0.585972 0.235152 -0.775462 + 0.572679 0.197521 -0.795628 + 0.061975 -0.786137 -0.614937 + -0.615450 -0.571840 0.542421 + -0.543220 -0.553391 0.631403 + -0.087937 0.597353 0.797143 + 0.533372 0.684342 -0.497182 + 0.470604 0.252981 -0.845301 + 0.447020 0.121201 -0.886275 + -0.129777 -0.818157 -0.560157 + -0.205987 -0.820979 -0.532505 + -0.497309 -0.572524 0.651844 + 0.066389 0.630020 0.773736 + 0.505082 0.659616 -0.556595 + 0.408463 0.280660 -0.868555 + 0.351714 0.117455 -0.928710 + 0.269030 0.102038 -0.957711 + -0.185248 -0.684640 -0.704948 + -0.460927 -0.679934 0.570294 + 0.167564 0.639727 0.750114 + 0.481338 0.702373 -0.524391 + 0.313796 0.204335 -0.927243 + 0.200720 0.209236 -0.957043 + 0.174425 0.237536 -0.955590 + -0.253795 -0.619110 -0.743163 + -0.360007 -0.621611 0.695697 + 0.196237 0.473012 0.858924 + 0.495601 0.739114 -0.456169 + 0.514035 0.855630 -0.060541 + 0.170051 0.406954 -0.897480 + 0.081356 0.294187 -0.952279 + -0.393604 -0.627780 -0.671541 + -0.330394 -0.664422 0.670360 + 0.116902 0.150039 0.981745 + 0.211112 0.047325 0.976316 + 0.541370 0.840529 -0.020726 + 0.124819 0.471414 -0.873035 + -0.018610 0.366126 -0.930379 + -0.508345 -0.560043 -0.654169 + -0.324773 -0.723920 0.608656 + -0.259874 -0.783166 0.564903 + 0.257124 -0.102069 0.960973 + 0.574643 0.803302 0.156497 + 0.078324 0.629639 -0.772930 + -0.148592 0.431406 -0.889837 + -0.566839 -0.582315 -0.582755 + 0.405816 -0.792785 -0.454759 + 0.023468 -0.776745 0.629378 + 0.523719 -0.369385 0.767641 + 0.616776 0.637069 -0.462310 + 0.309954 0.665435 -0.679061 + 0.051586 0.285415 -0.957015 + 0.304701 -0.950728 -0.057206 + 0.323583 -0.472143 -0.819985 + 0.689321 0.556577 -0.463744 + 0.135632 0.013446 0.990668 + -0.216694 -0.930707 0.294667 + 0.481448 0.116989 0.868632 + 0.236016 0.246689 -0.939915 + 0.385054 0.502068 -0.774378 + -0.221726 -0.417741 -0.881096 + 0.190383 0.872415 -0.450163 + 0.327869 0.895952 0.299619 + 0.429993 0.900403 -0.066181 + 0.124996 0.029162 0.991729 + -0.293573 -0.828729 0.476469 + 0.013134 0.503125 -0.864114 + -0.369731 -0.558424 -0.742605 + 0.060264 0.398456 -0.915206 + 0.218843 0.632538 -0.742970 + 0.265062 0.471187 -0.841264 + 0.468402 0.875508 -0.118680 + 0.090689 0.163562 0.982356 + -0.375476 -0.718813 0.585086 + -0.328015 -0.618913 -0.713689 + 0.180617 0.329703 -0.926646 + 0.270767 0.300054 -0.914687 + 0.282677 0.376760 -0.882126 + 0.497933 0.808560 -0.313516 + -0.003489 0.184220 0.982879 + -0.415753 -0.663569 0.621953 + -0.266294 -0.697094 -0.665693 + -0.211365 -0.682334 -0.699818 + 0.364741 0.349271 -0.863118 + 0.304979 0.230264 -0.924103 + 0.548573 0.780106 -0.300835 + -0.108257 0.161471 0.980922 + -0.468818 -0.628185 0.620962 + -0.508898 -0.618401 0.598835 + -0.108163 -0.696213 -0.709639 + 0.452418 0.317586 -0.833341 + 0.403055 0.218452 -0.888721 + 0.536262 0.829977 -0.153500 + -0.157930 0.247385 0.955960 + -0.223692 0.346959 0.910814 + -0.577162 -0.589917 0.564696 + -0.083602 -0.741389 -0.665848 + 0.559231 0.296563 -0.774152 + 0.555447 0.317364 -0.768609 + 0.504391 0.863404 -0.011109 + 0.510232 0.859183 0.038308 + -0.322913 0.439018 0.838445 + -0.683840 -0.538323 0.492516 + -0.017068 -0.775515 -0.631099 + 0.673011 0.225451 -0.704434 + 0.691103 0.415513 -0.591376 + 0.780702 0.406449 -0.474662 + 0.444002 0.884224 0.144952 + -0.406716 0.472804 0.781689 + -0.736903 -0.547862 0.396006 + 0.139067 -0.790556 -0.596391 + 0.779834 0.228282 -0.582877 + 0.918229 0.242586 -0.313063 + 0.839245 0.522370 -0.150991 + 0.645046 0.753804 0.125283 + -0.776510 0.036175 0.629066 + -0.811594 -0.563193 0.155337 + 0.170308 -0.723850 -0.668608 + 0.991029 0.015424 -0.132757 + 0.293135 -0.695862 -0.655628 + 0.856190 0.478025 0.196040 + 0.561720 0.720382 0.406841 + -0.813755 0.396643 0.424825 + -0.864648 -0.460459 -0.200899 + -0.051392 -0.792205 -0.608087 + 0.916183 -0.352335 -0.190966 + -0.850112 -0.406948 -0.334221 + 0.851087 0.374397 0.368074 + 0.285922 0.789362 0.543282 + -0.858649 0.459636 0.226841 + -0.848622 -0.453383 -0.272551 + -0.210815 -0.827391 -0.520559 + 0.794093 -0.607503 -0.018867 + -0.942426 0.334346 -0.006780 + 0.758215 0.390969 0.521779 + 0.079795 0.859109 0.505534 + -0.832526 -0.137262 -0.536713 + -0.324146 -0.673869 -0.663950 + 0.795096 -0.459251 0.396120 + -0.178854 0.980041 0.086776 + 0.686282 0.320982 0.652677 + -0.435265 0.132347 -0.890522 + 0.384053 -0.671476 -0.633738 + 0.846848 0.521320 0.105236 + -0.087140 0.522222 -0.848346 + 0.680762 0.732147 -0.022893 + 0.486907 -0.428190 0.761298 + 0.698038 0.710164 0.091709 + 0.569214 0.789626 -0.229100 + 0.592158 -0.485905 0.642842 + -0.328477 0.585355 -0.741258 + -0.613356 0.570973 -0.545697 + 0.355977 -0.398534 0.845252 + -0.635143 -0.764250 -0.111873 + -0.751838 -0.659081 -0.018765 + 0.681991 0.658373 0.318485 + -0.131025 0.651581 -0.747178 + 0.511243 0.784575 -0.350816 + 0.707346 -0.580485 0.403360 + -0.737343 0.578082 -0.349495 + -0.694145 -0.706467 0.138086 + -0.842205 -0.175020 -0.509960 + -0.919078 -0.322631 -0.226286 + -0.979613 -0.200735 -0.007958 + 0.087070 -0.521191 0.848987 + -0.646072 -0.724489 -0.240225 + -0.619385 -0.264232 -0.739286 + -0.707396 -0.146753 -0.691415 + 0.626564 0.638037 0.447577 + -0.013204 0.705891 -0.708198 + 0.771599 -0.557763 0.305834 + 0.518404 0.744402 -0.420859 + -0.786875 0.542985 -0.293249 + -0.617751 -0.725069 0.304400 + -0.960324 -0.250992 0.121579 + -0.502497 -0.766833 0.399329 + -0.208572 -0.832152 0.513830 + -0.629777 -0.682620 -0.370689 + -0.572341 -0.359947 -0.736792 + -0.060264 0.567263 -0.821329 + 0.078190 -0.294449 0.952463 + 0.567947 0.800108 0.193038 + 0.903330 -0.408779 0.129976 + 0.606445 0.636253 -0.476872 + -0.645586 0.724268 -0.242187 + -0.957338 -0.160326 0.240415 + -0.422764 -0.768201 0.480769 + -0.564389 -0.705239 -0.429072 + -0.490920 -0.406792 -0.770401 + 0.029725 0.446010 -0.894534 + -0.547569 -0.684168 -0.481750 + -0.338806 -0.625986 0.702390 + 0.531168 0.688677 0.493543 + 0.633899 -0.769352 0.079174 + 0.293920 0.768759 -0.567998 + -0.670686 0.741713 0.006450 + -0.875829 -0.005454 0.482590 + -0.377710 -0.431477 -0.819245 + 0.138998 0.462086 -0.875874 + -0.314199 -0.454070 -0.833727 + -0.510151 -0.793388 -0.332087 + -0.089456 -0.281585 0.955357 + 0.459368 0.752850 0.471378 + -0.190917 -0.980483 0.046936 + 0.505442 0.438466 -0.743152 + -0.524104 0.818057 0.236851 + -0.801403 -0.071825 0.593796 + 0.188465 0.420606 -0.887452 + 0.343718 0.266548 -0.900450 + -0.256397 -0.464087 -0.847870 + -0.391394 -0.912428 -0.119523 + -0.134365 -0.308224 0.941777 + 0.378602 0.786739 0.487547 + -0.358744 -0.621684 0.696284 + 0.953813 0.270602 -0.130444 + 0.091388 0.928120 0.360889 + -0.367456 0.382416 0.847782 + 0.391990 -0.347865 -0.851665 + 0.944238 0.313440 0.100851 + -0.082668 -0.647913 -0.757215 + 0.328478 -0.933131 -0.146182 + 0.314727 -0.144855 0.938064 + -0.173768 -0.776918 0.605148 + 0.837719 -0.544476 0.042115 + -0.814844 -0.241452 0.527001 + -0.810469 -0.553891 0.190646 + 0.587704 -0.644037 0.489714 + -0.904495 -0.333230 0.266171 + 0.953451 -0.294098 0.066617 + 0.471791 -0.853132 -0.222661 + 0.736870 0.423666 -0.526811 + 0.656241 0.407930 -0.634777 + -0.459454 -0.386732 0.799588 + -0.971406 -0.168497 0.167270 + -0.860274 0.501441 -0.092119 + -0.069485 0.994142 -0.082788 + 0.031096 0.904700 -0.424914 + -0.512640 0.085715 0.854315 + -0.728263 0.266666 -0.631286 + -0.415900 -0.902042 0.115526 + -0.968780 0.157233 -0.191688 + 0.951803 -0.102293 0.289148 + 0.995286 -0.047794 0.084392 + -0.851831 0.471034 -0.229154 + 0.878122 0.341202 -0.335386 + 0.152340 -0.829019 0.538070 + 0.772256 0.133803 0.621062 + 0.303415 0.893733 0.330426 + 0.276326 0.821037 -0.499541 + 0.592163 0.805157 -0.032637 + 0.573947 0.817211 0.052448 + -0.458315 0.440279 -0.772076 + 0.694526 -0.221386 0.684559 + -0.683159 -0.680571 -0.264797 + 0.209675 0.860171 -0.464910 + 0.918704 0.306447 0.249145 + 0.924691 0.366685 -0.102412 + 0.757070 0.459932 0.464013 + 0.828563 0.543806 0.133261 + 0.694018 0.435959 0.572956 + 0.504633 0.862739 0.032048 + -0.370655 0.394032 -0.841043 + -0.060643 -0.862187 0.502947 + 0.794989 0.297984 0.528393 + -0.661793 -0.516587 -0.543294 + 0.661065 0.189316 0.726053 + 0.546859 0.259746 0.795913 + 0.582485 0.412567 0.700356 + 0.512311 0.832891 0.209356 + -0.266678 0.293283 -0.918078 + -0.578686 -0.559178 -0.593669 + 0.019265 -0.743810 0.668113 + -0.069835 -0.692010 0.718502 + 0.442868 0.311475 0.840745 + 0.432783 0.290148 0.853530 + 0.498297 0.802153 0.329014 + -0.183893 0.191653 -0.964081 + -0.500145 -0.655617 -0.565705 + -0.457600 -0.637458 -0.619879 + -0.159614 -0.690685 0.705320 + 0.362520 0.323982 0.873850 + 0.289218 0.196373 0.936905 + 0.478791 0.832312 0.279314 + -0.110248 0.156632 -0.981485 + -0.002787 0.199506 -0.979893 + -0.409159 -0.639855 -0.650518 + -0.230766 -0.673994 0.701769 + 0.253815 0.294725 0.921258 + 0.226682 0.262542 0.937916 + 0.460570 0.869991 0.176046 + 0.447428 0.887947 0.106574 + 0.054730 0.161040 -0.985429 + -0.352364 -0.722545 -0.594785 + -0.268513 -0.612024 0.743860 + 0.159400 0.308824 0.937667 + 0.233085 0.443890 0.865236 + 0.176797 0.579987 0.795209 + 0.398968 0.911227 -0.102417 + 0.127355 0.081623 -0.988493 + -0.288296 -0.815979 -0.501063 + -0.312884 -0.541042 0.780626 + 0.059685 0.403533 0.913016 + 0.036039 0.566579 0.823219 + 0.184122 0.810644 0.555838 + 0.332354 0.894097 -0.300218 + 0.118743 -0.009606 -0.992879 + -0.235048 -0.932494 -0.274239 + -0.230879 -0.366908 0.901151 + 0.430031 0.007478 0.902783 + 0.165266 0.653187 0.738941 + 0.227330 0.863524 0.450164 + 0.562906 0.808831 0.170087 + 0.628621 -0.568017 -0.531218 + 0.107580 -0.979462 0.170529 + -0.141713 -0.637797 0.757055 + 0.277011 -0.859976 0.428610 + 0.682889 -0.057018 0.728294 + 0.345626 0.341895 0.873871 + -0.275347 -0.553561 0.785973 + 0.968527 0.156631 -0.193446 + 0.135941 -0.396167 -0.908059 + -0.379587 -0.865278 0.327425 + 0.455728 0.769062 -0.448170 + 0.451435 0.752071 -0.480204 + 0.198267 0.424072 0.883659 + -0.335372 -0.465138 0.819251 + -0.221612 -0.245883 -0.943626 + -0.534130 -0.808154 0.248177 + 0.507573 0.725204 -0.465241 + -0.145113 -0.329953 -0.932777 + 0.148303 0.397710 0.905446 + -0.366331 -0.425544 0.827475 + -0.549016 -0.717657 0.428427 + 0.581708 0.738947 -0.339961 + -0.224732 -0.485116 -0.845079 + 0.039163 0.440770 0.896765 + -0.474658 -0.382437 0.792743 + -0.611367 -0.688790 0.389614 + 0.596719 0.723772 -0.346526 + 0.002165 -0.543377 -0.839486 + 0.003200 0.591843 0.806047 + -0.592551 -0.342774 0.728965 + -0.600015 -0.689007 0.406511 + 0.695425 0.599158 -0.396729 + 0.080501 -0.593976 -0.800445 + -0.027849 0.636489 0.770783 + -0.610729 -0.262629 0.747018 + -0.651868 -0.661455 0.370872 + 0.706652 0.685084 -0.176927 + 0.378212 -0.348561 -0.857590 + 0.005612 -0.654329 -0.756189 + -0.114844 0.598114 0.793140 + -0.697295 -0.189718 0.691222 + -0.716357 -0.685367 0.130783 + 0.730596 0.682711 -0.011595 + 0.479713 -0.434450 -0.762318 + -0.719019 -0.693865 -0.039533 + -0.316690 0.569317 0.758674 + -0.829278 -0.204368 0.520127 + 0.651720 0.738997 0.170719 + 0.625465 -0.487549 -0.609171 + -0.681542 -0.696865 -0.223338 + -0.944089 -0.230070 0.236142 + -0.660742 0.476087 0.580312 + 0.640530 0.694397 0.327925 + 0.731084 -0.539519 -0.417655 + -0.628224 -0.712979 -0.311441 + -0.979884 -0.196666 0.033908 + -0.749647 0.541258 0.380878 + 0.286663 0.852944 0.436246 + 0.716264 -0.630022 -0.300065 + 0.961974 -0.268978 -0.047508 + -0.554779 -0.731228 -0.396896 + -0.975413 -0.199473 -0.093698 + -0.787765 0.547654 0.281961 + 0.525697 0.643293 0.556612 + -0.293359 -0.788419 -0.540680 + -0.299880 -0.691451 -0.657242 + 0.776856 -0.618948 0.115746 + -0.977723 -0.077174 -0.195197 + -0.654748 0.680905 0.328138 + 0.391592 0.684661 0.614732 + -0.883113 -0.002295 -0.469154 + -0.759481 0.095372 -0.643501 + -0.334933 -0.796335 -0.503656 + 0.569194 -0.598980 0.563242 + -0.752732 0.643871 -0.137205 + 0.191390 0.864686 0.464422 + -0.528612 0.815998 -0.233913 + -0.408049 0.152012 -0.900216 + -0.105104 0.891366 -0.440930 + 0.244647 -0.645823 -0.723229 + 0.866117 -0.437745 0.241289 + 0.793927 0.584507 0.167429 + 0.218146 0.938497 0.267647 + 0.125218 0.968589 -0.214839 + -0.841750 0.484565 0.238020 + 0.087707 0.996107 -0.008822 + 0.909571 -0.076009 0.408538 + 0.034480 0.938974 -0.342255 + 0.996637 0.081924 0.001782 + -0.900791 0.394192 -0.182174 + -0.880872 -0.389762 0.268607 + -0.881217 -0.250395 0.400947 + -0.781708 0.418380 0.462484 + 0.129192 0.989069 0.071078 + 0.936703 0.190910 -0.293497 + 0.216123 -0.723792 0.655299 + 0.807765 0.230703 0.542487 + 0.418063 -0.770920 0.480526 + 0.095052 0.905117 -0.414402 + -0.696972 0.507210 -0.506920 + 0.666991 -0.726785 0.164029 + -0.692306 -0.713429 0.108309 + -0.004451 -0.968054 -0.250702 + -0.065305 -0.997734 -0.016185 + -0.345196 -0.624559 0.700546 + -0.654653 0.105198 0.748574 + -0.599960 0.495065 0.628457 + 0.852964 -0.025842 -0.521330 + 0.200783 0.613771 0.763526 + 0.477797 -0.874779 -0.080453 + -0.564846 -0.799047 -0.206091 + 0.122742 -0.688708 0.714573 + -0.673524 -0.706122 -0.218533 + 0.629481 0.190468 0.753310 + -0.320760 -0.932678 0.165000 + 0.232948 0.933565 -0.272381 + -0.491530 0.500522 -0.712654 + -0.907501 -0.029725 -0.418997 + 0.528513 -0.704501 -0.473658 + 0.682543 -0.701228 0.205948 + 0.916451 -0.233080 -0.325255 + -0.410139 0.091824 -0.907389 + -0.495602 -0.783462 -0.374920 + -0.499138 0.227299 -0.836179 + 0.007380 -0.680991 0.732254 + -0.658477 0.235624 -0.714765 + 0.483493 0.250889 0.838624 + 0.211774 0.920515 -0.328335 + -0.367668 0.454055 -0.811575 + -0.105914 0.430880 -0.896172 + -0.278374 -0.109621 -0.954197 + -0.244989 0.457919 -0.854570 + -0.374873 -0.901508 -0.216225 + 0.019303 -0.514146 0.857485 + 0.329130 0.331973 0.884006 + 0.251279 0.939614 -0.232345 + 0.220120 0.956238 -0.192761 + 0.078516 0.464922 -0.881863 + -0.109132 -0.124089 -0.986251 + -0.268487 -0.950256 -0.157886 + -0.110807 -0.545842 0.830529 + 0.182115 0.452623 0.872907 + -0.122225 0.406264 0.905545 + 0.212007 0.971870 -0.102573 + 0.283231 0.520559 -0.805480 + 0.132374 -0.088582 -0.987234 + -0.149981 -0.870508 -0.468745 + -0.277733 -0.641970 0.714660 + -0.392319 -0.644813 0.655974 + -0.195894 0.579425 0.791134 + 0.380024 0.857977 -0.345625 + 0.445170 0.489746 -0.749649 + 0.380450 0.128454 -0.915837 + 0.109325 -0.768859 -0.630003 + 0.162186 -0.862766 -0.478884 + -0.577722 -0.566556 0.587582 + -0.206777 0.784731 0.584328 + 0.519635 0.748913 -0.411228 + 0.585440 0.505580 -0.633757 + 0.595010 0.084132 -0.799303 + 0.759407 -0.168699 -0.628365 + 0.028712 -0.942275 -0.333608 + -0.781710 -0.375471 0.497947 + -0.231846 0.908285 0.348233 + 0.630453 0.721174 -0.287121 + 0.794667 0.403645 -0.453404 + 0.906173 0.336114 -0.256669 + 0.861509 -0.196962 -0.467982 + 0.029660 -0.945581 -0.324031 + -0.885230 -0.381072 0.266744 + -0.790415 0.470842 0.391857 + 0.241830 0.949242 0.201140 + 0.362063 0.868885 0.337564 + 0.713515 -0.145649 0.685334 + 0.968615 -0.224408 -0.106894 + 0.034784 -0.835139 0.548938 + -0.657234 -0.373871 0.654419 + -0.744289 0.164896 0.647181 + 0.807139 0.346471 -0.478000 + -0.383232 -0.295689 -0.875044 + -0.786611 0.264071 -0.558131 + -0.138503 0.987005 -0.081471 + 0.670904 -0.625519 -0.398262 + 0.843437 -0.121260 0.523365 + 0.056023 0.868139 0.493149 + -0.688763 -0.634566 -0.350615 + 0.410235 -0.901917 -0.135105 + -0.915873 0.398977 -0.044658 + 0.885467 0.073609 0.458835 + -0.088147 0.818091 0.568294 + -0.943237 0.330624 -0.031484 + -0.653373 -0.590299 -0.473974 + 0.485387 -0.847307 -0.215568 + 0.907663 0.174980 0.381484 + -0.269852 0.762082 0.588567 + -0.981963 0.171052 0.080554 + -0.609605 -0.659084 -0.440443 + 0.491300 -0.784968 -0.377425 + 0.925025 0.259109 0.277835 + -0.304797 0.701573 0.644123 + -0.952335 0.185306 0.242321 + -0.735926 -0.549935 -0.394949 + 0.517701 -0.722214 -0.458686 + -0.436342 0.652262 0.619806 + 0.915710 0.358129 0.182259 + -0.886268 0.172193 0.429974 + -0.874588 -0.445390 -0.191635 + 0.343693 -0.681633 -0.645950 + -0.835394 0.069529 0.545236 + -0.363841 0.567117 0.738917 + 0.952928 0.300317 -0.041678 + -0.864890 -0.501670 -0.017091 + 0.295988 -0.663157 -0.687469 + -0.839475 -0.539048 0.068623 + -0.771267 0.005272 0.636489 + -0.156521 0.551155 0.819591 + 0.925433 0.329013 -0.187947 + 0.283350 -0.559883 -0.778616 + 0.279251 -0.502192 -0.818426 + -0.788841 -0.537891 0.297326 + -0.732002 -0.050950 0.679394 + 0.338679 0.617418 0.709994 + 0.887116 0.422169 -0.186545 + 0.870979 0.219557 -0.439533 + 0.420545 -0.710248 -0.564526 + -0.205353 -0.745904 0.633606 + -0.092019 -0.126111 0.987739 + 0.932501 0.008923 0.361057 + 0.161997 0.824749 -0.541799 + 0.892456 0.347552 0.287628 + 0.858385 0.067713 -0.508517 + -0.882211 -0.134790 -0.451149 + 0.032352 0.506075 -0.861882 + -0.823510 -0.274168 -0.496651 + 0.120837 0.758900 -0.639898 + 0.886696 0.419150 0.195151 + 0.163741 -0.760217 0.628696 + 0.478111 -0.841782 0.250623 + -0.407877 -0.627844 -0.662909 + 0.126683 -0.746003 0.653782 + -0.067348 -0.725895 0.684501 + -0.723985 -0.442992 -0.528775 + 0.138832 0.698242 -0.702270 + 0.863635 0.390785 0.318469 + 0.734461 0.419176 0.533722 + -0.173271 -0.659075 0.731845 + -0.698127 -0.449345 -0.557412 + 0.169556 0.741132 -0.649595 + 0.268033 0.707363 -0.654061 + 0.604154 0.490683 0.627877 + -0.275290 -0.559890 0.781498 + -0.781232 -0.215788 -0.585757 + -0.642927 -0.197327 -0.740072 + 0.336381 0.629878 -0.700073 + 0.420862 0.664181 0.617850 + -0.472560 -0.372930 0.798505 + -0.521483 -0.450559 0.724604 + -0.470551 -0.658484 -0.587350 + 0.282120 0.332425 -0.899946 + 0.248702 0.771399 0.585739 + 0.171019 0.824789 0.538958 + -0.529088 -0.367532 0.764844 + -0.372942 -0.862569 -0.341891 + 0.407928 0.135799 -0.902858 + 0.646851 -0.035797 -0.761776 + 0.237932 0.802295 0.547459 + -0.593376 -0.232142 0.770723 + -0.314060 -0.911921 -0.264132 + -0.202893 -0.923043 -0.326844 + 0.838967 -0.077938 -0.538571 + 0.177783 0.877111 0.446171 + -0.649120 -0.305112 0.696814 + -0.760603 -0.441307 0.476163 + -0.060697 -0.974299 -0.216928 + 0.865429 -0.076697 -0.495126 + -0.127143 0.910479 0.393525 + -0.575132 0.797854 0.180699 + -0.804542 -0.469425 -0.363802 + -0.046173 -0.959600 -0.277555 + 0.919037 0.021291 -0.393596 + 0.837123 -0.496841 0.228853 + 0.076115 0.913475 -0.399712 + -0.875116 0.033360 -0.482762 + -0.063244 -0.997531 0.030518 + -0.142702 -0.822152 0.551092 + 0.958573 -0.230600 0.167214 + 0.120454 0.932274 -0.341109 + -0.998207 0.051940 0.029754 + -0.956137 -0.179141 -0.231754 + -0.133914 -0.937659 0.320721 + 0.390516 -0.000697 -0.920596 + -0.339337 0.760483 -0.553638 + -0.723364 -0.687723 -0.061504 + -0.784897 -0.379479 -0.489829 + -0.118288 -0.960958 -0.250135 + -0.554761 -0.830071 -0.056767 + 0.730613 -0.494790 0.470519 + -0.332748 0.788362 -0.517459 + -0.301287 0.861158 -0.409429 + -0.008974 0.307982 -0.951350 + 0.969470 0.242438 0.036777 + -0.383510 -0.922714 -0.038968 + 0.701286 -0.360600 0.614952 + -0.314310 0.781196 -0.539390 + 0.898061 0.401834 0.178927 + 0.679103 0.620511 0.392154 + 0.785855 0.547701 0.287152 + -0.213682 -0.968149 0.130490 + 0.659190 -0.134647 0.739824 + -0.226965 0.738147 -0.635315 + 0.569667 0.653893 0.497899 + 0.566151 0.085212 0.819885 + -0.175915 -0.953297 0.245516 + -0.068043 0.612030 -0.787902 + 0.560254 0.657247 0.504124 + 0.521064 0.054674 0.851765 + -0.306169 -0.915570 0.260754 + 0.003440 0.521509 -0.853239 + 0.560178 0.740988 0.370320 + 0.463205 0.124258 0.877497 + -0.467153 -0.788091 0.400849 + 0.139837 0.341249 -0.929513 + 0.523013 0.798269 0.298704 + 0.245582 0.487926 0.837626 + -0.722524 -0.547693 0.421889 + 0.312402 0.082640 -0.946349 + 0.494318 0.845285 0.202838 + 0.049951 0.635869 0.770179 + -0.734247 -0.582564 0.348569 + 0.471365 -0.082982 -0.878026 + 0.529116 0.827011 0.189971 + -0.068282 0.636741 0.768049 + -0.798327 -0.539465 0.267678 + 0.529149 -0.348312 -0.773744 + 0.564287 0.816051 0.125061 + -0.177950 0.744632 0.643317 + -0.841929 -0.516854 0.154974 + 0.649244 -0.511488 -0.562905 + 0.669882 0.738376 0.077842 + -0.295297 0.806231 0.512632 + -0.822571 -0.559946 0.099183 + 0.810070 -0.469855 -0.350746 + 0.590851 0.805926 0.037115 + -0.460542 0.828425 0.318769 + -0.634143 -0.758574 0.149763 + 0.929936 -0.351080 -0.109373 + 0.398745 0.887957 -0.229207 + -0.750329 0.625741 -0.213201 + -0.410643 -0.897737 0.159502 + 0.975582 0.042640 0.215458 + 0.162483 0.919776 -0.357227 + -0.722753 0.485693 -0.491661 + -0.505563 -0.580761 -0.638061 + 0.922226 -0.316658 -0.221873 + 0.212148 0.922539 -0.322358 + -0.012445 0.629066 -0.777253 + -0.442688 0.622823 -0.645073 + 0.921276 0.260863 0.288446 + 0.852671 -0.267234 0.448930 + 0.781308 -0.207885 -0.588508 + 0.249917 0.946984 -0.201899 + 0.846040 0.154823 -0.510144 + 0.319499 0.911557 -0.258813 + 0.841867 0.237559 0.484589 + 0.742113 -0.206576 0.637648 + -0.212590 -0.935249 0.283046 + 0.360191 -0.890219 -0.278877 + -0.708582 -0.242147 -0.662779 + -0.585829 -0.170170 -0.792368 + -0.810943 0.435439 -0.390851 + -0.192516 0.792688 -0.578432 + -0.701445 0.325405 -0.634102 + -0.615113 0.102669 -0.781726 + 0.313795 0.925779 -0.210867 + 0.693178 0.250952 0.675668 + 0.646413 -0.125059 0.752669 + -0.379059 -0.889909 0.253723 + -0.933166 -0.166035 -0.318800 + -0.836041 -0.102968 -0.538919 + -0.713042 -0.222950 -0.664729 + -0.585424 -0.375811 -0.718363 + -0.484858 0.026960 -0.874177 + 0.260459 0.959893 -0.103757 + 0.562255 0.438356 0.701223 + 0.558250 -0.027765 0.829208 + -0.347823 -0.921824 0.171053 + -0.298529 -0.938411 0.173972 + -0.350461 -0.892626 0.283542 + -0.438652 -0.696322 -0.568085 + -0.327991 -0.030716 -0.944181 + 0.233508 0.957186 -0.171083 + 0.458628 0.596404 0.658759 + 0.406850 0.093567 0.908691 + 0.106203 0.200530 0.973914 + -0.254132 -0.517211 0.817258 + -0.393483 -0.919316 0.005307 + -0.108240 0.021129 -0.993900 + 0.319574 0.930198 -0.180564 + 0.297924 0.674717 0.675276 + 0.102728 0.712739 0.693867 + -0.119664 0.283831 0.951378 + -0.232608 -0.001570 0.972569 + -0.455982 -0.834521 0.309281 + 0.125948 -0.123635 -0.984302 + 0.409891 0.856549 -0.313548 + 0.509198 0.817035 -0.270503 + 0.033766 0.724810 0.688121 + -0.233942 0.383435 0.893448 + -0.449530 0.040576 0.892343 + -0.579036 -0.808373 0.106071 + 0.253946 -0.227581 -0.940063 + 0.431269 -0.253856 -0.865774 + 0.614921 0.778761 -0.124114 + -0.098586 0.706936 0.700373 + -0.400017 0.392468 0.828224 + -0.566838 0.115009 0.815762 + -0.692731 -0.707276 0.141013 + -0.308759 -0.857395 -0.411755 + 0.589877 -0.322627 -0.740241 + 0.612568 0.789749 0.032515 + -0.142058 0.760869 0.633165 + -0.409148 0.517260 0.751692 + -0.685399 0.160671 0.710221 + 0.165296 -0.863079 -0.477254 + -0.909377 0.115256 0.399688 + 0.716750 -0.471491 -0.513776 + 0.692917 0.716724 0.078568 + -0.116280 0.860619 0.495795 + -0.658602 0.527466 0.536677 + -0.881270 -0.437997 -0.177544 + 0.027392 -0.949795 -0.311672 + -0.827479 0.520591 0.210389 + 0.823459 -0.544200 -0.160503 + 0.777568 0.598740 0.192090 + -0.261297 0.909172 0.324238 + -0.691546 0.705596 -0.154592 + -0.920844 -0.029347 -0.388826 + -0.097476 -0.995187 -0.010106 + -0.487249 0.860601 -0.148173 + 0.887940 -0.392514 0.239782 + 0.715729 0.646366 0.264466 + -0.523306 0.666217 -0.531324 + -0.538967 0.688224 -0.485657 + -0.896942 -0.261380 -0.356615 + 0.130610 -0.936061 0.326697 + 0.444843 0.895572 0.008068 + 0.741781 -0.355229 0.568835 + -0.027731 0.580515 -0.813777 + -0.369775 0.736784 -0.566053 + -0.515110 0.525658 -0.677012 + -0.618089 -0.289190 -0.730982 + 0.306601 -0.910996 -0.275831 + 0.960923 -0.052104 0.271870 + 0.826024 0.297133 0.478953 + 0.723523 -0.259638 0.639611 + 0.885407 -0.159783 -0.436490 + 0.375660 0.921671 -0.096965 + 0.921901 0.364370 0.131659 + 0.398989 0.907237 -0.133152 + 0.746168 0.264946 0.610768 + 0.571084 -0.313250 0.758774 + -0.342824 -0.916413 0.206542 + 0.325295 -0.945403 -0.019926 + -0.524432 -0.235911 -0.818118 + -0.357977 0.055205 -0.932097 + 0.416183 0.611677 -0.672788 + -0.618960 0.457779 -0.638222 + -0.553657 0.392016 -0.734703 + -0.384787 0.353009 -0.852832 + 0.389016 0.921171 -0.010564 + 0.569902 0.228681 0.789251 + 0.384373 -0.354545 0.852382 + -0.395064 -0.906903 0.146463 + -0.840507 -0.238836 -0.486318 + -0.729926 -0.350074 -0.587075 + -0.586783 -0.365890 -0.722365 + -0.407291 -0.300310 -0.862513 + -0.205977 0.334444 -0.919631 + 0.377817 0.915646 0.137287 + 0.397205 0.231770 0.887981 + 0.176959 -0.380594 0.907653 + -0.304583 -0.943912 0.127516 + -0.337048 -0.937186 0.089900 + -0.333133 -0.938074 -0.095081 + -0.190082 -0.271530 -0.943473 + 0.028843 0.466671 -0.883961 + 0.303171 0.870563 0.387567 + 0.150234 0.199992 0.968211 + -0.022186 -0.301819 0.953107 + -0.271399 -0.433564 0.859282 + -0.328963 -0.899930 -0.286197 + 0.024798 -0.265989 -0.963657 + 0.245778 0.535314 -0.808104 + 0.251792 0.887870 0.385081 + -0.021114 0.232996 0.972248 + -0.245705 0.156700 0.956595 + -0.409423 -0.312174 0.857275 + -0.303939 -0.940526 -0.151762 + 0.208084 -0.299882 -0.931006 + 0.406913 0.573523 -0.710981 + 0.172563 0.873864 0.454514 + 0.077945 0.853626 0.515022 + -0.408617 0.146771 0.900828 + -0.528096 -0.326884 0.783748 + -0.279969 -0.939121 -0.199173 + 0.358792 -0.317441 -0.877781 + 0.546857 0.564729 -0.618085 + 0.602074 0.642010 -0.474690 + -0.100189 0.808547 0.579839 + -0.522720 0.179184 0.833461 + -0.629100 -0.245121 0.737664 + -0.301478 -0.948781 -0.094480 + 0.505142 -0.265310 -0.821244 + 0.649388 -0.271110 -0.710489 + 0.661087 0.679987 -0.317146 + -0.248751 0.804257 0.539716 + -0.648216 0.300268 0.699753 + -0.759369 -0.203223 0.618109 + -0.258060 -0.947179 -0.190415 + -0.149533 -0.938510 -0.311190 + 0.800065 -0.347161 -0.489259 + 0.657859 0.748833 -0.080437 + -0.321539 0.862483 0.390814 + -0.813892 0.276315 0.511107 + -0.914693 -0.091442 0.393669 + -0.990773 -0.135362 -0.006823 + -0.074758 -0.926409 -0.369022 + 0.818434 -0.518678 -0.247263 + 0.618442 0.765736 0.176571 + -0.283115 0.914445 0.289198 + -0.930320 0.331897 0.156042 + -0.750298 0.661098 0.001566 + -0.957640 -0.006861 -0.287885 + -0.512862 -0.753377 -0.411577 + 0.670901 -0.735445 -0.094936 + 0.711061 0.608788 0.351810 + -0.046570 0.961534 0.270708 + 0.259735 0.912893 0.314905 + -0.554138 0.799024 -0.233435 + -0.760881 0.555422 -0.335510 + -0.822514 -0.214628 -0.526694 + 0.453125 -0.816519 0.357736 + 0.793506 0.292808 0.533491 + 0.785451 0.618098 -0.031970 + 0.041696 0.966464 -0.253396 + -0.292879 0.505925 -0.811333 + -0.615004 0.543188 -0.571592 + -0.621459 -0.326380 -0.712225 + 0.951088 -0.242932 -0.190830 + 0.703923 0.227646 0.672807 + 0.557856 -0.466990 0.686088 + 0.954897 -0.095586 -0.281132 + 0.644378 0.651314 0.400707 + 0.912593 0.322678 0.251103 + 0.272640 0.962068 0.009625 + 0.557239 0.339761 0.757659 + 0.491884 -0.251400 0.833576 + -0.501397 -0.864781 0.027476 + 0.419292 -0.848980 -0.321602 + -0.336633 0.169511 -0.926253 + -0.144952 0.461621 -0.875154 + 0.746654 0.606925 -0.272304 + -0.206085 0.852628 -0.480160 + -0.296034 0.548187 -0.782212 + -0.217815 0.524886 -0.822831 + 0.336882 0.938985 0.069406 + 0.487512 0.386278 0.783021 + 0.350473 -0.205451 0.913761 + -0.385435 -0.914487 0.123095 + -0.760980 0.043828 -0.647293 + -0.558252 -0.022611 -0.829364 + -0.441400 -0.040411 -0.896400 + -0.326750 -0.059481 -0.943237 + -0.010755 0.535696 -0.844343 + 0.407990 0.912987 0.000457 + 0.406614 0.408113 0.817379 + 0.144252 -0.268567 0.952399 + -0.397348 -0.917562 0.013990 + -0.500328 -0.849014 -0.169845 + -0.469685 -0.841030 -0.268448 + -0.121571 -0.107339 -0.986762 + 0.159328 0.428623 -0.889324 + 0.457569 0.883303 -0.102015 + 0.306792 0.474113 0.825285 + -0.124194 -0.394658 0.910396 + -0.300992 -0.373246 0.877548 + -0.410350 -0.888442 -0.205631 + 0.074968 -0.146900 -0.986306 + 0.326790 0.403216 -0.854766 + 0.447517 0.891794 0.066570 + 0.107057 0.472156 0.874990 + -0.065670 0.496712 0.865428 + -0.410651 -0.261848 0.873385 + -0.349986 -0.927005 -0.134803 + 0.207165 -0.242962 -0.947656 + 0.448591 0.450655 -0.771801 + 0.314200 0.916500 0.247600 + 0.187150 0.918379 0.348647 + -0.236842 0.495482 0.835706 + -0.491752 -0.168522 0.854272 + -0.325637 -0.941219 -0.089822 + 0.305250 -0.357061 -0.882797 + 0.528745 0.587436 -0.612657 + 0.624575 0.486654 -0.610797 + 0.202379 0.940086 0.274375 + -0.357592 0.476357 0.803251 + -0.611967 -0.135417 0.779204 + -0.317850 -0.941724 -0.110124 + 0.416080 -0.389408 -0.821730 + 0.588519 -0.343452 -0.731906 + 0.700014 0.472971 -0.535050 + 0.088903 0.953008 0.289606 + -0.496470 0.522904 0.692885 + -0.746165 -0.258040 0.613721 + -0.221032 -0.955306 -0.196304 + -0.134199 -0.929126 -0.344552 + 0.766157 -0.440552 -0.467886 + 0.926882 0.051458 -0.371808 + 0.387682 0.914679 0.114306 + -0.660895 0.541695 0.519408 + -0.916356 -0.237329 0.322439 + -0.969168 -0.234508 -0.075630 + 0.310678 -0.869948 -0.382974 + 0.786011 -0.567984 -0.244093 + 0.988758 -0.101001 -0.110253 + 0.573580 0.777802 0.256965 + -0.747120 0.611405 0.260759 + -0.862600 0.505420 -0.021712 + -0.730528 -0.521348 -0.441050 + 0.089277 -0.947752 -0.306262 + 0.673767 -0.738706 0.018723 + 0.959190 -0.245196 0.140831 + 0.429323 0.802237 0.414846 + -0.163770 0.901750 0.400033 + -0.888233 0.268197 -0.372978 + -0.774880 -0.459551 -0.434021 + -0.299211 -0.941995 -0.152045 + 0.851494 -0.285609 0.439756 + 0.783769 -0.400585 0.474592 + 0.820067 -0.066938 -0.568339 + -0.042362 0.782678 -0.620983 + -0.714098 0.192803 -0.672972 + -0.336813 -0.114199 -0.934621 + 0.505065 -0.663936 -0.551452 + 0.739568 -0.223318 0.634955 + 0.122742 -0.688708 -0.714573 + 0.007380 -0.680991 -0.732254 + -0.495602 -0.783462 0.374920 + 0.155849 -0.756611 -0.635020 + 0.792678 0.343985 -0.503324 + -0.598631 -0.768158 0.227099 + 0.551300 -0.037630 -0.833458 + 0.483493 0.250889 -0.838624 + 0.019303 -0.514146 -0.857485 + -0.374873 -0.901508 0.216225 + -0.410139 0.091824 0.907389 + -0.278374 -0.109621 0.954197 + -0.763505 -0.515694 0.388741 + 0.390145 -0.792108 -0.469416 + 0.909571 -0.076009 -0.408538 + 0.034480 0.938974 0.342255 + -0.037607 0.872969 0.486324 + 0.275799 0.926639 0.255489 + -0.493992 0.206828 0.844508 + 0.329130 0.331973 -0.884006 + 0.211774 0.920515 0.328335 + -0.110807 -0.545842 -0.830529 + -0.268487 -0.950256 0.157886 + -0.109132 -0.124089 0.986251 + -0.105914 0.430880 0.896172 + -0.244989 0.457919 0.854570 + 0.078516 0.464922 0.881863 + -0.910521 -0.011369 0.413306 + -0.489518 0.504517 0.711221 + -0.162482 -0.943571 -0.288571 + -0.367851 0.454111 0.811461 + 0.666991 -0.726785 -0.164029 + 0.997150 0.075438 -0.000954 + 0.114168 0.968820 0.219894 + -0.696972 0.507210 0.506920 + -0.900791 0.394192 0.182174 + 0.251279 0.939614 0.232345 + 0.182115 0.452623 -0.872907 + -0.277733 -0.641970 -0.714660 + -0.149981 -0.870508 0.468745 + 0.132374 -0.088582 0.987234 + 0.283231 0.520559 0.805480 + 0.220120 0.956238 0.192761 + 0.212007 0.971870 0.102573 + -0.658995 -0.748027 -0.078621 + 0.570413 -0.810004 0.136099 + 0.940760 0.176536 0.289493 + 0.095883 0.995335 0.010734 + -0.846302 0.477734 -0.235675 + -0.912004 -0.277167 -0.302370 + -0.122225 0.406264 -0.905545 + -0.392319 -0.644813 -0.655974 + 0.109325 -0.768859 0.630003 + 0.380450 0.128454 0.915837 + 0.445170 0.489746 0.749649 + 0.380024 0.857977 0.345625 + -0.195894 0.579425 -0.791134 + -0.126984 -0.988338 -0.084042 + 0.852964 -0.025842 0.521330 + 0.547431 -0.706590 0.448385 + 0.141108 0.987260 -0.073525 + -0.781515 0.419075 -0.462181 + -0.849885 -0.370271 -0.374959 + -0.577722 -0.566556 -0.587582 + 0.162186 -0.862766 0.478884 + 0.595010 0.084132 0.799303 + 0.586179 0.495461 0.641024 + 0.462353 0.816771 0.345131 + -0.198250 0.784156 -0.588045 + 0.015036 -0.967322 0.253104 + 0.350256 0.750921 -0.559856 + 0.916451 -0.233080 0.325255 + 0.569191 -0.279830 -0.773121 + -0.427781 0.498781 -0.753804 + -0.599643 0.096845 -0.794386 + -0.413668 -0.839789 -0.351617 + -0.830343 -0.345768 -0.437007 + 0.183549 -0.910697 0.370056 + 0.777076 -0.178971 0.603425 + 0.837870 0.326374 0.437553 + 0.117412 0.975097 -0.188151 + -0.299744 -0.928208 0.220415 + -0.786121 -0.604356 -0.129487 + -0.906636 -0.289545 -0.306878 + -0.903848 0.047723 -0.425184 + 0.804034 -0.341336 0.486845 + 0.738137 -0.443185 0.508666 + 0.914929 -0.000545 0.403616 + 0.798345 0.585150 0.142286 + 0.901767 0.334270 0.274008 + 0.251468 0.939346 -0.233224 + -0.659002 0.562651 -0.499139 + 0.213887 -0.890277 -0.402069 + -0.646071 -0.356136 -0.675099 + -0.414127 0.329597 -0.848448 + 0.924768 -0.301134 0.232642 + 0.798073 -0.088300 -0.596055 + 0.703891 0.662945 -0.255033 + 0.493041 0.869232 0.036696 + 0.470455 0.403080 0.784983 + -0.867041 0.399082 0.298284 + -0.829546 0.504503 0.239437 + 0.581521 0.806124 0.109530 + 0.790126 -0.456522 -0.409010 + 0.893499 -0.029475 0.448096 + 0.919004 -0.183874 0.348743 + -0.638994 -0.759362 0.122703 + -0.963944 -0.235207 0.124458 + 0.891513 0.166310 0.421361 + 0.911033 0.246814 0.330305 + -0.510820 -0.846934 -0.147531 + -0.586759 -0.748607 -0.308710 + -0.749717 -0.526001 -0.401557 + -0.920967 0.355606 0.159260 + 0.749866 -0.494411 -0.439612 + 0.723002 0.689273 0.046591 + -0.412463 -0.904111 0.111616 + 0.979118 0.134886 0.152101 + 0.562111 -0.042828 0.825952 + 0.936396 -0.010697 0.350784 + 0.351753 0.755262 0.553036 + 0.637447 0.765528 0.087340 + 0.938355 0.294100 0.181644 + 0.812712 -0.560655 -0.158637 + -0.974970 0.149101 0.164929 + -0.938448 -0.334029 -0.087973 + -0.947226 -0.279827 -0.156393 + -0.540098 -0.837580 -0.082184 + -0.942015 -0.297289 -0.155647 + 0.956675 0.291017 -0.009077 + 0.963098 0.269081 0.006114 + 0.985609 0.168590 0.012319 + 0.565247 -0.432689 -0.702336 + 0.687118 -0.021982 -0.726213 + -0.569445 -0.452250 -0.686442 + -0.665813 -0.583930 0.464455 + -0.802505 -0.091575 0.589575 + -0.746176 0.662786 0.062743 + -0.564703 -0.822665 0.065827 + 0.810154 0.086827 0.579751 + 0.681280 0.713539 0.163459 + -0.986734 -0.150803 0.060121 + 0.983157 0.180861 -0.026311 + 0.990620 0.134224 -0.025613 + 0.675629 0.671982 0.303260 + -0.771083 0.347540 0.533523 + 0.958580 -0.104415 0.264993 + 0.994476 0.097791 -0.038139 + 0.858652 0.333976 0.388814 + -0.818264 -0.249053 0.518090 + -0.771451 0.555539 0.310227 + -0.763281 0.625821 0.160468 + 0.703731 0.709687 -0.033286 + 0.949658 0.313263 0.003853 + 0.720565 -0.680875 -0.131134 + -0.939921 -0.340635 0.022699 + -0.942057 -0.335435 0.003311 + -0.948304 -0.317362 0.000707 + -0.959705 -0.280872 -0.008827 + -0.699456 -0.710909 0.073276 + 0.931269 0.212985 -0.295594 + 0.853438 0.228384 -0.468491 + 0.967547 0.068395 -0.243258 + 0.971586 0.021025 -0.235750 + 0.672593 0.422571 0.607497 + -0.995315 0.037755 -0.089012 + 0.918528 0.285993 -0.272974 + 0.747544 -0.520285 0.412895 + -0.925180 0.185097 0.331334 + -0.680897 0.731682 -0.031952 + -0.580969 -0.801895 -0.139424 + 0.853981 -0.519401 0.030638 + 0.728664 0.675546 0.112636 + -0.975566 -0.219202 -0.014889 + -0.898324 -0.035046 -0.437933 + -0.953124 0.127983 -0.274182 + -0.840824 -0.537053 -0.067746 + 0.996309 0.055135 -0.065800 + 0.874060 -0.304350 -0.378670 + 0.985053 -0.172253 0.000188 + -0.484420 0.558271 0.673551 + 0.744429 0.607679 0.276680 + -0.798782 -0.579204 -0.162700 + 0.940768 0.338734 0.014679 + 0.899746 0.353331 0.256151 + 0.947003 0.319397 0.034216 + 0.823454 -0.141849 0.549366 + -0.927159 -0.355919 -0.117039 + -0.549817 -0.834850 0.026949 + -0.750331 0.659413 0.046663 + -0.791278 -0.605723 0.083533 + 0.734803 0.676786 -0.045002 + 0.933812 0.303785 -0.188969 + 0.577622 -0.816128 -0.016988 + -0.934423 -0.355496 0.021792 + -0.934858 -0.314413 -0.164879 + -0.941517 -0.327055 0.081126 + -0.941840 -0.258605 0.214618 + -0.946792 -0.297226 0.123455 + 0.798695 -0.317829 -0.510951 + 0.565232 0.484037 -0.667998 + 0.835984 -0.185991 -0.516273 + 0.450572 0.266115 -0.852155 + 0.777657 0.587326 0.224272 + -0.362185 -0.708737 -0.605404 + -0.376142 0.642568 0.667550 + 0.765104 0.619793 0.174565 + -0.925028 -0.315700 -0.211320 + 0.835350 -0.228542 -0.499959 + 0.751193 -0.335473 -0.568478 + -0.712129 0.701830 0.017517 + -0.684718 -0.712271 0.154377 + -0.677577 -0.729863 -0.090495 + -0.654817 0.754512 -0.043886 + -0.694221 -0.711058 -0.111601 + 0.813147 -0.581067 -0.033957 + 0.736572 0.671772 0.078638 + -0.973575 -0.146858 -0.174883 + -0.968020 -0.250703 0.009173 + -0.981903 0.115082 -0.150409 + -0.998651 -0.051922 0.000248 + -0.998766 0.043886 -0.023245 + -0.353460 -0.935386 0.010913 + 0.694124 -0.401799 -0.597285 + 0.763148 0.591910 -0.259321 + 0.978760 0.131027 0.157674 + 0.873977 -0.303850 0.379262 + -0.111286 -0.579791 0.807129 + -0.211933 -0.977269 -0.005411 + -0.111532 -0.576954 -0.809126 + -0.352806 -0.935630 -0.011173 + 0.929755 0.368104 0.007355 + 0.879113 0.353361 0.319838 + 0.914600 0.355994 -0.191769 + 0.399695 0.654487 0.641787 + 0.579445 0.307578 -0.754744 + 0.914952 -0.358838 -0.184659 + 0.418877 0.886190 0.198013 + -0.924077 -0.365423 0.112016 + -0.925018 -0.379858 0.007052 + -0.952867 0.045294 0.299990 + -0.364322 -0.923539 -0.119773 + -0.717286 0.696340 0.024745 + -0.772635 -0.626185 0.104534 + 0.513693 -0.850102 0.115955 + 0.730780 0.679153 -0.068643 + 0.787626 0.486237 -0.378443 + -0.916535 -0.381193 -0.121056 + -0.926585 -0.349205 0.139630 + -0.740840 -0.641686 -0.198483 + -0.799111 0.438418 -0.411353 + -0.920519 -0.390546 0.010860 + -0.913926 -0.301645 -0.271570 + -0.482463 -0.873438 0.065840 + 0.793967 -0.579958 0.182387 + -0.514902 -0.855825 0.049382 + 0.493041 0.869232 -0.036696 + -0.867041 0.399082 -0.298284 + 0.790126 -0.456522 0.409010 + -0.771083 0.347540 -0.533523 + 0.851058 -0.400983 0.338988 + 0.802726 0.582178 0.129230 + -0.722926 -0.517753 -0.457504 + -0.824771 -0.037453 0.564225 + 0.780236 0.590625 0.205896 + 0.741101 -0.333884 -0.582486 + 0.417917 0.541331 0.729593 + -0.497012 0.797484 -0.342050 + -0.699460 -0.702877 -0.129304 + 0.654813 -0.748219 0.106716 + 0.570016 -0.775843 0.270461 + -0.590830 0.798936 -0.112343 + -0.699168 -0.687088 -0.197671 + 0.728787 -0.680490 -0.076177 + 0.805309 0.591177 -0.044578 + -0.882060 -0.051833 0.468277 + -0.953146 0.127721 0.274228 + -0.840730 -0.537193 0.067802 + -0.939084 0.309014 0.150437 + -0.484420 0.558271 -0.673551 + 0.744429 0.607679 -0.276680 + 0.779469 -0.310190 0.544252 + 0.917315 0.397965 -0.012541 + 0.901343 0.403818 0.156561 + 0.880621 0.352489 -0.316638 + 0.820175 0.323817 0.471653 + 0.891333 -0.002124 0.453344 + 0.066230 0.046930 0.996700 + 0.637541 0.569429 -0.518934 + 0.858669 -0.359485 -0.365320 + -0.871033 0.360000 0.334218 + 0.958047 -0.273686 -0.085104 + 0.416500 0.898785 0.136798 + -0.846335 0.438492 0.302392 + -0.911680 -0.410357 -0.021136 + -0.914825 -0.403675 -0.011872 + -0.472098 -0.838147 0.273189 + -0.921102 -0.388163 0.030014 + -0.368513 -0.928561 -0.044423 + -0.705734 0.688900 -0.165396 + -0.714241 -0.690352 0.115210 + 0.626185 -0.754326 0.197192 + 0.759604 0.630081 -0.161244 + 0.674892 0.723561 -0.144844 + -0.694070 -0.686179 -0.217774 + 0.066230 0.046930 -0.996700 + -0.882556 0.246378 -0.400491 + -0.859883 0.379065 -0.341923 + -0.454823 -0.890057 0.030559 + -0.811999 0.543314 -0.213232 + -0.510820 -0.846934 0.147531 + 0.669397 -0.732435 0.124280 + -0.631170 -0.775523 0.013737 + -0.752393 0.644348 -0.136822 + -0.829546 0.504503 -0.239437 + 0.581521 0.806124 -0.109530 + -0.586759 -0.748607 0.308710 + 0.749866 -0.494411 0.439612 + -0.742454 -0.620078 0.253505 + 0.852581 0.509343 0.116940 + 0.317140 -0.573554 -0.755287 + -0.777687 -0.506113 -0.372897 + -0.876962 0.381580 0.292122 + 0.731461 0.656123 0.185654 + 0.954053 0.128096 0.270877 + -0.645078 0.764066 0.008787 + -0.262374 0.948932 0.175182 + -0.877519 -0.307489 0.367982 + 0.111764 -0.788526 0.604761 + 0.506693 0.277915 0.816104 + -0.497306 0.829747 -0.253389 + -0.647476 -0.726171 -0.231194 + 0.727714 -0.677259 -0.108409 + 0.831217 0.555134 -0.030071 + -0.590356 0.500951 -0.632872 + 0.647929 0.723056 -0.239536 + 0.757447 -0.344835 0.554403 + 0.867453 0.192206 0.458893 + 0.879736 0.475462 -0.000754 + 0.862695 0.479957 0.159367 + 0.909157 0.384782 -0.159299 + 0.519251 0.573585 0.633544 + 0.850572 -0.165826 -0.499029 + 0.458674 0.869842 0.181641 + 0.908755 -0.416387 -0.028045 + 0.947208 -0.288171 0.140547 + 0.393432 0.881926 -0.259651 + 0.951439 -0.297102 -0.080580 + 0.382643 0.918324 0.101318 + -0.893957 0.423820 0.145661 + -0.365039 -0.930819 0.017949 + -0.902931 -0.422903 0.076613 + -0.884336 -0.466851 -0.000600 + -0.954248 -0.201081 0.221307 + -0.882314 -0.470456 -0.013893 + -0.379605 -0.923812 -0.049708 + -0.849908 -0.007119 -0.526882 + -0.569786 0.820741 -0.041572 + -0.871372 -0.090272 0.482247 + 0.350957 -0.774398 0.526438 + 0.432960 0.579722 0.690267 + 0.708247 0.705782 -0.016075 + -0.904043 0.358941 -0.232092 + -0.373819 -0.926463 -0.043888 + 0.413761 0.879581 -0.234818 + -0.857629 0.468375 -0.212359 + -0.374183 -0.924370 0.074340 + -0.753374 -0.655746 -0.049238 + 0.534423 -0.845033 0.017626 + -0.749672 0.659641 -0.053533 + 0.740049 0.671094 0.044274 + -0.685921 -0.555408 0.470143 + -0.920967 0.355606 -0.159260 + 0.723002 0.689273 -0.046591 + 0.565247 -0.432689 0.702336 + -0.723181 -0.576847 0.379812 + 0.825541 -0.383213 -0.414282 + -0.879642 -0.464838 0.100776 + -0.736843 -0.548416 -0.395350 + -0.626709 -0.770633 -0.115589 + 0.762170 -0.644542 0.060525 + 0.825437 0.534298 0.182150 + -0.461160 0.847416 -0.263092 + 0.283516 0.634013 0.719476 + -0.843026 0.291909 0.451769 + 0.380304 -0.782692 0.492709 + -0.780784 -0.580282 -0.231621 + -0.492750 0.669478 0.555875 + -0.925376 -0.365742 0.099556 + -0.055723 -0.818999 0.571083 + 0.821540 0.375808 0.428766 + -0.954627 0.296519 -0.027634 + 0.837525 -0.231186 0.495080 + 0.872295 0.475797 -0.112777 + 0.836184 0.065925 0.544473 + -0.752864 -0.360031 0.550975 + 0.864251 0.503030 0.005607 + 0.846600 0.478288 0.233470 + 0.856478 0.480712 -0.188044 + 0.936574 0.144738 0.319185 + 0.807943 0.384362 -0.446647 + -0.467037 -0.675848 0.570180 + -0.904160 0.331191 0.269829 + 0.716214 0.520046 -0.465392 + 0.897788 -0.429118 0.099168 + -0.887696 0.405996 0.217170 + 0.458612 0.881884 0.109341 + 0.906630 -0.412884 -0.086884 + 0.950135 -0.271877 0.152727 + 0.928982 -0.367956 -0.040010 + 0.428997 0.893279 -0.134219 + -0.908211 0.417950 0.021695 + -0.356078 -0.929586 0.095285 + -0.843710 -0.491483 0.215864 + -0.871710 -0.489998 0.004780 + -0.876533 -0.447594 -0.177060 + -0.395671 -0.918234 -0.017042 + -0.663419 -0.577043 -0.476337 + 0.871842 -0.008332 -0.489716 + 0.454568 0.860291 -0.230797 + 0.430621 0.891959 -0.137750 + -0.892833 0.411325 -0.183472 + -0.414534 -0.909973 0.010505 + 0.953265 -0.300102 0.035000 + 0.418380 0.903272 -0.095177 + -0.886132 0.448085 -0.118279 + -0.329202 -0.944259 -0.000668 + -0.752371 0.658716 -0.005710 + -0.816704 -0.570925 -0.083902 + 0.556261 -0.827481 -0.076481 + 0.737250 0.675337 0.019560 + -0.735305 -0.550048 -0.395946 + -0.746176 0.662786 -0.062743 + -0.564703 -0.822665 -0.065827 + 0.810154 0.086827 -0.579751 + 0.681280 0.713539 -0.163459 + -0.867235 -0.389871 0.309682 + -0.957953 0.092854 -0.271484 + 0.711908 0.499234 0.493915 + 0.411606 -0.698843 -0.584977 + 0.331004 -0.939964 -0.083091 + -0.810649 -0.232793 -0.537266 + 0.587452 -0.782552 0.206185 + -0.248202 0.959065 0.136342 + 0.456337 0.318910 0.830694 + -0.958875 -0.092989 0.268163 + -0.670013 0.700931 0.244497 + 0.013557 -0.846236 0.532635 + 0.851058 -0.400983 -0.338988 + 0.679333 0.457632 -0.573654 + 0.626900 -0.391799 0.673417 + 0.492996 0.443887 -0.748278 + 0.802726 0.582178 -0.129230 + -0.712129 0.701830 -0.017517 + -0.582354 0.060297 -0.810696 + 0.885295 0.464834 -0.013478 + 0.870632 0.277063 0.406493 + 0.795971 0.482131 -0.366033 + 0.778079 0.421155 0.466071 + 0.870309 0.448273 -0.203993 + -0.445175 0.056179 0.893680 + 0.797661 0.597849 0.079459 + 0.821213 0.558432 -0.117318 + 0.931279 -0.355866 -0.077965 + -0.141640 -0.984313 0.105200 + 0.899065 -0.426549 0.098677 + -0.869602 0.483806 0.098613 + -0.402769 -0.915181 -0.014863 + 0.431300 0.901907 -0.023327 + 0.914966 -0.387660 -0.112058 + 0.896981 -0.420051 0.137774 + 0.560540 0.793675 -0.236380 + -0.864496 0.485499 -0.130147 + -0.359445 -0.922116 0.143183 + -0.838566 -0.492957 0.231950 + -0.889384 -0.456744 -0.019509 + -0.729736 -0.628321 -0.269625 + -0.777224 -0.509073 -0.369821 + -0.318543 0.296715 -0.900273 + -0.609894 0.686001 -0.396776 + -0.210905 -0.976418 -0.046130 + 0.883462 0.438517 -0.164915 + 0.949994 -0.302323 0.078187 + 0.917836 -0.386075 0.092323 + 0.407639 0.913106 0.008213 + -0.885641 0.458084 -0.076146 + -0.454028 -0.890159 0.038401 + -0.356629 -0.931087 -0.076772 + 0.937662 -0.347545 -0.001706 + 0.418947 0.906826 0.046374 + -0.902254 0.430418 -0.026030 + 0.693353 0.717117 0.070745 + -0.683894 0.695492 0.220409 + -0.775279 -0.631202 -0.022929 + 0.683196 -0.717296 -0.136858 + 0.747544 -0.520285 -0.412895 + -0.517945 0.855127 0.022158 + -0.580969 -0.801895 0.139424 + 0.853981 -0.519401 -0.030638 + 0.812229 0.568846 -0.129221 + -0.684718 -0.712271 -0.154377 + -0.739869 -0.056768 -0.670352 + -0.877680 0.384106 -0.286600 + -0.830074 -0.441996 0.340026 + -0.677577 -0.729863 0.090495 + -0.617762 0.783517 0.066867 + 0.706320 0.493091 0.507911 + 0.809643 -0.553311 -0.195769 + -0.657865 -0.172557 -0.733101 + 0.654813 -0.748219 -0.106716 + 0.771423 0.600744 -0.209794 + 0.758019 -0.386723 0.525216 + 0.852581 0.509343 -0.116940 + -0.497012 0.797484 0.342050 + -0.699460 -0.702877 0.129304 + 0.875763 0.482357 0.019262 + 0.903967 0.179940 0.387900 + 0.870196 0.474256 -0.133569 + 0.893637 0.151866 -0.422316 + 0.827569 0.282013 -0.485386 + 0.405373 -0.525697 0.747874 + 0.156753 -0.382063 0.910745 + 0.152157 0.025673 -0.988023 + -0.215893 -0.188115 0.958125 + -0.535232 0.748402 0.391690 + -0.643711 0.745248 0.173897 + 0.817823 0.573504 -0.047529 + 0.938123 -0.346302 -0.000685 + -0.129151 -0.985118 0.113416 + -0.850214 0.524322 0.047153 + -0.424952 -0.905199 -0.005494 + 0.931907 -0.347521 -0.103821 + 0.396277 0.905100 -0.154141 + 0.625184 -0.568249 0.535012 + 0.408735 0.706859 0.577309 + -0.569847 0.812411 0.123541 + -0.792508 -0.170519 0.585538 + -0.720187 -0.608452 0.333343 + -0.699085 -0.701543 0.138266 + -0.820175 -0.536975 -0.197407 + -0.856734 -0.511710 0.064491 + -0.786937 -0.616969 -0.008890 + 0.179324 -0.719429 -0.671018 + 0.109270 -0.419658 -0.901081 + 0.850932 0.517532 0.089856 + 0.846483 0.532317 0.010267 + -0.659091 0.688219 -0.303237 + -0.170294 -0.984286 -0.046691 + 0.957054 -0.289883 -0.003900 + -0.465824 -0.884388 -0.029433 + 0.941823 -0.326627 0.079278 + 0.392940 0.914952 0.091978 + -0.866282 0.499509 0.006771 + -0.846123 0.504052 0.173228 + -0.421450 -0.900313 -0.108702 + 0.928722 -0.349964 -0.122475 + 0.504581 0.853462 0.130387 + 0.469680 -0.223765 -0.854008 + 0.251697 0.963440 -0.091829 + -0.849559 0.447865 -0.278687 + -0.533783 -0.716126 -0.449710 + 0.669012 0.739885 -0.070660 + -0.832037 0.551768 0.057153 + -0.694221 -0.711058 0.111601 + 0.813147 -0.581067 0.033957 + -0.645078 0.764066 -0.008787 + -0.626709 -0.770633 0.115589 + -0.908168 -0.316205 -0.274309 + -0.736133 -0.558454 0.382410 + 0.570016 -0.775843 -0.270461 + -0.743119 0.669023 -0.013491 + 0.552435 0.472749 0.686530 + 0.874347 -0.194619 0.444567 + 0.602799 -0.694952 -0.392014 + 0.636075 -0.296048 0.712576 + -0.750684 -0.130442 -0.647656 + 0.961414 -0.223449 -0.160479 + 0.731461 0.656123 -0.185654 + 0.438031 -0.594378 0.674421 + 0.311723 0.622647 -0.717733 + 0.506693 0.277915 -0.816104 + -0.262374 0.948932 -0.175182 + -0.877519 -0.307489 -0.367982 + 0.111764 -0.788526 -0.604761 + 0.704817 0.709366 -0.005681 + 0.360215 0.900069 0.245196 + 0.872005 0.466128 0.149441 + -0.331854 -0.833353 0.442036 + 0.821026 0.021258 0.570494 + 0.576368 0.799537 0.168940 + 0.218115 0.924668 -0.312114 + 0.620401 0.729457 -0.288090 + 0.826613 -0.132123 -0.547042 + -0.655578 0.752140 -0.067100 + -0.176625 -0.982904 0.051998 + 0.837893 0.545782 0.007585 + 0.933665 -0.348940 0.080691 + -0.846706 0.531840 0.015372 + -0.477147 -0.875861 0.072091 + 0.923705 -0.372276 -0.090439 + 0.409314 0.883095 -0.229361 + -0.942606 -0.309381 0.125608 + -0.834314 -0.548840 -0.051916 + -0.891244 -0.450969 0.048082 + -0.747496 -0.569747 0.341522 + -0.755445 0.269261 -0.597328 + -0.746468 0.593584 0.300738 + -0.430759 -0.899654 -0.071199 + 0.927421 -0.356048 -0.114544 + 0.854842 0.518027 -0.029883 + -0.698093 0.715545 -0.025723 + -0.141165 -0.989919 -0.011522 + -0.850168 0.525155 0.037761 + -0.460618 -0.881522 -0.103680 + 0.936422 -0.343863 0.069793 + 0.428456 0.888969 0.161736 + 0.279563 0.959329 -0.039151 + -0.866785 0.355735 -0.349480 + -0.327100 -0.818854 -0.471683 + 0.616865 0.053165 -0.785271 + 0.805309 0.591177 0.044578 + -0.590830 0.798936 0.112343 + -0.699168 -0.687088 0.197671 + 0.728787 -0.680490 0.076177 + -0.461160 0.847416 0.263092 + -0.780784 -0.580282 0.231621 + 0.405672 -0.908957 0.096054 + 0.783004 -0.612479 -0.108507 + 0.587452 -0.782552 -0.206185 + -0.888758 0.276237 -0.365789 + 0.089429 -0.559261 -0.824154 + -0.753858 -0.473158 0.455872 + -0.655134 0.750455 -0.087272 + -0.973972 0.068110 0.216191 + -0.847861 -0.480106 -0.225011 + 0.545438 0.582082 0.603058 + 0.437374 -0.599932 0.669915 + 0.614714 0.057047 0.786685 + 0.341668 -0.844424 -0.412567 + -0.530523 0.711276 0.461121 + -0.793134 0.046185 -0.607294 + 0.825437 0.534298 -0.182150 + 0.799098 -0.515971 0.308573 + 0.428455 0.708889 -0.560270 + -0.824755 0.545397 -0.149401 + 0.202774 0.978390 0.040435 + 0.001770 0.954456 0.298347 + -0.662698 0.493274 0.563483 + -0.885083 0.425979 -0.187538 + -0.236182 -0.951226 0.198459 + 0.789804 -0.082142 0.607834 + 0.500143 0.862682 0.075074 + -0.582664 0.392691 -0.711545 + -0.077711 0.978955 -0.188702 + -0.646443 0.604481 -0.465526 + 0.490495 0.869328 -0.060693 + 0.788859 -0.087437 -0.608323 + -0.234545 -0.950954 -0.201682 + -0.629109 0.751872 -0.197259 + -0.358291 -0.931971 0.055288 + 0.882932 -0.429199 0.190313 + 0.853454 0.519823 0.037425 + -0.517129 0.810656 0.274615 + -0.510662 -0.290441 0.809239 + 0.689491 -0.596930 0.410216 + 0.584659 0.637570 0.501676 + -0.790701 0.550325 0.268206 + -0.884414 0.455033 0.103713 + -0.570023 0.411206 0.711325 + -0.290689 -0.956662 -0.017262 + 0.836326 -0.522058 -0.167375 + 0.851017 0.523088 -0.046358 + -0.634636 0.712755 0.298693 + 0.277246 0.957847 -0.075257 + -0.665622 0.354731 -0.656592 + -0.158114 -0.873296 -0.460818 + 0.818582 0.047783 -0.572399 + 0.831217 0.555134 0.030071 + -0.497306 0.829747 0.253389 + -0.647476 -0.726171 0.231194 + 0.727714 -0.677259 0.108409 + -0.248202 0.959065 -0.136342 + -0.958875 -0.092989 -0.268163 + 0.013557 -0.846236 -0.532635 + 0.456337 0.318910 -0.830694 + -0.611715 -0.460042 0.643557 + -0.606470 0.778967 -0.159390 + -0.722189 -0.530911 -0.443369 + 0.363545 -0.870612 0.331465 + 0.651377 0.583084 0.485511 + 0.626132 0.086206 0.774937 + -0.365938 0.872567 0.323600 + 0.240327 -0.893919 -0.378353 + -0.696147 0.106539 -0.709950 + 0.726400 -0.621643 0.293093 + 0.776176 0.397521 -0.489416 + -0.592838 0.803953 -0.046935 + -0.664943 -0.190987 0.722063 + -0.209925 -0.953407 0.216672 + 0.799500 -0.048663 0.598691 + 0.484458 0.873118 0.054459 + -0.597062 0.368407 -0.712596 + 0.799069 -0.052186 -0.598971 + 0.475233 0.878907 -0.040943 + -0.209417 -0.952887 -0.219434 + -0.585411 0.386158 0.712865 + -0.619533 0.757355 -0.206381 + -0.466122 -0.869032 0.165873 + 0.842799 -0.474712 0.253648 + 0.833461 0.551219 0.038747 + -0.600109 0.679082 0.422749 + -0.400917 -0.906158 -0.134697 + 0.807886 -0.544969 -0.224340 + 0.813632 0.580340 -0.034765 + 0.821540 0.375808 -0.428766 + -0.492750 0.669478 -0.555875 + -0.925376 -0.365742 -0.099556 + -0.055723 -0.818999 -0.571083 + -0.526733 0.819350 -0.226315 + -0.746489 -0.471834 -0.469177 + 0.395481 -0.894377 0.209008 + 0.674928 0.642493 0.362871 + -0.150219 0.974571 0.166269 + 0.704682 0.174677 0.687685 + -0.720016 0.140565 -0.679572 + 0.079673 -0.984074 -0.158903 + 0.602799 -0.694952 0.392014 + 0.636075 -0.296048 -0.712576 + 0.874347 -0.194619 -0.444567 + 0.552435 0.472749 -0.686530 + -0.685184 0.725123 -0.068704 + -0.792646 -0.049503 0.607670 + -0.182973 -0.954521 0.235393 + 0.808328 -0.015247 0.588534 + 0.469686 0.882158 0.034522 + -0.610703 0.345142 -0.712685 + -0.183498 -0.953930 -0.237372 + 0.808184 -0.016955 -0.588686 + 0.460986 0.887139 -0.021828 + -0.599580 0.361507 0.714015 + -0.420105 0.901720 0.102044 + -0.696814 -0.350616 0.625714 + 0.604420 -0.540653 0.585125 + 0.539220 0.524746 0.658698 + 0.441410 0.857307 -0.264920 + -0.824829 0.287441 -0.486862 + -0.186141 -0.685126 -0.704240 + 0.525283 -0.059378 -0.848854 + -0.468816 0.844429 -0.259134 + -0.759769 -0.366730 -0.536899 + 0.232398 -0.916102 0.326724 + 0.611929 0.618974 0.492356 + 0.018807 0.969982 0.242450 + -0.681931 0.728229 0.068208 + 0.134277 0.198973 0.970762 + -0.581610 -0.802835 0.131095 + 0.614714 0.057047 -0.786685 + 0.341668 -0.844424 0.412567 + 0.437374 -0.599932 -0.669915 + -0.973972 0.068110 -0.216191 + -0.530523 0.711276 -0.461121 + 0.545438 0.582082 -0.603058 + -0.655134 0.750455 0.087272 + -0.847861 -0.480106 0.225011 + -0.793134 0.046185 0.607294 + -0.154824 -0.954721 0.254041 + 0.815997 0.018128 0.577772 + 0.455475 0.890108 0.015830 + -0.622886 0.322473 -0.712758 + -0.613111 0.338108 0.713987 + -0.156523 -0.954107 -0.255306 + 0.816430 0.018499 -0.577147 + 0.447326 0.894362 -0.004046 + -0.516427 0.847005 0.126040 + -0.994965 -0.040683 -0.091597 + -0.470523 -0.835144 0.284856 + -0.041363 0.278942 0.959417 + 0.626132 0.086206 -0.774937 + -0.365938 0.872567 -0.323600 + 0.240327 -0.893919 0.378353 + 0.651377 0.583084 -0.485511 + 0.363545 -0.870612 -0.331465 + -0.696147 0.106539 0.709950 + -0.606470 0.778967 0.159390 + -0.722189 -0.530911 0.443369 + -0.125326 -0.953936 0.272579 + 0.822793 0.051830 0.565972 + 0.441944 0.897042 -0.001412 + -0.634469 0.301200 -0.711848 + 0.434186 0.900741 0.012200 + -0.625125 0.315455 0.713938 + -0.128445 -0.953319 -0.273286 + 0.823372 0.054359 -0.564893 + 0.704682 0.174677 -0.687685 + -0.150219 0.974571 -0.166269 + -0.720016 0.140565 0.679572 + 0.079673 -0.984074 0.158903 + 0.674928 0.642493 -0.362871 + -0.526733 0.819350 0.226315 + 0.395481 -0.894377 -0.209008 + -0.746489 -0.471834 0.469177 + -0.583268 -0.667635 0.462669 + 0.377155 0.034845 0.925494 + 0.326486 0.839638 0.434069 + -0.612607 0.772208 0.168545 + 0.620469 0.372457 -0.690140 + 0.020371 0.930258 -0.366341 + -0.992067 -0.007787 0.125472 + -0.081182 -0.324565 -0.942373 + 0.018807 0.969982 -0.242450 + 0.134277 0.198973 -0.970762 + -0.681931 0.728229 -0.068208 + -0.581610 -0.802835 -0.131095 + 0.611929 0.618974 -0.492356 + -0.468816 0.844429 0.259134 + -0.759769 -0.366730 0.536899 + 0.232398 -0.916102 -0.326724 + 0.257633 0.288877 -0.922050 + -0.642702 0.693619 -0.325311 + -0.955314 -0.055364 0.290363 + -0.643900 -0.611312 -0.460098 + 0.857256 0.214875 -0.467911 + 0.341195 0.939341 0.034988 + 0.493981 0.855369 0.155973 + 0.848677 -0.528763 -0.012533 + 0.978918 0.077087 -0.189150 + 0.771573 0.244465 -0.587292 + 0.867314 0.496895 -0.029340 + 0.458807 0.871117 -0.175074 + -0.671515 0.640611 0.372405 + -0.214184 0.459078 0.862191 + -0.120125 -0.888511 0.442852 + 0.927479 -0.340396 0.154638 + -0.363537 -0.843443 0.395531 + 0.998297 0.058318 0.001371 + -0.205226 -0.938535 -0.277552 + 0.938004 0.065366 0.340405 + 0.401395 0.870514 -0.284760 + -0.768490 0.639839 0.005440 + -0.884951 -0.196505 0.422194 + -0.307084 0.158233 0.938436 + -0.911014 -0.387023 -0.142365 + 0.176968 -0.903410 0.390553 + -0.958589 -0.261462 0.112895 + 0.891524 -0.225978 0.392580 + -0.925677 -0.200089 0.321071 + 0.920627 0.322043 0.220757 + -0.139805 -0.919717 0.366846 + -0.143562 0.899459 -0.412751 + -0.830989 0.510365 -0.221325 + -0.651757 0.318135 -0.688478 + -0.702978 -0.589867 -0.397339 + -0.823157 0.338629 -0.455788 + 0.242093 -0.863499 0.442449 + 0.695606 -0.240698 0.676902 + 0.623273 0.728681 0.283820 + -0.240030 0.829110 -0.504938 + 0.078956 0.930559 -0.357529 + -0.489680 0.368492 -0.790207 + -0.555883 -0.672452 -0.488674 + 0.086203 -0.902895 0.421130 + 0.520443 -0.236448 0.820507 + 0.594233 0.654333 0.467691 + 0.538405 0.522075 0.661482 + 0.232357 0.941381 -0.244565 + -0.303983 0.347675 -0.886971 + -0.482654 -0.580055 -0.656188 + -0.069911 -0.884923 0.460461 + 0.316282 -0.303290 0.898878 + 0.007912 -0.633992 0.773299 + 0.393829 0.443390 0.805173 + 0.354056 0.934403 -0.039182 + -0.109564 0.335041 -0.935811 + -0.284837 -0.940651 -0.184511 + -0.410478 -0.651010 -0.638509 + -0.271496 -0.754403 0.597634 + 0.018470 -0.238278 0.971021 + -0.042243 -0.023337 -0.998835 + 0.283150 0.409138 0.867429 + 0.399481 0.915982 -0.037303 + 0.084611 0.137838 -0.986834 + -0.320970 -0.806182 -0.497040 + -0.354884 -0.784465 0.508598 + -0.150893 -0.272654 0.950206 + 0.385421 0.914613 -0.122201 + 0.158554 0.394645 0.905050 + 0.359710 0.933033 -0.007679 + 0.239369 0.165285 -0.956757 + -0.008405 -0.376511 -0.926374 + -0.393427 -0.913044 -0.107544 + -0.263756 -0.252521 0.930949 + 0.014760 0.393229 0.919322 + -0.159067 0.356093 0.920813 + 0.371374 0.928039 -0.028722 + 0.361853 0.106972 -0.926077 + 0.164497 -0.331002 -0.929182 + -0.340850 -0.935106 -0.096942 + -0.399367 -0.220347 0.889918 + -0.578983 -0.081339 0.811272 + -0.294419 0.467726 0.833397 + 0.515276 0.773141 -0.369788 + 0.533405 0.114457 -0.838080 + 0.314141 -0.439524 -0.841507 + -0.367743 -0.927920 -0.061067 + -0.554283 -0.831082 0.045527 + -0.696218 0.036244 0.716914 + 0.105975 0.943115 0.315125 + 0.702454 0.133130 -0.699167 + 0.394715 -0.519652 -0.757734 + 0.651731 -0.755933 -0.061748 + -0.262649 -0.506553 0.821231 + -0.334392 0.127677 0.933745 + -0.083378 0.574337 0.814362 + 0.771756 0.350778 0.530422 + 0.899968 -0.032650 -0.434731 + 0.744833 0.485019 0.458236 + -0.066113 -0.598168 0.798639 + 0.695769 -0.644884 -0.316277 + 0.127167 0.856840 0.499653 + -0.279504 0.347338 0.895117 + 0.620044 0.142302 -0.771554 + 0.674228 0.477278 -0.563580 + 0.825396 -0.056599 -0.561710 + -0.554699 0.126141 0.822434 + -0.539210 -0.842170 0.001252 + 0.308857 -0.454844 -0.835299 + -0.033152 0.746614 0.664432 + 0.208685 -0.426854 -0.879913 + 0.516302 0.326270 -0.791821 + 0.518106 0.838865 -0.166950 + -0.070184 0.502142 0.861932 + -0.448991 0.024028 0.893213 + -0.442426 -0.892304 -0.089734 + -0.414986 -0.907529 0.064631 + 0.036765 -0.399894 -0.915824 + 0.372725 0.375210 -0.848701 + 0.352322 0.863877 0.359980 + -0.050289 0.308754 0.949812 + -0.288627 -0.077164 0.954327 + -0.088708 -0.087139 0.992239 + -0.373059 -0.880725 0.291805 + -0.121050 -0.406325 -0.905675 + 0.273700 0.462294 -0.843429 + 0.369016 0.839952 0.397880 + 0.113662 0.309068 0.944224 + 0.180109 0.245336 0.952560 + 0.019615 -0.083631 0.996304 + -0.387940 -0.896133 0.215518 + -0.228031 -0.404334 -0.885729 + 0.149638 0.425710 -0.892401 + 0.431004 0.891617 0.138760 + 0.401531 0.907016 0.126863 + 0.246040 0.250860 0.936234 + 0.084340 -0.123909 0.988703 + -0.272927 -0.753142 0.598572 + -0.372838 -0.726977 -0.576625 + 0.046216 0.338271 -0.939913 + -0.060675 0.363128 -0.929762 + 0.355751 0.934139 -0.028733 + 0.383605 0.432986 0.815702 + 0.137315 -0.213983 0.967138 + -0.142841 -0.738801 0.658612 + -0.362047 -0.596608 -0.716227 + -0.398814 -0.360378 -0.843253 + -0.269986 0.248440 -0.930261 + 0.135923 0.931360 -0.337778 + 0.470485 0.486069 0.736464 + 0.267168 -0.351017 0.897446 + -0.035635 -0.837932 0.544610 + -0.514645 -0.049831 -0.855954 + 0.011717 -0.934882 0.354764 + -0.477131 0.227784 -0.848800 + 0.083916 0.972751 -0.216131 + 0.582178 0.407542 0.703546 + 0.439206 -0.364117 0.821290 + 0.047298 -0.981996 0.182887 + -0.688512 -0.218142 -0.691639 + 0.675344 -0.238238 0.697963 + -0.585192 0.341889 -0.735297 + 0.001757 0.975454 -0.220198 + 0.664547 0.543879 0.512420 + 0.920202 -0.058353 0.387070 + 0.065753 -0.982362 0.175048 + -0.821430 -0.384698 -0.421022 + 0.566051 0.822599 -0.054007 + -0.854573 0.148820 -0.497552 + -0.478423 0.759256 -0.441183 + 0.751784 0.643058 -0.145934 + 0.986451 -0.115578 0.116432 + 0.177279 -0.918967 0.352239 + -0.716623 -0.686457 0.123400 + -0.505679 0.820411 -0.266861 + -0.993851 0.024629 -0.107953 + -0.275217 0.939514 -0.203887 + 0.844864 0.484389 -0.227096 + 0.975819 -0.200233 -0.087657 + 0.326978 -0.911448 0.249696 + -0.642156 -0.719950 0.263265 + -0.996070 -0.001707 0.088548 + -0.893207 -0.254778 0.370499 + -0.077689 0.989159 0.124611 + 0.609715 0.719812 -0.331842 + 0.802193 -0.527551 -0.279600 + 0.625801 -0.752658 -0.204643 + -0.467012 -0.837227 0.284518 + -0.473554 -0.737180 0.481988 + -0.581916 -0.233253 0.779081 + 0.065281 0.634355 0.770281 + 0.757477 0.561031 -0.333875 + 0.909212 -0.416081 0.014469 + 0.077248 -0.757525 0.648220 + -0.491636 -0.124247 0.861891 + 0.459573 0.841313 0.284578 + -0.760955 0.618981 0.194449 + 0.133222 -0.643775 0.753529 + 0.963406 -0.106358 0.246044 + -0.944049 0.329620 0.011034 + -0.712311 -0.508782 0.483481 + 0.890666 -0.122216 -0.437923 + 0.103866 0.823614 -0.557559 + 0.401817 -0.896641 0.185953 + -0.100348 0.875578 -0.472540 + -0.960155 0.272399 0.062460 + -0.686074 -0.606224 0.402238 + 0.517978 -0.845922 0.126942 + 0.893497 -0.018735 -0.448678 + 0.952955 0.124080 -0.276553 + -0.255297 0.780741 -0.570322 + -0.984758 0.129551 -0.116049 + -0.648944 -0.660933 0.376881 + 0.595572 -0.751300 0.284330 + 0.462271 -0.733817 0.497814 + 0.947533 0.203966 -0.246130 + -0.344521 0.717541 -0.605344 + -0.977163 0.079745 -0.196962 + -0.672968 -0.646012 0.360253 + -0.904318 -0.403621 0.138924 + 0.234166 -0.760557 0.605574 + 0.899841 0.396566 -0.181721 + -0.409964 0.688056 -0.598756 + -0.936055 0.095454 -0.338659 + -0.854090 -0.038748 -0.518680 + -0.872610 -0.486633 -0.041714 + 0.274141 -0.684324 0.675683 + 0.904487 0.425966 -0.021356 + -0.221320 0.667442 -0.711012 + -0.105356 0.616506 -0.780269 + -0.795489 -0.026837 -0.605373 + -0.848457 -0.518284 -0.107249 + 0.321658 -0.599145 0.733186 + 0.894603 0.421431 0.148595 + 0.860254 0.429372 0.274959 + -0.015920 0.440902 -0.897414 + -0.726682 -0.048860 -0.685234 + -0.758887 -0.631887 -0.157508 + 0.283665 -0.580033 0.763607 + 0.722072 -0.464163 0.512995 + 0.908578 0.377162 0.179539 + -0.292723 0.151369 -0.944140 + 0.694403 0.095985 -0.713156 + -0.171450 -0.328918 -0.928665 + -0.299893 -0.953869 0.014107 + 0.934567 0.345753 -0.083905 + 0.308349 -0.695272 0.649244 + 0.446374 -0.482859 -0.753390 + 0.086316 0.728628 0.679449 + 0.154003 0.519026 0.840771 + 0.214562 -0.177984 -0.960357 + 0.477173 0.865114 -0.154545 + -0.154149 -0.925727 -0.345352 + -0.194117 0.339197 0.920470 + -0.534831 -0.479521 0.695712 + -0.266201 -0.781652 -0.564054 + 0.077021 0.624715 0.777045 + -0.282241 -0.716576 -0.637855 + 0.170271 -0.008754 -0.985358 + 0.477142 0.878715 0.013958 + 0.119253 0.485401 0.866120 + -0.069334 0.306965 0.949192 + -0.475704 -0.518737 0.710365 + -0.362970 -0.622677 0.693199 + -0.298431 -0.679309 -0.670431 + 0.082180 0.064263 -0.994544 + 0.448863 0.883375 0.134799 + 0.140434 0.328044 0.934165 + 0.053575 0.280689 0.958302 + 0.180499 0.241697 0.953416 + -0.251081 -0.700891 0.667615 + -0.352991 -0.643113 -0.679561 + 0.066502 0.320097 -0.945048 + 0.415241 0.731599 0.540683 + 0.187468 0.202037 0.961268 + 0.336972 0.274730 0.900541 + 0.253265 0.117450 0.960241 + -0.163102 -0.739190 0.653449 + -0.431591 -0.605451 -0.668699 + 0.089510 0.552188 -0.828901 + 0.440285 0.664821 0.603459 + 0.501205 0.686650 0.526598 + 0.400523 0.236283 0.885298 + 0.356758 0.120614 0.926378 + -0.147855 -0.774061 0.615605 + -0.479441 -0.523078 -0.704646 + 0.036497 0.627531 -0.777736 + -0.065444 0.637261 -0.767864 + 0.518993 0.656163 0.547810 + 0.463078 0.208958 0.861334 + 0.426245 0.114578 0.897322 + -0.081907 -0.834615 0.544710 + -0.540125 -0.534422 -0.650122 + -0.592638 -0.603848 -0.533055 + -0.248275 0.653205 -0.715320 + 0.519423 0.689551 0.504697 + 0.589199 0.210518 0.780081 + 0.568127 0.131783 0.812321 + 0.092273 -0.800626 0.592016 + 0.326450 -0.743599 0.583516 + -0.656444 -0.635595 -0.406325 + -0.438224 0.655090 -0.615481 + 0.566335 0.742975 0.356726 + 0.709174 0.402404 0.578915 + 0.709125 0.147419 0.689500 + 0.857156 0.196470 0.476113 + 0.420934 -0.745835 0.516279 + -0.798035 -0.554087 -0.236911 + -0.559787 0.577719 -0.594036 + 0.251388 0.922934 -0.291541 + 0.799216 0.539200 0.265551 + 0.943377 0.322978 0.075670 + 0.979345 0.108581 0.170569 + 0.341495 -0.789771 0.509552 + -0.859625 -0.496178 0.121869 + -0.828366 0.415148 -0.376114 + 0.157421 0.892831 -0.421986 + 0.005872 0.884248 -0.466980 + 0.889348 0.358829 -0.283375 + 0.997835 -0.008944 -0.065163 + 0.304995 -0.775094 0.553360 + -0.695623 -0.599371 0.396060 + -0.985506 0.145277 -0.087596 + -0.984395 0.115908 0.132406 + -0.009099 0.924049 -0.382167 + 0.860328 0.346948 -0.373447 + 0.968066 -0.065015 -0.242117 + 0.278038 -0.886234 0.370518 + -0.511158 -0.743701 0.430843 + -0.482277 -0.741310 0.466765 + -0.860224 -0.103056 0.499394 + 0.052384 0.998558 0.011749 + 0.666718 0.448365 -0.595362 + 0.770428 -0.523328 -0.364099 + 0.215815 -0.968950 0.120665 + -0.228219 -0.114765 0.966822 + 0.422277 -0.736875 -0.527918 + -0.495638 0.097952 0.862988 + 0.574955 0.728345 0.372747 + 0.783946 0.133769 -0.606247 + 0.730241 -0.652034 -0.203963 + 0.382372 0.358949 0.851438 + 0.987333 -0.140342 -0.074005 + 0.890445 0.380609 -0.249488 + -0.478607 -0.043318 0.876960 + 0.155472 0.824643 0.543867 + -0.075888 -0.968343 0.237809 + 0.091258 -0.765258 -0.637223 + 0.887332 0.386725 -0.251171 + 0.182698 -0.721399 -0.667986 + -0.852522 -0.176425 0.492017 + 0.115651 0.788010 0.604703 + -0.822265 -0.297492 0.485159 + 0.834951 0.350628 -0.424166 + 0.067228 -0.754652 -0.652672 + -0.706828 -0.425636 0.565003 + 0.095676 0.711480 0.696163 + 0.678143 0.455001 -0.577145 + -0.131376 -0.672933 -0.727943 + -0.715839 -0.375308 0.588828 + 0.143993 0.700248 0.699228 + 0.516655 0.606562 -0.604276 + -0.308620 -0.564281 -0.765729 + -0.772442 -0.249574 0.583992 + 0.222666 0.707872 0.670327 + 0.402554 0.715660 -0.570772 + -0.371274 -0.578111 -0.726598 + -0.600959 -0.454326 0.657599 + 0.384553 0.650087 0.655367 + 0.277553 0.771037 -0.573120 + -0.458030 -0.484638 -0.745208 + -0.414146 -0.769341 0.486413 + 0.325880 0.519950 0.789591 + 0.186734 0.837117 -0.514164 + -0.549718 -0.362963 -0.752375 + -0.345648 -0.885193 0.311385 + 0.367069 0.199681 0.908509 + 0.187987 0.893588 -0.407629 + -0.618246 -0.291333 -0.729998 + -0.351559 -0.899257 0.260277 + 0.592255 -0.020292 0.805495 + 0.176610 0.854560 -0.488402 + -0.661231 -0.280282 -0.695856 + -0.197979 -0.948596 0.246921 + 0.767266 0.000495 0.641328 + -0.188851 0.926159 -0.326442 + -0.657305 -0.451184 -0.603642 + -0.146034 -0.964878 0.218367 + 0.777848 -0.001234 0.628451 + -0.247142 0.959021 0.138559 + -0.886227 -0.457773 0.071029 + 0.071000 -0.995962 0.054947 + 0.928134 -0.370541 -0.035591 + 0.076287 0.988265 0.132334 + -0.781740 0.010610 0.623514 + 0.043366 -0.998550 -0.031904 + 0.993842 -0.083013 0.073402 + 0.050273 0.968592 0.243522 + -0.957394 0.285955 -0.040327 + -0.143889 -0.920277 -0.363848 + 0.971926 -0.226009 0.065419 + 0.026994 0.496005 0.867900 + -0.903311 0.366300 0.223277 + -0.543597 -0.836812 0.065170 + 0.527272 -0.779469 0.338250 + -0.639887 -0.659866 0.393855 + -0.657546 -0.752853 -0.029070 + 0.638662 -0.567570 -0.519591 + -0.845391 0.180780 0.502625 + 0.778257 0.290629 0.556642 + 0.835132 -0.509128 0.208192 + -0.530593 -0.847475 -0.016024 + 0.647997 -0.428554 -0.629636 + -0.174374 0.783694 0.596169 + 0.868225 0.477817 -0.133704 + 0.787497 0.560751 -0.255747 + -0.423105 -0.895026 -0.141107 + 0.593027 -0.252799 -0.764468 + -0.272044 0.762874 0.586528 + 0.695097 0.595856 -0.402239 + -0.209814 0.696663 0.686031 + -0.220510 -0.941132 -0.256216 + 0.557311 0.027406 -0.829851 + 0.572712 0.635794 -0.517462 + -0.159987 0.679528 0.715993 + -0.249738 -0.946369 -0.204981 + 0.547915 0.124109 -0.827276 + 0.550846 0.667954 -0.500406 + -0.143056 0.687805 0.711659 + -0.434157 -0.855087 -0.283432 + 0.484786 0.157165 -0.860396 + 0.577728 0.703042 -0.414683 + 0.016860 0.509210 0.860477 + -0.703370 -0.589734 -0.396843 + 0.314126 0.427124 -0.847874 + 0.547398 0.782263 -0.297353 + 0.285468 0.266509 0.920587 + -0.732182 -0.556080 -0.393301 + 0.077865 0.630138 -0.772569 + 0.537266 0.823359 -0.182826 + 0.387880 0.073321 0.918789 + -0.787732 -0.545812 -0.285600 + -0.054252 0.643377 -0.763625 + 0.534446 0.827492 -0.172117 + 0.483657 -0.028065 0.874808 + -0.855267 -0.485561 -0.180965 + -0.126485 0.724083 -0.678015 + 0.625690 0.771199 -0.117318 + 0.625252 -0.213833 0.750557 + -0.868940 -0.488852 -0.077246 + -0.281350 0.787857 -0.547836 + 0.678908 0.723682 -0.123967 + 0.732319 -0.466031 0.496511 + -0.810572 -0.585128 -0.024460 + -0.442267 0.845231 -0.299975 + 0.601961 0.792431 -0.098467 + 0.854299 -0.490745 0.171296 + -0.497875 -0.865834 -0.049508 + -0.831778 0.472855 0.290780 + 0.309943 0.922652 0.229455 + 0.956216 -0.278390 -0.090277 + -0.270664 -0.948442 -0.164922 + -0.923165 0.048511 0.381329 + -0.262274 0.813320 0.519348 + 0.999220 -0.011927 -0.037653 + -0.006458 -0.860174 0.509959 + -0.799517 0.290529 0.525705 + -0.239981 0.637510 0.732114 + 0.584673 0.359584 0.727226 + 0.863965 0.193694 0.464808 + 0.873342 -0.360712 0.327355 + 0.874811 -0.162880 -0.456262 + 0.329018 0.476388 0.815353 + 0.923429 0.281034 -0.261342 + -0.529143 -0.267008 0.805428 + -0.604193 -0.595099 0.529913 + -0.275252 -0.959566 -0.058901 + 0.766381 -0.196706 -0.611528 + -0.268952 -0.960651 -0.069388 + -0.748318 0.408872 0.522346 + 0.379939 0.920129 0.094918 + 0.841399 0.257028 -0.475378 + -0.925654 -0.206624 0.316973 + -0.827305 0.398313 0.396123 + -0.822550 -0.131549 0.553269 + 0.650389 -0.148352 -0.744974 + -0.211234 -0.975089 -0.067687 + -0.716682 -0.229462 0.658570 + 0.309775 0.942687 0.124021 + 0.703054 0.296179 -0.646524 + -0.719087 0.282626 0.634851 + -0.608676 0.153765 0.778377 + 0.548167 -0.042478 -0.835290 + -0.109304 -0.988517 -0.104344 + -0.579366 -0.364202 0.729172 + -0.475525 0.105924 0.873302 + 0.256139 0.958905 0.122042 + 0.574003 0.389550 -0.720258 + 0.158180 0.969941 0.184916 + 0.374511 0.069274 -0.924631 + -0.009703 -0.774854 -0.632066 + -0.429226 -0.524691 0.735163 + -0.328857 0.051942 0.942950 + 0.127977 0.957843 0.257214 + 0.427380 0.592882 -0.682523 + 0.105314 0.195589 -0.975015 + -0.080163 -0.283659 -0.955569 + -0.316184 -0.872999 0.371350 + -0.049248 0.010098 0.998736 + 0.260464 0.948751 0.178968 + 0.253696 0.695144 -0.672616 + -0.117034 0.301250 -0.946336 + -0.226506 0.060203 -0.972147 + -0.378484 -0.914716 -0.141581 + 0.101350 -0.195629 0.975427 + 0.345141 0.908193 0.236777 + 0.104954 0.719627 -0.686383 + -0.286901 0.317225 -0.903911 + -0.394199 0.107973 -0.912660 + -0.485545 -0.863843 -0.134244 + 0.279836 -0.254588 0.925676 + 0.473591 0.827936 0.300388 + 0.006072 0.739929 -0.672657 + -0.451212 0.281963 -0.846702 + -0.535913 0.151115 -0.830640 + -0.579320 -0.807417 -0.111651 + 0.467702 -0.233360 0.852524 + 0.568195 0.808229 0.154666 + -0.016395 0.773921 -0.633070 + -0.478113 0.475705 -0.738318 + -0.570236 0.329879 -0.752337 + -0.581917 -0.808547 -0.087320 + 0.634234 -0.282617 0.719635 + 0.590522 0.807021 0.001503 + -0.132290 0.763563 -0.632038 + -0.692622 0.491407 -0.528010 + -0.878583 -0.002793 -0.477581 + -0.145714 -0.951835 0.269773 + 0.735718 -0.438937 0.515804 + 0.702098 0.711412 0.030837 + -0.221852 0.845708 -0.485344 + -0.797682 0.556637 -0.232074 + -0.916073 -0.394108 0.074092 + 0.110551 -0.965707 0.234924 + 0.787611 -0.586725 0.188209 + 0.778270 0.622985 -0.078643 + -0.257447 0.924418 -0.281376 + -0.660346 0.726936 0.188436 + -0.994487 -0.063782 0.083234 + 0.061392 -0.998084 -0.007692 + 0.880806 -0.412086 -0.233164 + 0.716277 0.689269 -0.108881 + -0.281981 0.952412 0.115751 + -0.686824 0.508297 0.519525 + -0.866928 -0.450350 0.213590 + 0.015419 -0.898944 -0.437793 + 0.828915 -0.156246 -0.537110 + 0.562237 0.826911 0.010370 + -0.350935 0.829524 0.434437 + -0.355081 0.558806 0.749435 + -0.444423 0.050112 0.894414 + -0.153326 -0.709658 0.687661 + 0.900324 -0.238981 -0.363736 + 0.502537 0.668522 0.548210 + -0.169972 0.522957 0.835240 + 0.928416 0.063210 0.366126 + 0.918889 -0.392221 0.042498 + 0.714847 -0.255766 -0.650828 + 0.701357 0.655650 0.279681 + 0.818530 0.338769 -0.463944 + -0.102574 0.317184 0.942801 + -0.353540 -0.226206 0.907656 + -0.474677 -0.671722 0.568745 + -0.324480 -0.935308 -0.141107 + 0.587742 -0.309175 -0.747643 + -0.257518 -0.956255 -0.138786 + 0.461682 0.885912 0.044820 + 0.740389 0.260414 -0.619684 + -0.669059 0.423953 0.610430 + -0.836449 -0.261468 0.481651 + -0.731818 -0.258872 0.630419 + 0.398751 -0.355280 -0.845443 + -0.255651 -0.959170 -0.120979 + -0.587046 -0.348524 0.730690 + 0.365915 0.930645 -0.002456 + 0.578144 0.205621 -0.789601 + -0.592333 0.331037 0.734545 + -0.402850 0.350973 0.845298 + 0.204241 -0.337047 -0.919067 + -0.252055 -0.967260 0.029617 + -0.415097 -0.359088 0.835913 + -0.204746 0.422573 0.882899 + 0.338684 0.940740 -0.017383 + 0.376530 0.235913 -0.895863 + 0.260428 0.962648 -0.074069 + -0.016168 -0.359214 -0.933115 + -0.254919 -0.966571 0.027517 + -0.205194 -0.324277 0.923439 + 0.042492 0.553960 0.831458 + 0.269529 0.904468 -0.330593 + 0.155554 0.180771 -0.971146 + -0.243789 -0.456075 -0.855899 + -0.159962 -0.930040 0.330814 + 0.029145 -0.286067 0.957766 + 0.200226 0.546852 0.812935 + 0.203465 0.902540 -0.379505 + -0.039703 0.248117 -0.967916 + -0.381532 -0.298755 -0.874745 + -0.233339 -0.955310 0.181480 + 0.231117 -0.267166 0.935525 + 0.385948 0.542220 0.746352 + 0.109059 0.853575 -0.509427 + -0.222766 0.188351 -0.956504 + -0.507623 -0.410500 -0.757502 + -0.184245 -0.968436 0.167886 + 0.388386 -0.264928 0.882593 + 0.522138 0.566649 0.637402 + 0.043224 0.882651 -0.468037 + -0.391971 0.173657 -0.903439 + -0.631684 -0.249328 -0.734037 + -0.235397 -0.965877 0.108027 + 0.489080 -0.296550 0.820280 + 0.577443 0.700767 0.418909 + -0.088280 0.826758 -0.555588 + -0.518593 0.227043 -0.824325 + -0.752643 -0.265273 -0.602627 + -0.179441 -0.978850 0.098251 + 0.637038 -0.304743 0.708035 + 0.588449 0.725402 0.357100 + -0.180586 0.868909 -0.460854 + -0.655290 0.247813 -0.713571 + -0.909179 -0.212027 -0.358384 + -0.251731 -0.961661 0.108812 + 0.825482 -0.324146 0.462070 + 0.582225 0.801993 0.133498 + -0.165159 0.926297 -0.338669 + -0.715408 0.527712 -0.457943 + -0.968823 -0.246884 0.020747 + -0.195194 -0.946441 0.257194 + 0.873013 -0.458070 0.167393 + 0.701031 0.707969 -0.085642 + -0.204802 0.941313 -0.268302 + -0.790631 0.576362 -0.206666 + -0.952015 0.148770 0.267459 + -0.491170 -0.798556 0.347937 + 0.759588 -0.647271 -0.063768 + 0.858791 0.434212 -0.271916 + -0.160556 0.966638 -0.199583 + -0.692130 0.720962 0.034215 + -0.866447 0.154826 0.474655 + -0.593416 -0.763726 0.254127 + 0.557936 -0.715528 -0.420389 + 0.799638 0.334669 -0.498573 + 0.306685 0.929234 -0.206080 + -0.531160 0.806364 0.260089 + -0.348177 0.372065 0.860430 + -0.550175 -0.339822 0.762777 + 0.617075 -0.267627 0.739996 + 0.850010 0.445073 -0.281768 + 0.389110 0.845464 0.365764 + -0.064844 0.706086 0.705151 + 0.975981 0.149389 0.158566 + 0.901866 -0.431095 0.028203 + 0.599771 -0.405480 -0.689827 + 0.729196 0.674506 0.115390 + 0.717367 0.251706 -0.649637 + 0.365544 0.583428 0.725251 + -0.085059 0.280842 0.955977 + -0.368578 -0.382607 0.847209 + -0.417065 -0.902204 0.109929 + 0.474409 -0.228010 -0.850263 + -0.311936 -0.950017 0.012755 + 0.600901 0.657446 -0.454624 + 0.541180 0.348606 -0.765244 + -0.318536 0.785619 0.530413 + -0.730599 0.103096 0.674979 + -0.600207 -0.024015 0.799484 + 0.325755 -0.224485 -0.918417 + -0.291579 -0.956423 -0.015385 + -0.448608 -0.065890 0.891296 + 0.368873 0.881230 -0.295577 + 0.468956 0.376484 -0.798962 + -0.371558 0.509363 0.776205 + -0.159246 0.594155 0.788429 + 0.109524 -0.355837 -0.928108 + -0.401639 -0.913273 0.067962 + -0.308345 -0.077352 0.948124 + -0.024392 0.523683 0.851564 + 0.276982 0.960664 -0.020155 + 0.392019 0.387237 -0.834487 + 0.371897 0.928258 -0.005484 + -0.111099 -0.408030 -0.906183 + -0.390361 -0.891400 0.230268 + -0.119256 -0.098109 0.988004 + 0.166445 0.478362 0.862245 + 0.392112 0.911293 0.125671 + 0.273402 0.481503 -0.832710 + -0.265774 -0.318866 -0.909774 + -0.340609 -0.902352 0.264096 + 0.043197 -0.199402 0.978965 + 0.374553 0.545709 0.749608 + 0.412878 0.910699 -0.012620 + 0.131352 0.499699 -0.856182 + -0.359134 -0.208259 -0.909753 + -0.270753 -0.945392 0.181459 + 0.187711 -0.274961 0.942953 + 0.438647 0.603055 0.666269 + 0.299975 0.924780 -0.234086 + -0.049869 0.545130 -0.836867 + -0.491625 -0.136384 -0.860061 + -0.269364 -0.960922 0.063814 + 0.321607 -0.346803 0.881077 + 0.516935 0.598289 0.612232 + 0.137618 0.898245 -0.417392 + -0.218814 0.511454 -0.830985 + -0.611956 -0.140604 -0.778293 + -0.304061 -0.949865 0.072828 + 0.397001 -0.410379 0.820963 + 0.599103 0.490389 0.632925 + 0.100116 0.922941 -0.371694 + -0.350619 0.523480 -0.776553 + -0.732548 -0.203858 -0.649474 + -0.098559 -0.984593 0.144442 + 0.545212 -0.458942 0.701510 + 0.715761 0.418937 0.558729 + 0.133556 0.973210 -0.187151 + -0.493003 0.529087 -0.690662 + -0.922538 -0.182302 -0.340132 + 0.009646 -0.990012 0.140649 + 0.736471 -0.493929 0.462216 + 0.897692 -0.005069 0.440595 + 0.238178 0.963652 -0.121017 + -0.713952 0.557550 -0.423569 + -0.931448 -0.345783 0.113309 + -0.206716 -0.907751 0.365043 + 0.913908 -0.383334 0.133519 + 0.962890 -0.226010 0.147523 + 0.586040 0.807741 -0.064124 + -0.754338 0.619436 -0.217424 + -0.832582 -0.393819 0.389504 + -0.103538 -0.953648 0.282551 + 0.831424 -0.552319 -0.060641 + 0.978958 -0.135340 -0.152724 + 0.587450 0.783966 -0.200746 + -0.794035 0.604998 0.059043 + -0.851408 -0.291610 0.435968 + -0.320093 -0.920170 0.225450 + 0.778049 -0.428368 -0.459501 + 0.882553 0.081793 -0.463045 + 0.382700 0.922157 -0.056289 + -0.895935 0.334323 0.292453 + -0.439830 -0.081965 0.894333 + -0.197315 -0.863256 0.464602 + 0.924311 0.103913 0.367221 + 0.843244 0.502341 0.191294 + 0.557505 0.829953 -0.019151 + -0.425667 0.644379 0.635282 + + + + + 0.069284 -0.178984 0.100519 + 0.066834 -0.189495 0.098513 + 0.064125 -0.188934 0.096646 + 0.056488 -0.167784 0.111902 + 0.056826 -0.169923 0.113062 + 0.067697 -0.174806 0.098000 + 0.054096 -0.181043 0.111210 + 0.062879 -0.183297 0.095718 + 0.064949 -0.174241 0.097163 + 0.052025 -0.182178 0.110512 + 0.055496 -0.166850 0.111929 + 0.040597 -0.162663 0.122599 + 0.042482 -0.161015 0.122620 + 0.041829 -0.163513 0.123933 + 0.039939 -0.173864 0.123011 + 0.051044 -0.177577 0.109169 + 0.039098 -0.174287 0.122841 + 0.038669 -0.169742 0.120857 + 0.022623 -0.163921 0.128174 + 0.024174 -0.155907 0.128681 + 0.026435 -0.153838 0.129719 + 0.025478 -0.155129 0.130443 + 0.023973 -0.165515 0.131025 + 0.022942 -0.166380 0.130279 + 0.005300 -0.159207 0.134232 + 0.006048 -0.156546 0.131857 + 0.007904 -0.147568 0.132874 + 0.009580 -0.146449 0.133970 + 0.008075 -0.147770 0.135434 + 0.006378 -0.157816 0.134964 + -0.011628 -0.150182 0.136068 + -0.011898 -0.150358 0.136564 + -0.010494 -0.148895 0.133899 + -0.009286 -0.140171 0.134560 + -0.007784 -0.139277 0.135957 + -0.009954 -0.141554 0.137351 + -0.027660 -0.133333 0.136996 + -0.029399 -0.141963 0.134709 + -0.029467 -0.142132 0.134981 + -0.026869 -0.140249 0.132549 + -0.026087 -0.131790 0.133559 + -0.024759 -0.131161 0.134911 + -0.042013 -0.124070 0.132155 + -0.044838 -0.124670 0.134053 + -0.047103 -0.134246 0.131147 + -0.046756 -0.134215 0.130790 + -0.043938 -0.133832 0.129471 + -0.043192 -0.124769 0.130429 + -0.059344 -0.117184 0.124848 + -0.058671 -0.116577 0.127107 + -0.061808 -0.117520 0.127244 + -0.064375 -0.127192 0.125008 + -0.063896 -0.127948 0.123990 + -0.059600 -0.125993 0.123463 + -0.074321 -0.118838 0.114520 + -0.074420 -0.109338 0.116544 + -0.073583 -0.110582 0.117221 + -0.077421 -0.112329 0.117199 + -0.080792 -0.122957 0.114947 + -0.080204 -0.123032 0.114400 + -0.094334 -0.119006 0.101427 + -0.087530 -0.113974 0.102215 + -0.087754 -0.104387 0.103920 + -0.087372 -0.106288 0.104815 + -0.091358 -0.107295 0.104632 + -0.094374 -0.118516 0.101221 + -0.104915 -0.112109 0.085700 + -0.102602 -0.113795 0.084146 + -0.097537 -0.107289 0.087793 + -0.097563 -0.100399 0.088338 + -0.097899 -0.100163 0.091693 + -0.103022 -0.104681 0.089078 + -0.105067 -0.095275 0.072036 + -0.106699 -0.100838 0.069612 + -0.103358 -0.103347 0.067387 + -0.099626 -0.101439 0.069912 + -0.099980 -0.093173 0.070912 + -0.099974 -0.092808 0.073697 + -0.098865 -0.086002 0.055669 + -0.103383 -0.088129 0.053258 + -0.104407 -0.094416 0.050947 + -0.102712 -0.095172 0.049223 + -0.098000 -0.094664 0.052197 + -0.098089 -0.088480 0.052347 + -0.092607 -0.087562 0.034072 + -0.095015 -0.082889 0.037561 + -0.098090 -0.087684 0.034711 + -0.098875 -0.089318 0.033976 + -0.093280 -0.094145 0.038083 + -0.091738 -0.092976 0.034645 + -0.078938 -0.094298 0.022398 + -0.079365 -0.090099 0.021270 + -0.087731 -0.084023 0.020326 + -0.086218 -0.089722 0.020275 + -0.086865 -0.093166 0.018441 + -0.083614 -0.098966 0.021266 + 0.071033 -0.208437 0.111264 + 0.068068 -0.218286 0.109170 + 0.063924 -0.218738 0.107911 + 0.057166 -0.199629 0.121210 + 0.069817 -0.205296 0.108786 + 0.056202 -0.197586 0.120677 + 0.054309 -0.210550 0.118436 + 0.063864 -0.212511 0.104511 + 0.052658 -0.212054 0.117910 + 0.042655 -0.190351 0.129547 + 0.040900 -0.188866 0.129159 + 0.065463 -0.203444 0.111420 + 0.052367 -0.196394 0.121666 + 0.038231 -0.188538 0.129200 + 0.042030 -0.201235 0.128385 + 0.051842 -0.205454 0.116835 + 0.039468 -0.202114 0.128003 + 0.026096 -0.182071 0.134067 + 0.024055 -0.180041 0.133514 + 0.022750 -0.180181 0.133591 + 0.038600 -0.196231 0.125699 + 0.023608 -0.187461 0.131414 + 0.026719 -0.193042 0.134143 + 0.023711 -0.192860 0.133776 + 0.009474 -0.173166 0.136648 + 0.006692 -0.171492 0.136006 + 0.006298 -0.172541 0.135494 + 0.006827 -0.180748 0.134238 + 0.006102 -0.184795 0.136160 + 0.010075 -0.185742 0.136703 + -0.007584 -0.164723 0.136248 + -0.010462 -0.162485 0.135125 + -0.009624 -0.163694 0.135940 + -0.009422 -0.172365 0.133807 + -0.010891 -0.177439 0.135964 + -0.007030 -0.179279 0.137209 + -0.024792 -0.156895 0.134345 + -0.028202 -0.154623 0.133431 + -0.026358 -0.156752 0.133864 + -0.026230 -0.165603 0.131974 + -0.028128 -0.169810 0.134914 + -0.023589 -0.171592 0.135790 + -0.042225 -0.149717 0.132106 + -0.045220 -0.145973 0.129815 + -0.042479 -0.148759 0.131034 + -0.041964 -0.157339 0.129219 + -0.045665 -0.162359 0.133084 + -0.039928 -0.163619 0.133878 + -0.059026 -0.142916 0.126704 + -0.063155 -0.140193 0.124785 + -0.058464 -0.142572 0.124885 + -0.059008 -0.152964 0.124228 + -0.062319 -0.154663 0.127603 + -0.056041 -0.156196 0.129298 + -0.075651 -0.138389 0.118471 + -0.079415 -0.135666 0.114857 + -0.073991 -0.138539 0.116024 + -0.073978 -0.146863 0.115564 + -0.078711 -0.151406 0.118253 + -0.071699 -0.149443 0.122681 + -0.090481 -0.134021 0.107100 + -0.094030 -0.131793 0.102146 + -0.088096 -0.135210 0.104585 + -0.087932 -0.142501 0.104266 + -0.092003 -0.147060 0.104766 + -0.086572 -0.146785 0.112093 + -0.103644 -0.134469 0.093788 + -0.104862 -0.126709 0.087385 + -0.099723 -0.128558 0.091805 + -0.096985 -0.135246 0.090231 + -0.101652 -0.143344 0.089507 + -0.099839 -0.142035 0.099960 + -0.108477 -0.128534 0.076688 + -0.106638 -0.120393 0.068449 + -0.102940 -0.122627 0.074356 + -0.101143 -0.130158 0.072558 + -0.104227 -0.134870 0.072263 + -0.106325 -0.138383 0.083216 + -0.108313 -0.122361 0.058264 + -0.103341 -0.113475 0.050005 + -0.102401 -0.117295 0.056338 + -0.099333 -0.123419 0.055021 + -0.103500 -0.126359 0.054953 + -0.105914 -0.131324 0.065885 + -0.105685 -0.118774 0.039137 + -0.100758 -0.109116 0.030752 + -0.097534 -0.114271 0.038369 + -0.094202 -0.120272 0.037211 + -0.098012 -0.120717 0.038696 + -0.104774 -0.124132 0.048500 + -0.099045 -0.112457 0.027961 + -0.096254 -0.114117 0.024439 + -0.099388 -0.118674 0.033602 + -0.086253 -0.111681 0.024306 + -0.085882 -0.112847 0.021105 + -0.084250 -0.117500 0.022039 + -0.086599 -0.120972 0.022683 + -0.095346 -0.136971 0.019098 + -0.104869 -0.142279 0.031056 + -0.096489 -0.135313 0.020872 + -0.081701 -0.136786 0.016103 + -0.096899 -0.144207 0.025649 + -0.084433 -0.143252 0.014914 + -0.103695 -0.148553 0.038585 + -0.107653 -0.146275 0.047230 + -0.096493 -0.131614 0.022042 + -0.080124 -0.138995 0.018095 + -0.099639 -0.150537 0.042926 + -0.094581 -0.144572 0.029130 + -0.091733 -0.143504 0.028298 + -0.101783 -0.160532 0.055823 + -0.104668 -0.156165 0.053284 + -0.108527 -0.153251 0.062750 + -0.101200 -0.136656 0.038237 + -0.093252 -0.139911 0.028222 + -0.100993 -0.157585 0.056616 + -0.098387 -0.148708 0.042704 + -0.099785 -0.145353 0.042752 + -0.100815 -0.166994 0.070573 + -0.102011 -0.171132 0.068556 + -0.105740 -0.166404 0.066536 + -0.106484 -0.160270 0.078155 + -0.105426 -0.145314 0.053106 + -0.103242 -0.159376 0.072997 + -0.101956 -0.152230 0.057928 + -0.095222 -0.166051 0.086848 + -0.094113 -0.173586 0.084965 + -0.094641 -0.178347 0.082611 + -0.100224 -0.175167 0.080119 + -0.095970 -0.166844 0.091257 + -0.105024 -0.154112 0.068551 + -0.100750 -0.163186 0.082398 + -0.088993 -0.168772 0.094899 + -0.084280 -0.173202 0.098783 + -0.082948 -0.179233 0.097890 + -0.084129 -0.182806 0.096328 + -0.090230 -0.180519 0.093869 + -0.083067 -0.170593 0.103807 + -0.068288 -0.174263 0.114699 + -0.074967 -0.172451 0.107375 + -0.070482 -0.178452 0.109709 + -0.068599 -0.184161 0.108415 + -0.070525 -0.188818 0.107218 + -0.076667 -0.185692 0.105175 + -0.061945 -0.191700 0.114744 + -0.052293 -0.181400 0.121827 + -0.058556 -0.178414 0.116796 + -0.054684 -0.184118 0.117881 + -0.052915 -0.190297 0.116453 + -0.055439 -0.194983 0.116230 + -0.039095 -0.202478 0.121728 + -0.045883 -0.198317 0.121692 + -0.035968 -0.189257 0.127470 + -0.041605 -0.186563 0.123301 + -0.038716 -0.192337 0.123130 + -0.036602 -0.197579 0.122200 + -0.020744 -0.206312 0.126755 + -0.022376 -0.209506 0.126920 + -0.029733 -0.206354 0.126947 + -0.019131 -0.197172 0.131495 + -0.024215 -0.194827 0.128664 + -0.021936 -0.199162 0.128300 + -0.004892 -0.206409 0.131742 + -0.002889 -0.212256 0.129641 + -0.005304 -0.217125 0.128649 + -0.012621 -0.213327 0.130988 + -0.002611 -0.206200 0.133662 + -0.006243 -0.203213 0.131244 + 0.011532 -0.212082 0.132998 + 0.012192 -0.214018 0.132295 + 0.013148 -0.221344 0.129095 + 0.011661 -0.224924 0.128655 + 0.004624 -0.220929 0.131602 + 0.013387 -0.216094 0.134191 + 0.029925 -0.224826 0.132146 + 0.028666 -0.221758 0.131263 + 0.028065 -0.223337 0.130341 + 0.028119 -0.231523 0.125869 + 0.027813 -0.233436 0.125565 + 0.021228 -0.229419 0.130770 + 0.036527 -0.238783 0.126814 + 0.045318 -0.234285 0.127916 + 0.045165 -0.231702 0.127749 + 0.043275 -0.232880 0.126688 + 0.043260 -0.240081 0.120437 + 0.042881 -0.242348 0.120381 + 0.058159 -0.248810 0.113031 + 0.051323 -0.247510 0.121106 + 0.060492 -0.242652 0.121706 + 0.061721 -0.239717 0.121476 + 0.058892 -0.240026 0.120573 + 0.058255 -0.246757 0.112863 + 0.044416 -0.269688 0.115689 + 0.041217 -0.268545 0.112586 + 0.050384 -0.262704 0.118290 + 0.035734 -0.261049 0.120933 + 0.030686 -0.267456 0.114907 + 0.050738 -0.265423 0.119137 + 0.042238 -0.265746 0.112720 + 0.046424 -0.262071 0.115947 + 0.029571 -0.265855 0.112296 + 0.032415 -0.258593 0.117958 + 0.034809 -0.259206 0.119576 + 0.015705 -0.250804 0.122098 + 0.016691 -0.253361 0.123451 + 0.013180 -0.260682 0.119037 + 0.029185 -0.262994 0.113747 + 0.010645 -0.259662 0.116530 + 0.011196 -0.256439 0.116835 + 0.014094 -0.251437 0.121364 + -0.002490 -0.243909 0.121026 + -0.001431 -0.242663 0.122201 + -0.000003 -0.245486 0.124226 + -0.002288 -0.252941 0.120775 + -0.005923 -0.251506 0.117268 + -0.004364 -0.249071 0.117885 + -0.019906 -0.240752 0.116679 + -0.017874 -0.234474 0.120939 + -0.018085 -0.233526 0.121059 + -0.016176 -0.236330 0.122885 + -0.018286 -0.244646 0.119458 + -0.022925 -0.243234 0.115954 + -0.039546 -0.235065 0.112228 + -0.035551 -0.232796 0.114277 + -0.034246 -0.226211 0.118810 + -0.034455 -0.224206 0.118514 + -0.032719 -0.227777 0.120701 + -0.034222 -0.236768 0.116447 + -0.049625 -0.228764 0.112401 + -0.055472 -0.226266 0.107823 + -0.050594 -0.224729 0.110123 + -0.050125 -0.218209 0.114476 + -0.050751 -0.215301 0.114315 + -0.048140 -0.218464 0.116530 + -0.063739 -0.209986 0.111217 + -0.064889 -0.221127 0.107138 + -0.070984 -0.219176 0.100604 + -0.065290 -0.217048 0.104530 + -0.065084 -0.210064 0.108613 + -0.066912 -0.207418 0.108502 + -0.080888 -0.199687 0.099394 + -0.078250 -0.202231 0.103473 + -0.078256 -0.213819 0.099030 + -0.084030 -0.210991 0.091572 + -0.078279 -0.209690 0.096457 + -0.078338 -0.202074 0.100264 + -0.089896 -0.195066 0.089851 + -0.092567 -0.192198 0.088409 + -0.090669 -0.195119 0.093253 + -0.089824 -0.206689 0.089102 + -0.094990 -0.204111 0.080490 + -0.089509 -0.203268 0.086569 + -0.098818 -0.196923 0.075289 + -0.099139 -0.188088 0.078106 + -0.103905 -0.185206 0.076911 + -0.101056 -0.187225 0.082173 + -0.099906 -0.200890 0.077563 + -0.101980 -0.196573 0.067724 + -0.101529 -0.189855 0.062499 + -0.102244 -0.186928 0.055476 + -0.102966 -0.181513 0.064982 + -0.105789 -0.177409 0.063236 + -0.107960 -0.181454 0.068595 + -0.105070 -0.192399 0.065870 + -0.102735 -0.177428 0.043125 + -0.100309 -0.181459 0.050639 + -0.106005 -0.182857 0.054525 + -0.102132 -0.174840 0.051630 + -0.104417 -0.169432 0.050337 + -0.107388 -0.173258 0.055673 + -0.104613 -0.173914 0.042845 + -0.104924 -0.168248 0.031047 + -0.097006 -0.173003 0.039164 + -0.106639 -0.166393 0.041839 + -0.099131 -0.166733 0.039415 + -0.101615 -0.161667 0.036869 + -0.106503 -0.165924 0.028881 + -0.095511 -0.164666 0.021176 + -0.089993 -0.167856 0.027157 + -0.095159 -0.155423 0.023921 + -0.091344 -0.161580 0.026846 + -0.094119 -0.160871 0.020369 + -0.080877 -0.166294 0.014949 + -0.078902 -0.161595 0.016018 + -0.081088 -0.158993 0.015670 + -0.084097 -0.216766 -0.084724 + -0.082082 -0.226568 -0.079163 + -0.076946 -0.223126 -0.091496 + -0.089891 -0.210457 -0.076276 + -0.086626 -0.220410 -0.071180 + -0.085556 -0.216686 -0.086733 + -0.092462 -0.211649 -0.078369 + -0.075633 -0.231937 -0.085950 + -0.080133 -0.232261 -0.089048 + -0.086844 -0.226091 -0.082014 + -0.069037 -0.229715 -0.096448 + -0.078219 -0.222990 -0.092959 + -0.092348 -0.204696 -0.065253 + -0.089656 -0.215110 -0.061273 + -0.094451 -0.206206 -0.067230 + -0.090794 -0.219609 -0.072581 + -0.086556 -0.221737 -0.084274 + -0.092131 -0.216056 -0.075904 + -0.094954 -0.209589 -0.066224 + -0.069287 -0.238834 -0.090305 + -0.071727 -0.237619 -0.094277 + -0.071974 -0.233169 -0.096696 + -0.079980 -0.227363 -0.091741 + -0.060155 -0.234774 -0.101526 + -0.070022 -0.228477 -0.098807 + -0.089262 -0.209420 -0.051119 + -0.092641 -0.199188 -0.053671 + -0.095541 -0.201191 -0.055818 + -0.092275 -0.214531 -0.061144 + -0.094866 -0.205075 -0.054451 + -0.092298 -0.208649 -0.050186 + -0.062041 -0.244624 -0.095208 + -0.063018 -0.243366 -0.097831 + -0.063483 -0.238150 -0.101644 + -0.061633 -0.234178 -0.103958 + -0.053356 -0.248774 -0.099227 + -0.051105 -0.240120 -0.105462 + -0.088876 -0.203542 -0.041093 + -0.091259 -0.193330 -0.042492 + -0.094422 -0.194746 -0.045092 + -0.095618 -0.198529 -0.044601 + -0.090449 -0.203705 -0.038921 + -0.054350 -0.248133 -0.102853 + -0.055338 -0.244672 -0.104373 + -0.052758 -0.239941 -0.107460 + -0.045780 -0.254844 -0.103648 + -0.045789 -0.255240 -0.101536 + -0.042031 -0.246413 -0.106466 + -0.087882 -0.196602 -0.029366 + -0.087518 -0.186934 -0.032454 + -0.090936 -0.188818 -0.034746 + -0.091915 -0.194204 -0.033464 + -0.046760 -0.250937 -0.105483 + -0.043512 -0.245737 -0.109078 + -0.037906 -0.256862 -0.105866 + -0.037017 -0.261199 -0.103596 + -0.037051 -0.260356 -0.102179 + -0.032626 -0.251988 -0.108111 + -0.079799 -0.193223 -0.021550 + -0.078811 -0.183952 -0.024976 + -0.083978 -0.184823 -0.025675 + -0.085858 -0.188950 -0.024940 + -0.034101 -0.251339 -0.110219 + -0.024483 -0.256647 -0.109922 + -0.028621 -0.262087 -0.106628 + -0.027699 -0.266824 -0.103687 + -0.028563 -0.265823 -0.102779 + -0.023043 -0.257398 -0.106875 + -0.072080 -0.192657 -0.012433 + -0.070039 -0.187538 -0.020158 + -0.074620 -0.183109 -0.019062 + -0.078967 -0.189104 -0.016173 + -0.017115 -0.264345 -0.107793 + -0.015391 -0.264136 -0.104051 + -0.019231 -0.267083 -0.106029 + -0.017475 -0.268773 -0.103797 + -0.019049 -0.268725 -0.100383 + -0.102735 -0.177428 -0.043125 + -0.097006 -0.173003 -0.039164 + -0.104494 -0.165680 -0.030669 + -0.105070 -0.192399 -0.065870 + -0.102244 -0.186928 -0.055476 + -0.106005 -0.182857 -0.054525 + -0.100309 -0.181459 -0.050639 + -0.089993 -0.167856 -0.027157 + -0.099131 -0.166733 -0.039415 + -0.091344 -0.161580 -0.026846 + -0.095511 -0.164666 -0.021176 + -0.105887 -0.172593 -0.043954 + -0.106639 -0.166393 -0.041839 + -0.095159 -0.155423 -0.023921 + -0.101615 -0.161667 -0.036869 + -0.094119 -0.160871 -0.020369 + -0.101056 -0.187225 -0.082173 + -0.099906 -0.200890 -0.077563 + -0.107960 -0.181454 -0.068595 + -0.100653 -0.194216 -0.068735 + -0.101529 -0.189855 -0.062499 + -0.107388 -0.173258 -0.055673 + -0.102132 -0.174840 -0.051630 + -0.080877 -0.166294 -0.014949 + -0.078902 -0.161595 -0.016018 + -0.081088 -0.158993 -0.015670 + -0.104417 -0.169432 -0.050337 + -0.103905 -0.185206 -0.076911 + -0.092567 -0.192198 -0.088409 + -0.090669 -0.195119 -0.093253 + -0.092408 -0.202057 -0.080982 + -0.089824 -0.206689 -0.089102 + -0.105789 -0.177409 -0.063236 + -0.098818 -0.196923 -0.075289 + -0.102966 -0.181513 -0.064982 + -0.089896 -0.195066 -0.089851 + -0.099139 -0.188088 -0.078106 + -0.078338 -0.202074 -0.100264 + -0.080888 -0.199687 -0.099394 + -0.078250 -0.202231 -0.103473 + -0.084030 -0.210991 -0.091572 + -0.089509 -0.203268 -0.086569 + -0.078256 -0.213819 -0.099030 + -0.078279 -0.209690 -0.096457 + -0.065290 -0.217048 -0.104530 + -0.065084 -0.210064 -0.108613 + -0.066912 -0.207418 -0.108502 + -0.063739 -0.209986 -0.111217 + -0.064889 -0.221127 -0.107138 + -0.070984 -0.219176 -0.100604 + -0.055472 -0.226266 -0.107823 + -0.050594 -0.224729 -0.110123 + -0.050125 -0.218209 -0.114476 + -0.050751 -0.215301 -0.114315 + -0.048140 -0.218464 -0.116530 + -0.049625 -0.228764 -0.112401 + -0.034222 -0.236768 -0.116447 + -0.039546 -0.235065 -0.112228 + -0.035551 -0.232796 -0.114277 + -0.034246 -0.226211 -0.118810 + -0.034455 -0.224206 -0.118514 + -0.032719 -0.227777 -0.120701 + -0.016176 -0.236330 -0.122885 + -0.018286 -0.244646 -0.119458 + -0.022925 -0.243234 -0.115954 + -0.019906 -0.240752 -0.116679 + -0.017874 -0.234474 -0.120939 + -0.018085 -0.233526 -0.121059 + -0.001431 -0.242663 -0.122201 + -0.000003 -0.245486 -0.124226 + -0.002288 -0.252941 -0.120775 + -0.005923 -0.251506 -0.117268 + -0.004364 -0.249071 -0.117885 + -0.002490 -0.243909 -0.121026 + 0.014094 -0.251437 -0.121364 + 0.015705 -0.250804 -0.122098 + 0.016691 -0.253361 -0.123451 + 0.013180 -0.260682 -0.119037 + 0.010645 -0.259662 -0.116530 + 0.011196 -0.256439 -0.116835 + 0.029185 -0.262994 -0.113747 + 0.032415 -0.258593 -0.117958 + 0.034809 -0.259206 -0.119576 + 0.035734 -0.261049 -0.120933 + 0.030686 -0.267456 -0.114907 + 0.029571 -0.265855 -0.112296 + 0.044923 -0.268815 -0.110095 + 0.043565 -0.265923 -0.111855 + 0.047216 -0.262721 -0.116493 + 0.050735 -0.262809 -0.117881 + 0.050738 -0.265423 -0.119137 + 0.045674 -0.270343 -0.113385 + -0.019231 -0.267083 0.106029 + -0.017475 -0.268773 0.103797 + -0.017115 -0.264345 0.107793 + -0.024483 -0.256647 0.109922 + -0.028621 -0.262087 0.106628 + -0.015391 -0.264136 0.104051 + -0.019049 -0.268725 0.100383 + -0.027699 -0.266824 0.103687 + -0.023043 -0.257398 0.106875 + -0.032626 -0.251988 0.108111 + -0.034101 -0.251339 0.110219 + -0.037906 -0.256862 0.105866 + -0.028563 -0.265823 0.102779 + -0.037017 -0.261199 0.103596 + -0.042031 -0.246413 0.106466 + -0.037051 -0.260356 0.102179 + -0.043512 -0.245737 0.109078 + -0.046760 -0.250937 0.105483 + -0.045780 -0.254844 0.103648 + -0.051105 -0.240120 0.105462 + -0.045789 -0.255240 0.101536 + -0.052758 -0.239941 0.107460 + -0.055338 -0.244672 0.104373 + -0.054350 -0.248133 0.102853 + -0.060155 -0.234774 0.101526 + -0.053356 -0.248774 0.099227 + -0.061633 -0.234178 0.103958 + -0.063483 -0.238150 0.101644 + -0.063018 -0.243366 0.097831 + -0.069037 -0.229715 0.096448 + -0.062041 -0.244624 0.095208 + -0.070022 -0.228477 0.098807 + -0.071974 -0.233169 0.096696 + -0.071727 -0.237619 0.094277 + -0.076946 -0.223126 0.091496 + -0.075633 -0.231937 0.085950 + -0.069287 -0.238834 0.090305 + -0.078219 -0.222990 0.092959 + -0.079980 -0.227363 0.091741 + -0.080133 -0.232261 0.089048 + -0.084097 -0.216766 0.084724 + -0.082082 -0.226568 0.079163 + -0.086844 -0.226091 0.082014 + -0.085556 -0.216686 0.086733 + -0.086556 -0.221737 0.084274 + -0.089891 -0.210457 0.076276 + -0.086626 -0.220410 0.071180 + -0.090794 -0.219609 0.072581 + -0.092131 -0.216056 0.075904 + -0.092462 -0.211649 0.078369 + -0.092348 -0.204696 0.065253 + -0.089656 -0.215110 0.061273 + -0.092275 -0.214531 0.061144 + -0.094954 -0.209589 0.066224 + -0.094451 -0.206206 0.067230 + -0.092641 -0.199188 0.053671 + -0.089262 -0.209420 0.051119 + -0.088876 -0.203542 0.041093 + -0.092298 -0.208649 0.050186 + -0.094866 -0.205075 0.054451 + -0.095541 -0.201191 0.055818 + -0.091259 -0.193330 0.042492 + -0.090449 -0.203705 0.038921 + -0.087882 -0.196602 0.029366 + -0.084598 -0.197910 0.032205 + -0.095618 -0.198529 0.044601 + -0.094422 -0.194746 0.045092 + -0.087518 -0.186934 0.032454 + -0.091915 -0.194204 0.033464 + -0.085858 -0.188950 0.024940 + -0.079799 -0.193223 0.021550 + -0.078213 -0.193783 0.024272 + -0.090936 -0.188818 0.034746 + -0.078811 -0.183952 0.024976 + -0.083978 -0.184823 0.025675 + -0.078967 -0.189104 0.016173 + -0.074620 -0.183109 0.019062 + -0.072080 -0.192657 0.012433 + -0.069337 -0.191592 0.018953 + -0.070039 -0.187538 0.020158 + -0.077289 -0.183867 0.022657 + -0.096263 -0.021381 -0.064556 + -0.098030 -0.022215 -0.049784 + -0.094178 -0.019481 -0.047195 + -0.090542 -0.032258 -0.080469 + -0.094295 -0.028300 -0.079766 + -0.094038 -0.026381 -0.064787 + -0.100504 -0.027467 -0.067414 + -0.099140 -0.026288 -0.049801 + -0.091078 -0.026514 -0.036177 + -0.090962 -0.021383 -0.037939 + -0.089224 -0.019740 -0.037799 + -0.090714 -0.023361 -0.048097 + -0.085320 -0.045080 -0.097782 + -0.081845 -0.037484 -0.094258 + -0.093834 -0.036941 -0.085017 + -0.085940 -0.035489 -0.094146 + -0.094925 -0.031645 -0.083868 + -0.094894 -0.031121 -0.068194 + -0.100961 -0.032039 -0.065964 + -0.087763 -0.030098 -0.035855 + -0.096508 -0.026965 -0.048189 + -0.079994 -0.035250 -0.019565 + -0.083311 -0.031671 -0.019964 + -0.083698 -0.027676 -0.022145 + -0.083381 -0.026762 -0.033524 + -0.078488 -0.022086 -0.023610 + -0.093554 -0.027719 -0.050703 + -0.077548 -0.052885 -0.107824 + -0.073622 -0.052664 -0.107881 + -0.089671 -0.044540 -0.096856 + -0.070981 -0.045845 -0.104333 + -0.097275 -0.036534 -0.082033 + -0.074194 -0.042342 -0.105669 + -0.085181 -0.038317 -0.097441 + -0.097324 -0.036363 -0.084464 + -0.086355 -0.029717 -0.034797 + -0.077735 -0.033679 -0.020041 + -0.073939 -0.029599 -0.020728 + -0.061096 -0.057972 -0.117773 + -0.063344 -0.059962 -0.116909 + -0.075554 -0.051338 -0.109249 + -0.060528 -0.060379 -0.115946 + -0.087694 -0.043911 -0.097913 + -0.057290 -0.051798 -0.112000 + -0.060476 -0.049162 -0.114542 + -0.072354 -0.044635 -0.108221 + -0.045365 -0.058612 -0.123869 + -0.045048 -0.063606 -0.123332 + -0.058805 -0.052107 -0.116639 + -0.047396 -0.066777 -0.121533 + -0.044456 -0.064085 -0.119368 + -0.042666 -0.057666 -0.117305 + -0.044831 -0.055115 -0.119908 + -0.028889 -0.061248 -0.123458 + -0.027128 -0.063730 -0.125948 + -0.028581 -0.069661 -0.126691 + -0.030760 -0.072582 -0.124732 + -0.028819 -0.069745 -0.121540 + -0.026952 -0.062514 -0.119839 + -0.010732 -0.065957 -0.118753 + -0.011915 -0.064417 -0.120853 + -0.010061 -0.066876 -0.124086 + -0.011556 -0.074962 -0.125947 + -0.013393 -0.077066 -0.125373 + -0.013093 -0.075885 -0.121748 + 0.002672 -0.079892 -0.117201 + 0.004844 -0.068473 -0.113901 + 0.004375 -0.068695 -0.116082 + 0.006118 -0.071568 -0.118583 + 0.004769 -0.080484 -0.121121 + 0.003650 -0.081577 -0.121923 + 0.019451 -0.084356 -0.113511 + 0.017457 -0.083014 -0.109231 + 0.019237 -0.072586 -0.106394 + 0.019583 -0.073173 -0.108293 + 0.021453 -0.075588 -0.110587 + 0.020636 -0.082527 -0.112828 + 0.033102 -0.087663 -0.100660 + 0.031325 -0.089929 -0.100621 + 0.030152 -0.087898 -0.098526 + 0.032139 -0.076469 -0.096108 + 0.032271 -0.077400 -0.096328 + 0.034029 -0.079628 -0.098353 + 0.041911 -0.085900 -0.083392 + 0.040957 -0.094632 -0.085308 + 0.039926 -0.096572 -0.085444 + 0.038253 -0.094200 -0.084349 + 0.039533 -0.082787 -0.082077 + 0.040448 -0.082704 -0.081222 + 0.043569 -0.088242 -0.063935 + 0.047314 -0.090069 -0.066376 + 0.048051 -0.098715 -0.068557 + 0.047071 -0.101594 -0.068780 + 0.042920 -0.099650 -0.068043 + 0.042655 -0.088009 -0.065751 + -0.058377 -0.209363 0.021539 + -0.071201 -0.216568 0.018716 + -0.072359 -0.212671 0.020982 + -0.059722 -0.206224 0.021176 + -0.060746 -0.216862 0.018551 + -0.061838 -0.212771 0.027827 + -0.063449 -0.208594 0.028104 + -0.071332 -0.220108 0.025610 + -0.066060 -0.220153 0.023037 + -0.072368 -0.216290 0.028380 + -0.065978 -0.215070 0.034075 + -0.068094 -0.212675 0.034324 + -0.074482 -0.219652 0.035660 + -0.073289 -0.223145 0.032721 + -0.068468 -0.222585 0.030352 + -0.067576 -0.219293 0.040729 + -0.071553 -0.217018 0.041188 + -0.074796 -0.224588 0.042276 + -0.074022 -0.227481 0.039205 + -0.071493 -0.225960 0.036809 + -0.068317 -0.224206 0.046843 + -0.071583 -0.222813 0.047460 + -0.073954 -0.229463 0.048870 + -0.073557 -0.231724 0.045934 + -0.071947 -0.230011 0.043705 + -0.071306 -0.228394 0.054151 + -0.068600 -0.228297 0.053699 + -0.072530 -0.234080 0.055565 + -0.073838 -0.236603 0.052144 + -0.072948 -0.235184 0.049509 + -0.069518 -0.239464 0.061039 + -0.069162 -0.233129 0.061296 + -0.067179 -0.233451 0.059573 + -0.071188 -0.241526 0.057801 + -0.071019 -0.240197 0.055336 + -0.068351 -0.246671 0.063119 + -0.065068 -0.243724 0.066585 + -0.065372 -0.239044 0.066576 + -0.065014 -0.238802 0.065086 + -0.068441 -0.245137 0.060942 + -0.064168 -0.250042 0.065421 + -0.064145 -0.251465 0.067877 + -0.060740 -0.248794 0.071526 + -0.061102 -0.244746 0.071699 + -0.061432 -0.243938 0.069720 + -0.057353 -0.250068 0.072725 + -0.059680 -0.254477 0.070035 + -0.058890 -0.254358 0.072899 + -0.057410 -0.252302 0.074242 + -0.056700 -0.252008 0.073598 + -0.015270 -0.001015 0.037887 + -0.004589 -0.007338 0.047685 + -0.000602 -0.012149 0.041464 + -0.020086 -0.002986 0.038333 + -0.012220 -0.003946 0.034011 + -0.022664 0.000358 0.042061 + -0.019125 0.001869 0.041248 + -0.008218 -0.002806 0.054250 + -0.006490 -0.011248 0.048988 + -0.003717 -0.015528 0.042447 + -0.017257 -0.006157 0.034664 + -0.009047 -0.006094 0.054980 + -0.012762 -0.001170 0.060810 + -0.026327 0.003705 0.044840 + -0.023520 0.004906 0.044055 + -0.011285 0.001601 0.061097 + -0.016811 0.006845 0.066079 + -0.017425 0.004490 0.065426 + -0.031192 0.006876 0.046985 + -0.027854 0.008188 0.046631 + -0.031860 0.011439 0.049558 + -0.023904 0.012729 0.068713 + -0.024039 0.010111 0.068207 + -0.034908 0.010411 0.049662 + -0.036180 0.015264 0.051786 + -0.034982 0.015662 0.052104 + -0.031904 0.018396 0.068404 + -0.032479 0.014830 0.068869 + -0.041007 0.019101 0.066727 + -0.040994 0.018498 0.053546 + -0.039280 0.019624 0.052729 + -0.040239 0.023348 0.066018 + -0.048619 0.027722 0.062745 + -0.048461 0.024097 0.063840 + -0.047424 0.020780 0.053852 + -0.044835 0.022842 0.051585 + -0.050261 0.024868 0.049158 + -0.056036 0.031885 0.058004 + -0.056026 0.028383 0.059952 + -0.052174 0.023409 0.051272 + -0.055647 0.026085 0.047031 + -0.052590 0.028232 0.045302 + -0.062291 0.036190 0.052455 + -0.063824 0.031495 0.055419 + -0.070251 0.033787 0.049803 + -0.058537 0.028135 0.042335 + -0.054984 0.029696 0.040438 + -0.070506 0.039350 0.048152 + -0.074281 0.037552 0.041572 + -0.075597 0.033301 0.043023 + -0.060108 0.029528 0.037283 + -0.057009 0.031198 0.035558 + -0.058453 0.030863 0.030237 + -0.065414 0.037731 0.038180 + -0.069552 0.035169 0.037376 + -0.060657 0.029453 0.031962 + -0.062048 0.027990 0.026835 + -0.058576 0.028437 0.025692 + -0.063454 0.036326 0.029955 + -0.065870 0.034382 0.030352 + -0.068682 0.031140 0.023463 + -0.065598 0.024910 0.023417 + -0.060032 0.025927 0.021103 + -0.065252 0.034142 0.021842 + 0.016543 -0.044262 0.055465 + 0.019689 -0.047500 0.042707 + 0.022632 -0.049129 0.043701 + 0.010304 -0.040159 0.066332 + 0.019055 -0.043917 0.055919 + 0.012508 -0.031930 0.059511 + 0.017773 -0.035538 0.050393 + 0.020802 -0.040417 0.040700 + 0.021402 -0.041687 0.040038 + 0.002692 -0.036421 0.076289 + 0.012481 -0.039403 0.066968 + 0.006469 -0.027898 0.067850 + 0.019048 -0.037033 0.051417 + 0.006572 -0.028423 0.070768 + 0.013396 -0.032600 0.061526 + -0.007119 -0.032939 0.084162 + 0.004453 -0.035148 0.076743 + -0.001645 -0.024470 0.074297 + -0.002663 -0.025178 0.077939 + -0.005904 -0.030970 0.083976 + -0.018135 -0.029834 0.090292 + -0.010634 -0.021311 0.079577 + -0.012665 -0.021747 0.083749 + -0.016813 -0.027009 0.090501 + -0.028478 -0.024602 0.095959 + -0.019979 -0.017123 0.083127 + -0.022593 -0.016173 0.087694 + -0.026993 -0.021431 0.097035 + -0.038642 -0.017932 0.099644 + -0.028797 -0.010777 0.083961 + -0.032511 -0.009330 0.088094 + -0.036609 -0.012708 0.099354 + -0.047700 -0.009195 0.095102 + -0.038138 -0.005493 0.082189 + -0.041693 -0.002847 0.085153 + -0.046146 -0.004479 0.094158 + -0.056604 -0.001536 0.088723 + -0.046605 0.000695 0.078588 + -0.050851 0.004132 0.080389 + -0.056136 0.002669 0.088296 + -0.064809 0.006094 0.081286 + -0.054304 0.006635 0.073215 + -0.058103 0.010405 0.073068 + -0.063806 0.010789 0.080191 + -0.070252 0.012513 0.070578 + -0.060438 0.011832 0.065061 + -0.062940 0.016071 0.062787 + -0.069589 0.017136 0.069180 + -0.074328 0.016912 0.058759 + -0.062814 0.015989 0.053640 + -0.066645 0.021726 0.052000 + -0.072758 0.022866 0.056854 + -0.074770 0.017135 0.045984 + -0.063650 0.017516 0.044729 + -0.068811 0.022525 0.041672 + -0.075774 0.023206 0.044362 + -0.070395 0.012557 0.034730 + -0.062735 0.016515 0.034033 + -0.066496 0.018209 0.033477 + -0.072361 0.018441 0.035957 + -0.068638 0.009038 0.023148 + -0.060960 0.013638 0.024149 + -0.062990 0.015419 0.028075 + -0.063610 0.012747 0.022675 + -0.068305 0.012472 0.024176 + 0.033126 -0.059166 0.067047 + 0.033149 -0.068016 0.069315 + 0.038888 -0.071721 0.053771 + 0.033140 -0.058270 0.065654 + 0.037845 -0.063051 0.051357 + 0.026449 -0.053406 0.078759 + 0.026498 -0.055290 0.081758 + 0.025321 -0.062274 0.082865 + 0.031073 -0.071668 0.069101 + 0.035802 -0.074709 0.052819 + 0.034267 -0.071832 0.053500 + 0.032232 -0.062954 0.051324 + 0.030034 -0.059428 0.066151 + 0.034754 -0.061673 0.050136 + 0.023736 -0.054654 0.079172 + 0.013627 -0.050734 0.089270 + 0.017244 -0.047488 0.089390 + 0.015772 -0.050064 0.092777 + 0.014765 -0.057356 0.094670 + 0.022839 -0.066532 0.082855 + 0.030325 -0.069176 0.069562 + 0.022619 -0.063792 0.083036 + 0.012403 -0.058512 0.094560 + 0.000327 -0.054284 0.104276 + 0.002070 -0.045792 0.096976 + 0.005451 -0.043430 0.097852 + 0.003276 -0.045466 0.101663 + 0.002145 -0.054435 0.104739 + 0.012663 -0.060528 0.094722 + 0.000281 -0.056882 0.105113 + -0.013497 -0.052568 0.112880 + -0.013296 -0.051538 0.112054 + -0.010833 -0.042998 0.102606 + -0.007897 -0.040595 0.103851 + -0.010453 -0.041767 0.108858 + -0.011323 -0.050081 0.112563 + -0.025457 -0.043299 0.115850 + -0.028092 -0.046333 0.115669 + -0.027959 -0.047159 0.114650 + -0.024110 -0.038404 0.105642 + -0.021414 -0.036682 0.108538 + -0.024958 -0.037091 0.112644 + -0.039404 -0.031698 0.110199 + -0.040484 -0.038468 0.113609 + -0.042902 -0.040219 0.113310 + -0.042733 -0.041958 0.113621 + -0.037716 -0.034813 0.104933 + -0.035207 -0.031507 0.107481 + -0.048476 -0.026446 0.103166 + -0.053598 -0.026464 0.105672 + -0.054486 -0.032105 0.108765 + -0.056951 -0.033416 0.108433 + -0.056291 -0.036138 0.108107 + -0.050421 -0.028910 0.101427 + -0.061430 -0.021487 0.095179 + -0.060479 -0.020156 0.096681 + -0.065530 -0.019300 0.097618 + -0.067042 -0.025324 0.100931 + -0.068537 -0.025176 0.099760 + -0.068513 -0.028729 0.100885 + -0.079160 -0.021161 0.091380 + -0.071030 -0.014232 0.086391 + -0.070418 -0.012333 0.088250 + -0.075530 -0.012036 0.087036 + -0.077248 -0.016678 0.091353 + -0.080386 -0.018879 0.090070 + -0.087517 -0.013003 0.079690 + -0.088497 -0.011680 0.076951 + -0.078669 -0.008630 0.074610 + -0.078491 -0.006171 0.076491 + -0.084077 -0.004671 0.075183 + -0.086481 -0.009525 0.079507 + -0.091055 -0.005772 0.060948 + -0.087732 -0.006945 0.064334 + -0.089832 -0.003225 0.063985 + -0.082712 -0.004729 0.060271 + -0.082424 -0.000615 0.062394 + -0.086744 0.001313 0.060342 + -0.088160 0.001676 0.047545 + -0.088714 0.001436 0.045627 + -0.084671 -0.005009 0.048411 + -0.085521 0.004622 0.045807 + -0.080542 -0.002008 0.045398 + -0.081398 0.003836 0.047150 + -0.079364 0.001613 0.036080 + -0.081486 -0.000266 0.035688 + -0.083533 -0.005292 0.035063 + -0.078877 -0.007597 0.032999 + -0.075945 0.001637 0.032905 + -0.074694 -0.004646 0.031484 + -0.068663 -0.003962 0.020752 + -0.072964 -0.004120 0.022142 + -0.074310 -0.005655 0.021346 + -0.076753 -0.010562 0.020176 + -0.071532 -0.013405 0.019504 + -0.064422 -0.008905 0.022270 + 0.044078 -0.108320 0.095841 + 0.044582 -0.116347 0.097219 + 0.054766 -0.122197 0.083080 + 0.043317 -0.105529 0.093976 + 0.054363 -0.113610 0.081816 + 0.033697 -0.099914 0.107684 + 0.033932 -0.102796 0.109939 + 0.033793 -0.110688 0.110940 + 0.042419 -0.119559 0.096100 + 0.052022 -0.125715 0.081547 + 0.049762 -0.122114 0.081402 + 0.049590 -0.112289 0.079356 + 0.052867 -0.111481 0.080227 + 0.040925 -0.106408 0.092937 + 0.030916 -0.102259 0.106108 + 0.018939 -0.096016 0.116018 + 0.020909 -0.094096 0.117685 + 0.020425 -0.098135 0.120331 + 0.019686 -0.105471 0.120613 + 0.031811 -0.113198 0.109533 + 0.041742 -0.115806 0.095515 + 0.031107 -0.110043 0.107781 + 0.018280 -0.104900 0.117414 + 0.004126 -0.099199 0.124164 + 0.004945 -0.091063 0.122896 + 0.006223 -0.089217 0.124766 + 0.005504 -0.093437 0.128285 + 0.004401 -0.100805 0.128422 + 0.018444 -0.106940 0.119686 + 0.003046 -0.102319 0.127085 + -0.013421 -0.097198 0.130084 + -0.011083 -0.093911 0.127768 + -0.009983 -0.085689 0.126315 + -0.009162 -0.085163 0.129455 + -0.010949 -0.089296 0.131649 + -0.011903 -0.095159 0.131140 + -0.028960 -0.091734 0.130659 + -0.030031 -0.092008 0.128952 + -0.026966 -0.089684 0.127973 + -0.025514 -0.081311 0.126843 + -0.025282 -0.080767 0.129234 + -0.027088 -0.083422 0.131519 + -0.043088 -0.078015 0.127953 + -0.044501 -0.084349 0.126792 + -0.046331 -0.087202 0.124840 + -0.042316 -0.084945 0.124403 + -0.040735 -0.076729 0.123885 + -0.041315 -0.076210 0.127418 + -0.056268 -0.070876 0.121596 + -0.058621 -0.073171 0.121837 + -0.059797 -0.081083 0.120062 + -0.061431 -0.081447 0.117846 + -0.056009 -0.079084 0.117699 + -0.055301 -0.072198 0.118184 + -0.068400 -0.066054 0.110285 + -0.070346 -0.066095 0.113145 + -0.072726 -0.067847 0.112817 + -0.074019 -0.074189 0.112087 + -0.075928 -0.076613 0.108725 + -0.069081 -0.073458 0.108807 + -0.081784 -0.068828 0.098907 + -0.080556 -0.061305 0.100035 + -0.083422 -0.061281 0.103056 + -0.085754 -0.062753 0.101976 + -0.087172 -0.070190 0.100605 + -0.088414 -0.072066 0.096638 + -0.098039 -0.067723 0.081709 + -0.090955 -0.063813 0.085498 + -0.090722 -0.056813 0.087411 + -0.092574 -0.057427 0.088643 + -0.095835 -0.058422 0.087577 + -0.097736 -0.064974 0.086936 + -0.102325 -0.060898 0.069579 + -0.099190 -0.061496 0.064594 + -0.095522 -0.060475 0.068979 + -0.095216 -0.052632 0.071230 + -0.099457 -0.054210 0.072496 + -0.099414 -0.053633 0.070407 + -0.098326 -0.049092 0.052222 + -0.100160 -0.054016 0.052023 + -0.097723 -0.055288 0.046870 + -0.093666 -0.056543 0.051762 + -0.094072 -0.049211 0.054180 + -0.097224 -0.048389 0.055633 + -0.090047 -0.045552 0.039683 + -0.091618 -0.045412 0.038343 + -0.093966 -0.049338 0.037835 + -0.094112 -0.049114 0.034744 + -0.086080 -0.055077 0.036046 + -0.087978 -0.047479 0.038108 + -0.076569 -0.046303 0.025658 + -0.079422 -0.045391 0.025534 + -0.081194 -0.047340 0.023415 + -0.082335 -0.051201 0.023627 + -0.081551 -0.057621 0.019781 + -0.076556 -0.058213 0.022001 + 0.051218 -0.139038 0.109923 + 0.050896 -0.150652 0.108513 + 0.062904 -0.152962 0.093248 + 0.050706 -0.136379 0.108219 + 0.061842 -0.142579 0.094783 + 0.036651 -0.132278 0.117089 + 0.036348 -0.133785 0.118666 + 0.037085 -0.144492 0.120089 + 0.048375 -0.154488 0.104744 + 0.057569 -0.156741 0.088042 + 0.058183 -0.151984 0.089272 + 0.058867 -0.140089 0.092520 + 0.060406 -0.139559 0.093436 + 0.049790 -0.134708 0.107802 + 0.035063 -0.133645 0.116368 + 0.019845 -0.129881 0.123884 + 0.021954 -0.129163 0.125124 + 0.021049 -0.130813 0.127584 + 0.021024 -0.140853 0.128662 + 0.036458 -0.148190 0.117940 + 0.047577 -0.148630 0.104400 + 0.036994 -0.138984 0.114180 + 0.022028 -0.133598 0.122128 + 0.006856 -0.127401 0.128729 + 0.004778 -0.123973 0.129839 + 0.007049 -0.123603 0.131024 + 0.005313 -0.124637 0.133234 + 0.004647 -0.134324 0.134456 + 0.021005 -0.144041 0.126898 + 0.005333 -0.136597 0.132538 + -0.010509 -0.128409 0.136381 + -0.008847 -0.120175 0.131636 + -0.010864 -0.117533 0.132202 + -0.008099 -0.116712 0.133547 + -0.010503 -0.117057 0.136184 + -0.011993 -0.127042 0.137891 + -0.028675 -0.119463 0.136595 + -0.026861 -0.120877 0.136047 + -0.024675 -0.112836 0.130959 + -0.026062 -0.109292 0.131299 + -0.023226 -0.109116 0.133893 + -0.026470 -0.109132 0.135473 + -0.042523 -0.102216 0.131993 + -0.044941 -0.111035 0.133312 + -0.043211 -0.113928 0.131867 + -0.040541 -0.106212 0.127556 + -0.041206 -0.101702 0.127447 + -0.038359 -0.102071 0.130887 + -0.053800 -0.096978 0.126180 + -0.057971 -0.096254 0.125168 + -0.061349 -0.106033 0.126167 + -0.059520 -0.108654 0.125635 + -0.056706 -0.103113 0.121898 + -0.056332 -0.095525 0.121475 + -0.070760 -0.090737 0.112629 + -0.067718 -0.091017 0.117807 + -0.072917 -0.091150 0.116460 + -0.076559 -0.099733 0.116926 + -0.074652 -0.102772 0.116703 + -0.071429 -0.098134 0.113110 + -0.085003 -0.092106 0.102775 + -0.084154 -0.085325 0.102239 + -0.081383 -0.086059 0.108332 + -0.086633 -0.085669 0.105814 + -0.090594 -0.095298 0.104541 + -0.088271 -0.097200 0.105029 + -0.099868 -0.094497 0.089854 + -0.096748 -0.089454 0.089422 + -0.094254 -0.083594 0.087310 + -0.091966 -0.081787 0.095086 + -0.099082 -0.084671 0.092332 + -0.101974 -0.091375 0.089217 + -0.103853 -0.085540 0.070355 + -0.102470 -0.088122 0.072115 + -0.100100 -0.084440 0.071993 + -0.098762 -0.079377 0.069720 + -0.097659 -0.077864 0.078270 + -0.102511 -0.077680 0.075261 + -0.101504 -0.073042 0.056091 + -0.101768 -0.077851 0.051358 + -0.099713 -0.078608 0.055145 + -0.097008 -0.078426 0.053907 + -0.096785 -0.070974 0.052898 + -0.096852 -0.070939 0.060940 + -0.093893 -0.065318 0.043754 + -0.095455 -0.068335 0.040093 + -0.093605 -0.075398 0.039448 + -0.091864 -0.077172 0.038561 + -0.090443 -0.076967 0.036180 + -0.090248 -0.068124 0.035472 + -0.078966 -0.071987 0.023150 + -0.086419 -0.062773 0.027291 + -0.086676 -0.069942 0.022827 + -0.085687 -0.075494 0.020217 + -0.082341 -0.079324 0.022121 + -0.079830 -0.075688 0.021523 + -0.073622 -0.052664 0.107881 + -0.060528 -0.060379 0.115946 + -0.063344 -0.059962 0.116909 + -0.085320 -0.045080 0.097782 + -0.081845 -0.037484 0.094258 + -0.077548 -0.052885 0.107824 + -0.070981 -0.045845 0.104333 + -0.057290 -0.051798 0.112000 + -0.044456 -0.064085 0.119368 + -0.047396 -0.066777 0.121533 + -0.061096 -0.057972 0.117773 + -0.045048 -0.063606 0.123332 + -0.088683 -0.044225 0.097384 + -0.093834 -0.036941 0.085017 + -0.090542 -0.032258 0.080469 + -0.094295 -0.028300 0.079766 + -0.085940 -0.035489 0.094146 + -0.074194 -0.042342 0.105669 + -0.075554 -0.051338 0.109249 + -0.042666 -0.057666 0.117305 + -0.060476 -0.049162 0.114542 + -0.028819 -0.069745 0.121540 + -0.030760 -0.072582 0.124732 + -0.028581 -0.069661 0.126691 + -0.045365 -0.058612 0.123869 + -0.058805 -0.052107 0.116639 + -0.027128 -0.063730 0.125948 + -0.097324 -0.036363 0.084464 + -0.085181 -0.038317 0.097441 + -0.097275 -0.036534 0.082033 + -0.072354 -0.044635 0.108221 + -0.094894 -0.031121 0.068194 + -0.094038 -0.026381 0.064787 + -0.096263 -0.021381 0.064556 + -0.094925 -0.031645 0.083868 + -0.100504 -0.027467 0.067414 + -0.044831 -0.055115 0.119908 + -0.026952 -0.062514 0.119839 + -0.013093 -0.075885 0.121748 + -0.013393 -0.077066 0.125373 + -0.011556 -0.074962 0.125947 + -0.010061 -0.066876 0.124086 + -0.028889 -0.061248 0.123458 + -0.011915 -0.064417 0.120853 + -0.100961 -0.032039 0.065964 + -0.093554 -0.027719 0.050703 + -0.090714 -0.023361 0.048097 + -0.094316 -0.019263 0.047864 + -0.098030 -0.022215 0.049784 + -0.099140 -0.026288 0.049801 + -0.010732 -0.065957 0.118753 + 0.002672 -0.079892 0.117201 + 0.003650 -0.081577 0.121923 + 0.004769 -0.080484 0.121121 + 0.006118 -0.071568 0.118583 + 0.004375 -0.068695 0.116082 + 0.004844 -0.068473 0.113901 + -0.095041 -0.028079 0.049126 + -0.083381 -0.026762 0.033524 + -0.086355 -0.029717 0.034797 + -0.089224 -0.019740 0.037799 + -0.090962 -0.021383 0.037939 + -0.091078 -0.026514 0.036177 + 0.017457 -0.083014 0.109231 + 0.019451 -0.084356 0.113511 + 0.020636 -0.082527 0.112828 + 0.021453 -0.075588 0.110587 + 0.019583 -0.073173 0.108293 + 0.019237 -0.072586 0.106394 + -0.087763 -0.030098 0.035855 + -0.078488 -0.022086 0.023610 + -0.073939 -0.029599 0.020728 + -0.077735 -0.033679 0.020041 + -0.083698 -0.027676 0.022145 + -0.083311 -0.031671 0.019964 + -0.079994 -0.035250 0.019565 + 0.030152 -0.087898 0.098526 + 0.031325 -0.089929 0.100621 + 0.033102 -0.087663 0.100660 + 0.034029 -0.079628 0.098353 + 0.032205 -0.076935 0.096218 + 0.038606 -0.096009 0.084922 + 0.038020 -0.094993 0.083875 + 0.037184 -0.093807 0.083328 + 0.038210 -0.088325 0.082173 + 0.040011 -0.093906 0.084874 + 0.039122 -0.095039 0.084854 + 0.040488 -0.089539 0.083916 + 0.040045 -0.083895 0.082144 + 0.040951 -0.085522 0.082763 + 0.039134 -0.082549 0.081077 + 0.038850 -0.082619 0.081037 + 0.045888 -0.102088 0.069224 + 0.044215 -0.099716 0.068129 + 0.045495 -0.088303 0.065857 + 0.046919 -0.100148 0.069088 + 0.047873 -0.091416 0.067172 + 0.046062 -0.088163 0.065935 + 0.061543 -0.135562 0.025919 + 0.057294 -0.133146 0.014424 + 0.056223 -0.136782 0.027868 + 0.059106 -0.139066 0.039445 + 0.065017 -0.138633 0.037596 + 0.065178 -0.144100 0.024341 + 0.061934 -0.141546 0.013946 + 0.054457 -0.124117 0.019417 + 0.050698 -0.126375 0.017300 + 0.052556 -0.135205 0.016516 + 0.059083 -0.126614 0.012460 + 0.062345 -0.135623 0.011748 + 0.060811 -0.145443 0.026629 + 0.063593 -0.149569 0.036185 + 0.065877 -0.156902 0.043549 + 0.060574 -0.142468 0.051075 + 0.067871 -0.149116 0.034076 + 0.065814 -0.141826 0.049720 + 0.056879 -0.142387 0.017066 + 0.063872 -0.142649 0.010394 + 0.061606 -0.143647 0.013512 + 0.064390 -0.147521 0.009836 + 0.053103 -0.111081 0.017697 + 0.055496 -0.114673 0.027565 + 0.057104 -0.114696 0.011010 + 0.055012 -0.126317 0.029939 + 0.047192 -0.112367 0.017582 + 0.050570 -0.117821 0.009946 + 0.053080 -0.129485 0.011482 + 0.049566 -0.127992 0.027480 + 0.056519 -0.138410 0.010799 + 0.058974 -0.125456 -0.000041 + 0.061169 -0.131129 -0.000042 + 0.062054 -0.136373 -0.000042 + 0.070546 -0.155399 0.042517 + 0.073394 -0.165097 0.047353 + 0.069378 -0.166415 0.046944 + 0.066489 -0.155521 0.053994 + 0.069758 -0.166967 0.055201 + 0.062258 -0.143107 0.060875 + 0.064254 -0.152650 0.056913 + 0.071201 -0.154826 0.054457 + 0.067142 -0.143913 0.060087 + 0.057501 -0.145287 0.010694 + 0.062800 -0.140680 -0.000042 + 0.064057 -0.161173 0.006421 + 0.066163 -0.151849 0.022492 + 0.059789 -0.152064 0.022250 + 0.064416 -0.152350 0.008120 + 0.064229 -0.145430 -0.000043 + 0.051712 -0.105000 0.012953 + 0.045245 -0.108093 0.011899 + 0.048618 -0.116299 0.027007 + 0.051097 -0.117547 0.036947 + 0.057275 -0.116562 0.037790 + 0.056327 -0.115549 -0.000040 + 0.055442 -0.128476 0.040534 + 0.046397 -0.108681 -0.000037 + 0.050219 -0.118470 -0.000038 + 0.053187 -0.128224 -0.000039 + 0.055459 -0.133860 -0.000040 + 0.051023 -0.128915 0.037930 + 0.059083 -0.126614 -0.012460 + 0.062345 -0.135623 -0.011748 + 0.063872 -0.142649 -0.010394 + 0.064390 -0.147521 -0.009836 + 0.074733 -0.166899 0.055305 + 0.071098 -0.172005 0.049185 + 0.074618 -0.171971 0.048006 + 0.068224 -0.151428 0.060034 + 0.071129 -0.177030 0.060571 + 0.061593 -0.143322 0.066183 + 0.063658 -0.153048 0.062880 + 0.067614 -0.152176 0.066282 + 0.066481 -0.144448 0.066347 + 0.056594 -0.138984 -0.000041 + 0.059167 -0.150019 0.008985 + 0.056952 -0.158333 0.007586 + 0.060628 -0.169006 0.013770 + 0.064416 -0.152350 -0.008120 + 0.068463 -0.169990 0.014761 + 0.063398 -0.162157 -0.000043 + 0.063528 -0.159707 0.031868 + 0.069438 -0.160689 0.031532 + 0.065491 -0.177776 0.022229 + 0.048665 -0.091471 -0.000037 + 0.049136 -0.090066 0.007878 + 0.052664 -0.105684 -0.000039 + 0.048065 -0.100313 0.016099 + 0.042099 -0.093431 0.006732 + 0.041023 -0.101711 0.015612 + 0.051402 -0.117547 0.047221 + 0.051836 -0.128490 0.048387 + 0.058440 -0.116866 0.048373 + 0.057104 -0.114696 -0.011010 + 0.055926 -0.129479 0.051192 + 0.041971 -0.094673 -0.000035 + 0.045245 -0.108093 -0.011899 + 0.050570 -0.117821 -0.009946 + 0.053080 -0.129485 -0.011482 + 0.056519 -0.138410 -0.010799 + 0.054457 -0.124117 -0.019417 + 0.057294 -0.133146 -0.014424 + 0.061934 -0.141546 -0.013946 + 0.061606 -0.143647 -0.013512 + 0.077057 -0.176745 0.062384 + 0.069306 -0.186639 0.031091 + 0.067311 -0.167311 0.041480 + 0.072822 -0.168980 0.041011 + 0.072598 -0.196516 0.040520 + 0.076704 -0.196524 0.041631 + 0.073251 -0.187320 0.033339 + 0.072125 -0.179491 0.072003 + 0.075258 -0.190988 0.065267 + 0.073766 -0.191430 0.075954 + 0.061587 -0.143427 0.071546 + 0.062619 -0.152929 0.068952 + 0.067169 -0.153319 0.072436 + 0.065286 -0.144296 0.072552 + 0.057501 -0.145287 -0.010694 + 0.057542 -0.143194 -0.000041 + 0.059584 -0.154661 0.007333 + 0.059636 -0.163956 -0.000042 + 0.059100 -0.147883 -0.000041 + 0.060167 -0.170040 0.007361 + 0.071526 -0.178974 0.023583 + 0.066163 -0.151849 -0.022492 + 0.064057 -0.161173 -0.006421 + 0.068463 -0.169990 -0.014761 + 0.059404 -0.173596 0.005826 + 0.059553 -0.178303 -0.000042 + 0.059404 -0.173596 -0.005826 + 0.060167 -0.170040 -0.007361 + 0.043004 -0.078935 -0.000035 + 0.042742 -0.078854 0.009426 + 0.049136 -0.090066 -0.007878 + 0.042453 -0.084159 0.014714 + 0.051712 -0.105000 -0.012953 + 0.049599 -0.098948 0.024721 + 0.044519 -0.087887 0.021927 + 0.035824 -0.082162 0.008299 + 0.036264 -0.082158 -0.000034 + 0.037815 -0.087797 0.015706 + 0.042171 -0.103620 0.023708 + 0.052312 -0.117780 0.057638 + 0.051957 -0.127447 0.058823 + 0.056547 -0.128298 0.061876 + 0.059111 -0.116860 0.059122 + 0.053103 -0.111081 -0.017697 + 0.035824 -0.082162 -0.008299 + 0.042099 -0.093431 -0.006732 + 0.041023 -0.101711 -0.015612 + 0.047192 -0.112367 -0.017582 + 0.050698 -0.126375 -0.017300 + 0.052556 -0.135205 -0.016516 + 0.056879 -0.142387 -0.017066 + 0.055012 -0.126317 -0.029939 + 0.049566 -0.127992 -0.027480 + 0.061543 -0.135562 -0.025919 + 0.056223 -0.136782 -0.027868 + 0.065178 -0.144100 -0.024341 + 0.059789 -0.152064 -0.022250 + 0.078216 -0.190670 0.065195 + 0.077150 -0.181220 0.074077 + 0.073742 -0.208622 0.051811 + 0.073580 -0.196943 0.060142 + 0.081492 -0.206173 0.072202 + 0.078531 -0.210951 0.051104 + 0.078696 -0.197821 0.062785 + 0.069983 -0.177857 0.083822 + 0.069942 -0.190652 0.086027 + 0.076562 -0.191952 0.076254 + 0.073768 -0.191275 0.087190 + 0.061185 -0.143127 0.076860 + 0.062135 -0.153236 0.075148 + 0.066945 -0.154612 0.078507 + 0.065200 -0.144898 0.078869 + 0.059167 -0.150019 -0.008985 + 0.056952 -0.158333 -0.007586 + 0.060628 -0.169006 -0.013770 + 0.059584 -0.154661 -0.007333 + 0.063528 -0.159707 -0.031868 + 0.069438 -0.160689 -0.031532 + 0.071526 -0.178974 -0.023583 + 0.038902 -0.066635 -0.000034 + 0.039369 -0.065759 0.008291 + 0.042742 -0.078854 -0.009426 + 0.037707 -0.066567 0.012961 + 0.038338 -0.074115 0.015624 + 0.039554 -0.080843 0.013640 + 0.042453 -0.084159 -0.014714 + 0.048065 -0.100313 -0.016099 + 0.039114 -0.091255 0.022961 + 0.050816 -0.099295 0.033447 + 0.047483 -0.090788 0.029330 + 0.041059 -0.093582 0.030490 + 0.032039 -0.069265 0.007097 + 0.031891 -0.069988 -0.000032 + 0.033371 -0.076123 0.016333 + 0.032039 -0.069265 -0.007097 + 0.042798 -0.105272 0.031929 + 0.053417 -0.116760 0.067704 + 0.051835 -0.126545 0.069266 + 0.056834 -0.126106 0.072466 + 0.058642 -0.115538 0.069549 + 0.055496 -0.114673 -0.027565 + 0.033371 -0.076123 -0.016333 + 0.039554 -0.080843 -0.013640 + 0.037815 -0.087797 -0.015706 + 0.039114 -0.091255 -0.022961 + 0.042171 -0.103620 -0.023708 + 0.048618 -0.116299 -0.027007 + 0.060811 -0.145443 -0.026629 + 0.055442 -0.128476 -0.040534 + 0.051023 -0.128915 -0.037930 + 0.051097 -0.117547 -0.036947 + 0.059106 -0.139066 -0.039445 + 0.065017 -0.138633 -0.037596 + 0.063593 -0.149569 -0.036185 + 0.067871 -0.149116 -0.034076 + 0.065491 -0.177776 -0.022229 + 0.074779 -0.179897 0.086332 + 0.081488 -0.219211 0.058591 + 0.075326 -0.216685 0.059017 + 0.075526 -0.205126 0.069934 + 0.079347 -0.209062 0.084697 + 0.081230 -0.214954 0.073548 + 0.075312 -0.208814 0.082179 + 0.065879 -0.174277 0.094740 + 0.065605 -0.188927 0.095788 + 0.070168 -0.188993 0.097665 + 0.070864 -0.176980 0.097914 + 0.061217 -0.141737 0.082047 + 0.061544 -0.155383 0.080799 + 0.066130 -0.155784 0.084393 + 0.065070 -0.143445 0.084995 + 0.067311 -0.167311 -0.041480 + 0.072822 -0.168980 -0.041011 + 0.073251 -0.187320 -0.033339 + 0.074618 -0.171971 -0.048006 + 0.033843 -0.057533 -0.000032 + 0.034119 -0.057331 0.007855 + 0.039369 -0.065759 -0.008291 + 0.033152 -0.060513 0.014794 + 0.038338 -0.074115 -0.015624 + 0.034877 -0.062573 0.019769 + 0.038694 -0.073649 0.021612 + 0.049599 -0.098948 -0.024721 + 0.044519 -0.087887 -0.021927 + 0.050464 -0.101811 0.041977 + 0.047470 -0.092404 0.037401 + 0.041527 -0.095151 0.038475 + 0.044502 -0.105760 0.040119 + 0.026986 -0.060743 0.006693 + 0.026948 -0.060831 -0.000030 + 0.027942 -0.062742 0.015212 + 0.026986 -0.060743 -0.006693 + 0.033116 -0.075827 0.022074 + 0.027942 -0.062742 -0.015212 + 0.052391 -0.112080 0.076874 + 0.051372 -0.125963 0.079724 + 0.056527 -0.123474 0.082900 + 0.056405 -0.111689 0.079287 + 0.057275 -0.116562 -0.037790 + 0.028184 -0.065346 -0.020525 + 0.033116 -0.075827 -0.022074 + 0.047483 -0.090788 -0.029330 + 0.041059 -0.093582 -0.030490 + 0.042798 -0.105272 -0.031929 + 0.051836 -0.128490 -0.048387 + 0.055926 -0.129479 -0.051192 + 0.051402 -0.117547 -0.047221 + 0.058440 -0.116866 -0.048373 + 0.065877 -0.156902 -0.043549 + 0.060574 -0.142468 -0.051075 + 0.065814 -0.141826 -0.049720 + 0.070546 -0.155399 -0.042517 + 0.069306 -0.186639 -0.031091 + 0.084239 -0.227151 0.066497 + 0.076030 -0.219008 0.071361 + 0.077702 -0.224556 0.065864 + 0.073849 -0.219056 0.082970 + 0.079459 -0.219152 0.085630 + 0.076043 -0.209293 0.097351 + 0.072937 -0.207886 0.094766 + 0.082091 -0.225354 0.079017 + 0.078277 -0.225361 0.077009 + 0.077878 -0.217567 0.072138 + 0.070644 -0.219550 0.095669 + 0.060520 -0.141048 0.087319 + 0.060433 -0.156495 0.086729 + 0.064737 -0.156748 0.090411 + 0.065891 -0.144433 0.091181 + 0.071098 -0.172005 -0.049185 + 0.076704 -0.196524 -0.041631 + 0.077057 -0.176745 -0.062384 + 0.073394 -0.165097 -0.047353 + 0.069378 -0.166415 -0.046944 + 0.027055 -0.044510 -0.000030 + 0.028323 -0.045064 0.008103 + 0.034119 -0.057331 -0.007855 + 0.027630 -0.050971 0.014420 + 0.037707 -0.066567 -0.012961 + 0.025918 -0.052246 0.014924 + 0.028184 -0.065346 0.020525 + 0.033152 -0.060513 -0.014794 + 0.038694 -0.073649 -0.021612 + 0.029321 -0.066486 0.026283 + 0.035535 -0.064331 0.025142 + 0.039218 -0.073962 0.027579 + 0.050816 -0.099295 -0.033447 + 0.051100 -0.102232 0.050867 + 0.047757 -0.092457 0.045763 + 0.042293 -0.094983 0.046624 + 0.045777 -0.105433 0.048406 + 0.021172 -0.048484 0.006938 + 0.020255 -0.047762 -0.000028 + 0.021172 -0.048484 -0.006938 + 0.033439 -0.075981 0.027803 + 0.025918 -0.052246 -0.014924 + 0.027630 -0.050971 -0.014420 + 0.034877 -0.062573 -0.019769 + 0.035535 -0.064331 -0.025142 + 0.029321 -0.066486 -0.026283 + 0.033439 -0.075981 -0.027803 + 0.050464 -0.101811 -0.041977 + 0.047470 -0.092404 -0.037401 + 0.041527 -0.095151 -0.038475 + 0.044502 -0.105760 -0.040119 + 0.052312 -0.117780 -0.057638 + 0.051957 -0.127447 -0.058823 + 0.056547 -0.128298 -0.061876 + 0.059111 -0.116860 -0.059122 + 0.066489 -0.155521 -0.053994 + 0.062258 -0.143107 -0.060875 + 0.064254 -0.152650 -0.056913 + 0.071201 -0.154826 -0.054457 + 0.067142 -0.143913 -0.060087 + 0.072598 -0.196516 -0.040520 + 0.071129 -0.177030 -0.060571 + 0.081311 -0.230799 0.085096 + 0.083978 -0.235349 0.074654 + 0.076511 -0.219031 0.073790 + 0.078414 -0.231965 0.073827 + 0.074949 -0.220274 0.097728 + 0.068467 -0.205260 0.106556 + 0.072516 -0.206856 0.109677 + 0.064577 -0.217897 0.107049 + 0.076047 -0.231017 0.082809 + 0.069740 -0.219444 0.109521 + 0.078216 -0.190670 -0.065195 + 0.078696 -0.197821 -0.062785 + 0.078531 -0.210951 -0.051104 + 0.074733 -0.166899 -0.055305 + 0.077150 -0.181220 -0.074077 + 0.072125 -0.179491 -0.072003 + 0.069758 -0.166967 -0.055201 + 0.016387 -0.025035 -0.000026 + 0.017300 -0.028529 0.012083 + 0.021765 -0.035631 -0.009576 + 0.021765 -0.035631 0.009576 + 0.028323 -0.045064 -0.008103 + 0.018734 -0.039640 0.015383 + 0.026490 -0.046048 0.013268 + 0.027239 -0.045497 0.017764 + 0.028142 -0.050788 0.018916 + 0.026175 -0.052690 0.019178 + 0.039218 -0.073962 -0.027579 + 0.030337 -0.066705 0.032185 + 0.033556 -0.076526 0.033524 + 0.035817 -0.065042 0.030764 + 0.039999 -0.074076 0.033520 + 0.050578 -0.101717 0.059677 + 0.048556 -0.091093 0.053955 + 0.043144 -0.092743 0.054287 + 0.045714 -0.104925 0.056795 + 0.014889 -0.038919 0.008456 + 0.009810 -0.028181 -0.000024 + 0.010525 -0.031769 -0.010980 + 0.014889 -0.038919 -0.008456 + 0.018734 -0.039640 -0.015383 + 0.020799 -0.041386 -0.018107 + 0.026175 -0.052690 -0.019178 + 0.026490 -0.046048 -0.013268 + 0.028142 -0.050788 -0.018916 + 0.039999 -0.074076 -0.033520 + 0.035817 -0.065042 -0.030764 + 0.030337 -0.066705 -0.032185 + 0.033556 -0.076526 -0.033524 + 0.045777 -0.105433 -0.048406 + 0.051100 -0.102232 -0.050867 + 0.047757 -0.092457 -0.045763 + 0.042293 -0.094983 -0.046624 + 0.058642 -0.115538 -0.069549 + 0.053417 -0.116760 -0.067704 + 0.051835 -0.126545 -0.069266 + 0.056834 -0.126106 -0.072466 + 0.068224 -0.151428 -0.060034 + 0.061593 -0.143322 -0.066183 + 0.063658 -0.153048 -0.062880 + 0.067614 -0.152176 -0.066282 + 0.066481 -0.144448 -0.066347 + 0.075258 -0.190988 -0.065267 + 0.073580 -0.196943 -0.060142 + 0.075526 -0.205126 -0.069934 + 0.073742 -0.208622 -0.051811 + 0.073766 -0.191430 -0.075954 + 0.073105 -0.233801 0.090034 + 0.078983 -0.235195 0.091586 + 0.080444 -0.243819 0.081702 + 0.074859 -0.239859 0.079980 + 0.076562 -0.191952 -0.076254 + 0.081492 -0.206173 -0.072202 + 0.081488 -0.219211 -0.058591 + 0.074779 -0.179897 -0.086332 + 0.069983 -0.177857 -0.083822 + 0.069942 -0.190652 -0.086027 + 0.010869 -0.013736 -0.000024 + 0.013398 -0.022393 0.017692 + 0.009446 -0.012400 -0.014749 + 0.013398 -0.022393 -0.017692 + 0.017300 -0.028529 -0.012083 + 0.011012 -0.026088 0.019196 + 0.014953 -0.031881 0.014840 + 0.017049 -0.035116 -0.013914 + 0.017049 -0.035116 0.013914 + 0.020799 -0.041386 0.018107 + 0.022160 -0.042528 0.021262 + 0.027766 -0.045274 0.022320 + 0.028225 -0.050733 0.023404 + 0.026720 -0.052450 0.023731 + 0.031181 -0.066238 0.038063 + 0.033318 -0.077116 0.039233 + 0.040850 -0.073443 0.039443 + 0.036118 -0.064804 0.036435 + 0.048082 -0.100816 0.068239 + 0.047986 -0.088428 0.061947 + 0.043886 -0.088420 0.061293 + 0.045032 -0.104378 0.065150 + 0.010525 -0.031769 0.010980 + 0.006631 -0.025629 0.016590 + 0.002627 -0.015661 0.013638 + 0.004316 -0.016870 -0.000023 + 0.006631 -0.025629 -0.016590 + 0.011012 -0.026088 -0.019196 + 0.014953 -0.031881 -0.014840 + 0.027239 -0.045497 -0.017764 + 0.027766 -0.045274 -0.022320 + 0.022160 -0.042528 -0.021262 + 0.026720 -0.052450 -0.023731 + 0.028225 -0.050733 -0.023404 + 0.033318 -0.077116 -0.039233 + 0.040850 -0.073443 -0.039443 + 0.036118 -0.064804 -0.036435 + 0.031181 -0.066238 -0.038063 + 0.043144 -0.092743 -0.054287 + 0.045714 -0.104925 -0.056795 + 0.050578 -0.101717 -0.059677 + 0.048556 -0.091093 -0.053955 + 0.056527 -0.123474 -0.082900 + 0.056405 -0.111689 -0.079287 + 0.052391 -0.112080 -0.076874 + 0.051372 -0.125963 -0.079724 + 0.065286 -0.144296 -0.072552 + 0.061587 -0.143427 -0.071546 + 0.062619 -0.152929 -0.068952 + 0.067169 -0.153319 -0.072436 + 0.075312 -0.208814 -0.082179 + 0.073849 -0.219056 -0.082970 + 0.076030 -0.219008 -0.071361 + 0.075326 -0.216685 -0.059017 + 0.073768 -0.191275 -0.087190 + 0.069543 -0.235887 0.097485 + 0.075667 -0.238440 0.098783 + 0.074511 -0.245103 0.100811 + 0.075753 -0.252221 0.088218 + 0.071436 -0.251696 0.099575 + 0.069411 -0.247396 0.085658 + 0.081230 -0.214954 -0.073548 + 0.079347 -0.209062 -0.084697 + 0.084239 -0.227151 -0.066497 + 0.082091 -0.225354 -0.079017 + 0.070864 -0.176980 -0.097914 + 0.065879 -0.174277 -0.094740 + 0.065605 -0.188927 -0.095788 + 0.070168 -0.188993 -0.097665 + 0.003523 -0.002470 -0.000022 + 0.002389 -0.001311 0.015643 + 0.009446 -0.012400 0.014749 + 0.001810 -0.023024 0.027908 + 0.007890 -0.017310 0.028537 + 0.002443 -0.006765 0.027785 + 0.002389 -0.001311 -0.015643 + 0.002443 -0.006765 -0.027785 + 0.007890 -0.017310 -0.028537 + 0.022792 -0.043041 0.024888 + 0.026509 -0.052551 0.028287 + 0.028068 -0.045402 0.026941 + 0.027828 -0.050852 0.027887 + 0.032066 -0.065029 0.043794 + 0.033846 -0.077221 0.044917 + 0.041105 -0.073699 0.045377 + 0.036667 -0.063890 0.041977 + -0.007636 -0.006106 0.014010 + -0.002719 -0.005454 -0.000020 + -0.007636 -0.006106 -0.014010 + 0.002627 -0.015661 -0.013638 + -0.005916 -0.005886 -0.015413 + -0.005178 -0.006918 -0.026099 + 0.001810 -0.023024 -0.027908 + 0.027828 -0.050852 -0.027887 + 0.028068 -0.045402 -0.026941 + 0.022792 -0.043041 -0.024888 + 0.026509 -0.052551 -0.028287 + 0.032066 -0.065029 -0.043794 + 0.033846 -0.077221 -0.044917 + 0.041105 -0.073699 -0.045377 + 0.036667 -0.063890 -0.041977 + 0.047986 -0.088428 -0.061947 + 0.043886 -0.088420 -0.061293 + 0.045032 -0.104378 -0.065150 + 0.048082 -0.100816 -0.068239 + 0.065200 -0.144898 -0.078869 + 0.061185 -0.143127 -0.076860 + 0.062135 -0.153236 -0.075148 + 0.066945 -0.154612 -0.078507 + 0.072937 -0.207886 -0.094766 + 0.070644 -0.219550 -0.095669 + 0.076511 -0.219031 -0.073790 + 0.079459 -0.219152 -0.085630 + 0.074949 -0.220274 -0.097728 + 0.078277 -0.225361 -0.077009 + 0.077878 -0.217567 -0.072138 + 0.077702 -0.224556 -0.065864 + 0.066841 -0.237632 0.099971 + 0.066951 -0.248828 0.098043 + 0.067461 -0.247429 0.101319 + 0.073576 -0.240591 0.102464 + 0.071295 -0.250160 0.103399 + 0.067945 -0.258422 0.102482 + 0.069588 -0.260100 0.094143 + 0.062488 -0.254932 0.100894 + 0.065288 -0.253762 0.093311 + 0.076043 -0.209293 -0.097351 + 0.083978 -0.235349 -0.074654 + 0.081311 -0.230799 -0.085096 + 0.076047 -0.231017 -0.082809 + -0.000017 -0.000013 -0.000021 + -0.000188 -0.000065 0.012310 + -0.005916 -0.005886 0.015413 + -0.005178 -0.006918 0.026099 + 0.000755 -0.022017 0.030227 + 0.006605 -0.016574 0.030449 + 0.000920 -0.006098 0.029003 + -0.006179 -0.006459 0.026983 + -0.000188 -0.000065 -0.012310 + -0.008215 -0.002916 -0.011655 + 0.000920 -0.006098 -0.029003 + 0.006605 -0.016574 -0.030449 + 0.000755 -0.022017 -0.030227 + 0.022709 -0.042959 0.028578 + 0.024850 -0.052237 0.032597 + 0.027267 -0.050751 0.032345 + 0.027806 -0.045118 0.031430 + 0.033004 -0.063081 0.049372 + 0.035102 -0.076866 0.050576 + 0.040737 -0.074939 0.051325 + 0.037431 -0.062318 0.047413 + -0.008215 -0.002916 0.011655 + -0.006031 -0.000311 -0.000019 + -0.006179 -0.006459 -0.026983 + 0.024850 -0.052237 -0.032597 + 0.027267 -0.050751 -0.032345 + 0.027806 -0.045118 -0.031430 + 0.022709 -0.042959 -0.028578 + 0.037431 -0.062318 -0.047413 + 0.033004 -0.063081 -0.049372 + 0.035102 -0.076866 -0.050576 + 0.040737 -0.074939 -0.051325 + 0.065070 -0.143445 -0.084995 + 0.061217 -0.141737 -0.082047 + 0.061544 -0.155383 -0.080799 + 0.066130 -0.155784 -0.084393 + 0.068467 -0.205260 -0.106556 + 0.064577 -0.217897 -0.107049 + 0.069740 -0.219444 -0.109521 + 0.072516 -0.206856 -0.109677 + 0.078414 -0.231965 -0.073827 + 0.064758 -0.238953 0.102943 + 0.065251 -0.246114 0.104055 + 0.069629 -0.249601 0.107108 + 0.070371 -0.240974 0.106058 + 0.062832 -0.262489 0.107152 + 0.058805 -0.258432 0.103403 + 0.062289 -0.266012 0.100928 + 0.058664 -0.260297 0.099102 + 0.080444 -0.243819 -0.081702 + 0.078983 -0.235195 -0.091586 + 0.073105 -0.233801 -0.090034 + 0.074859 -0.239859 -0.079980 + -0.000299 -0.021011 0.032546 + 0.005321 -0.015839 0.032360 + -0.000604 -0.005431 0.030221 + -0.007181 -0.006000 0.027867 + 0.005321 -0.015839 -0.032360 + -0.000604 -0.005431 -0.030221 + -0.000299 -0.021011 -0.032546 + -0.007181 -0.006000 -0.027867 + 0.021920 -0.042303 0.032065 + 0.023634 -0.051353 0.036815 + 0.026789 -0.050123 0.036766 + 0.026753 -0.043931 0.035664 + 0.021920 -0.042303 -0.032065 + 0.023634 -0.051353 -0.036815 + 0.026789 -0.050123 -0.036766 + 0.026753 -0.043931 -0.035664 + 0.065891 -0.144433 -0.091181 + 0.060520 -0.141048 -0.087319 + 0.060433 -0.156495 -0.086729 + 0.064737 -0.156748 -0.090411 + 0.063377 -0.239819 0.106460 + 0.062872 -0.245444 0.106860 + 0.067702 -0.249671 0.110724 + 0.067789 -0.240907 0.110143 + 0.053049 -0.261892 0.107632 + 0.056725 -0.265054 0.111937 + 0.050479 -0.264475 0.104991 + 0.054039 -0.270394 0.107851 + 0.075753 -0.252221 -0.088218 + 0.071436 -0.251696 -0.099575 + 0.074511 -0.245103 -0.100811 + 0.075667 -0.238440 -0.098783 + 0.069543 -0.235887 -0.097485 + 0.069411 -0.247396 -0.085658 + -0.001354 -0.020005 0.034865 + 0.004036 -0.015104 0.034272 + -0.002129 -0.004765 0.031439 + -0.008182 -0.005541 0.028751 + -0.001354 -0.020005 -0.034865 + 0.004036 -0.015104 -0.034272 + -0.002129 -0.004765 -0.031439 + -0.008182 -0.005541 -0.028751 + 0.020452 -0.041089 0.035430 + 0.024452 -0.049835 0.041088 + 0.026335 -0.049059 0.041153 + 0.025006 -0.042022 0.039688 + 0.025006 -0.042022 -0.039688 + 0.020452 -0.041089 -0.035430 + 0.024452 -0.049835 -0.041088 + 0.026335 -0.049059 -0.041153 + 0.061765 -0.239971 0.110010 + 0.060472 -0.244875 0.109666 + 0.065174 -0.249571 0.113929 + 0.066056 -0.241152 0.114593 + 0.048339 -0.262414 0.113122 + 0.042742 -0.264102 0.112454 + 0.051171 -0.264182 0.117660 + 0.045350 -0.269218 0.115254 + 0.067945 -0.258422 -0.102482 + 0.069588 -0.260100 -0.094143 + 0.071295 -0.250160 -0.103399 + 0.066951 -0.248828 -0.098043 + 0.062488 -0.254932 -0.100894 + 0.073576 -0.240591 -0.102464 + 0.066841 -0.237632 -0.099971 + 0.067461 -0.247429 -0.101319 + 0.065288 -0.253762 -0.093311 + -0.002408 -0.018999 0.037183 + 0.002752 -0.014368 0.036183 + -0.003652 -0.004097 0.032656 + -0.009184 -0.005081 0.029636 + -0.009184 -0.005081 -0.029636 + -0.002408 -0.018999 -0.037183 + 0.002752 -0.014368 -0.036183 + -0.003652 -0.004097 -0.032656 + 0.059337 -0.240505 0.113024 + 0.058111 -0.244814 0.112610 + 0.062102 -0.249313 0.116762 + 0.062659 -0.241474 0.117998 + 0.062832 -0.262489 -0.107152 + 0.058805 -0.258432 -0.103403 + 0.062289 -0.266012 -0.100928 + 0.070371 -0.240974 -0.106058 + 0.069629 -0.249601 -0.107108 + 0.058664 -0.260297 -0.099102 + 0.064758 -0.238953 -0.102943 + 0.065251 -0.246114 -0.104055 + -0.003463 -0.017993 0.039502 + 0.001467 -0.013632 0.038095 + -0.005176 -0.003431 0.033874 + -0.010185 -0.004622 0.030520 + -0.005176 -0.003431 -0.033874 + -0.010185 -0.004622 -0.030520 + -0.003463 -0.017993 -0.039502 + 0.001467 -0.013632 -0.038095 + 0.056725 -0.265054 -0.111937 + 0.053049 -0.261892 -0.107632 + 0.050479 -0.264475 -0.104991 + 0.054039 -0.270394 -0.107851 + 0.067789 -0.240907 -0.110143 + 0.063377 -0.239819 -0.106460 + 0.067702 -0.249671 -0.110724 + 0.062872 -0.245444 -0.106860 + -0.004517 -0.016987 0.041820 + 0.000182 -0.012897 0.040007 + -0.006700 -0.002764 0.035092 + -0.011187 -0.004162 0.031404 + 0.000182 -0.012897 -0.040007 + -0.006700 -0.002764 -0.035092 + -0.011187 -0.004162 -0.031404 + -0.004517 -0.016987 -0.041820 + 0.048339 -0.262414 -0.113122 + 0.051171 -0.264182 -0.117660 + 0.042742 -0.264102 -0.112454 + 0.045350 -0.269218 -0.115254 + 0.066056 -0.241152 -0.114593 + 0.061765 -0.239971 -0.110010 + 0.060472 -0.244875 -0.109666 + 0.065174 -0.249571 -0.113929 + 0.062659 -0.241474 -0.117998 + 0.059337 -0.240505 -0.113024 + 0.058111 -0.244814 -0.112610 + 0.062102 -0.249313 -0.116762 + -0.092607 -0.087562 -0.034072 + -0.095015 -0.082889 -0.037561 + -0.084823 -0.085874 -0.022815 + -0.098000 -0.094664 -0.052197 + -0.098089 -0.088480 -0.052347 + -0.091738 -0.092976 -0.034645 + -0.079365 -0.090099 -0.021270 + -0.098865 -0.086002 -0.055669 + -0.098090 -0.087684 -0.034711 + -0.086218 -0.089722 -0.020275 + -0.103358 -0.103347 -0.067387 + -0.099626 -0.101439 -0.069912 + -0.102712 -0.095172 -0.049223 + -0.099980 -0.093173 -0.070912 + -0.093280 -0.094145 -0.038083 + -0.078938 -0.094298 -0.022398 + -0.099974 -0.092808 -0.073697 + -0.103383 -0.088129 -0.053258 + -0.098875 -0.089318 -0.033976 + -0.086865 -0.093166 -0.018441 + -0.104915 -0.112109 -0.085700 + -0.102602 -0.113795 -0.084146 + -0.106699 -0.100838 -0.069612 + -0.097537 -0.107289 -0.087793 + -0.104407 -0.094416 -0.050947 + -0.097563 -0.100399 -0.088338 + -0.083614 -0.098966 -0.021266 + -0.097899 -0.100163 -0.091693 + -0.105067 -0.095275 -0.072036 + -0.091358 -0.107295 -0.104632 + -0.094374 -0.118516 -0.101221 + -0.103022 -0.104681 -0.089078 + -0.093587 -0.118678 -0.101110 + -0.087530 -0.113974 -0.102215 + -0.087754 -0.104387 -0.103920 + -0.087676 -0.105032 -0.105500 + -0.073583 -0.110582 -0.117221 + -0.077421 -0.112329 -0.117199 + -0.080792 -0.122957 -0.114947 + -0.080204 -0.123032 -0.114400 + -0.074321 -0.118838 -0.114520 + -0.074486 -0.110297 -0.115452 + -0.059344 -0.117184 -0.124848 + -0.058671 -0.116577 -0.127107 + -0.061808 -0.117520 -0.127244 + -0.064375 -0.127192 -0.125008 + -0.063896 -0.127948 -0.123990 + -0.059600 -0.125993 -0.123463 + -0.043938 -0.133832 -0.129471 + -0.043192 -0.124769 -0.130429 + -0.042013 -0.124070 -0.132155 + -0.044838 -0.124670 -0.134053 + -0.046930 -0.134230 -0.130968 + -0.029399 -0.141963 -0.134709 + -0.029095 -0.141690 -0.133620 + -0.026869 -0.140249 -0.132549 + -0.027660 -0.133333 -0.136996 + -0.026087 -0.131790 -0.133559 + -0.024759 -0.131161 -0.134911 + -0.009954 -0.141554 -0.137351 + -0.011628 -0.150182 -0.136068 + -0.011295 -0.149654 -0.134835 + -0.010494 -0.148895 -0.133899 + -0.007784 -0.139277 -0.135957 + -0.009286 -0.140171 -0.134560 + 0.009580 -0.146449 -0.133970 + 0.008075 -0.147770 -0.135434 + 0.006378 -0.157816 -0.134964 + 0.005300 -0.159207 -0.134232 + 0.006048 -0.156546 -0.131857 + 0.007904 -0.147568 -0.132874 + 0.024174 -0.155907 -0.128681 + 0.026435 -0.153838 -0.129719 + 0.025478 -0.155129 -0.130443 + 0.023973 -0.165515 -0.131025 + 0.022942 -0.166380 -0.130279 + 0.022623 -0.163921 -0.128174 + 0.038669 -0.169742 -0.120857 + 0.040534 -0.162353 -0.121837 + 0.042482 -0.161015 -0.122620 + 0.041829 -0.163513 -0.123933 + 0.039939 -0.173864 -0.123011 + 0.039098 -0.174287 -0.122841 + 0.052025 -0.182178 -0.110512 + 0.051044 -0.177577 -0.109169 + 0.055992 -0.167317 -0.111915 + 0.056826 -0.169923 -0.113062 + 0.054096 -0.181043 -0.111210 + 0.066834 -0.189495 -0.098513 + 0.064125 -0.188934 -0.096646 + 0.062879 -0.183297 -0.095718 + 0.064949 -0.174241 -0.097163 + 0.067697 -0.174806 -0.098000 + 0.069284 -0.178984 -0.100519 + 0.069817 -0.205296 -0.108786 + 0.066029 -0.219325 -0.106108 + 0.068068 -0.218286 -0.109170 + 0.065463 -0.203444 -0.111420 + 0.063864 -0.212511 -0.104511 + 0.057166 -0.199629 -0.121210 + 0.056202 -0.197586 -0.120677 + 0.071033 -0.208437 -0.111264 + 0.051842 -0.205454 -0.116835 + 0.052658 -0.212054 -0.117910 + 0.054309 -0.210550 -0.118436 + 0.053804 -0.195347 -0.122979 + 0.042030 -0.201235 -0.128385 + 0.042655 -0.190351 -0.129547 + 0.040900 -0.188866 -0.129159 + 0.038231 -0.188538 -0.129200 + 0.038600 -0.196231 -0.125699 + 0.039468 -0.202114 -0.128003 + 0.023711 -0.192860 -0.133776 + 0.026719 -0.193042 -0.134143 + 0.026096 -0.182071 -0.134067 + 0.024055 -0.180041 -0.133514 + 0.022750 -0.180181 -0.133591 + 0.023608 -0.187461 -0.131414 + 0.006827 -0.180748 -0.134238 + 0.006629 -0.185290 -0.135506 + 0.010168 -0.185652 -0.137106 + 0.009474 -0.173166 -0.136648 + 0.006692 -0.171492 -0.136006 + 0.006298 -0.172541 -0.135494 + -0.009647 -0.163879 -0.134638 + -0.009422 -0.172365 -0.133807 + -0.010591 -0.177261 -0.135378 + -0.006585 -0.178301 -0.136250 + -0.007584 -0.164723 -0.136248 + -0.010462 -0.162485 -0.135125 + -0.028202 -0.154623 -0.133431 + -0.026297 -0.156738 -0.133362 + -0.026230 -0.165603 -0.131974 + -0.026893 -0.169247 -0.133673 + -0.023422 -0.171370 -0.135172 + -0.024792 -0.156895 -0.134345 + -0.042225 -0.149717 -0.132106 + -0.045573 -0.146837 -0.130010 + -0.042311 -0.149165 -0.130025 + -0.041964 -0.157339 -0.129219 + -0.044683 -0.161040 -0.131565 + -0.039928 -0.163619 -0.133878 + -0.056041 -0.156196 -0.129298 + -0.059026 -0.142916 -0.126704 + -0.063155 -0.140193 -0.124785 + -0.058464 -0.142572 -0.124885 + -0.059008 -0.152964 -0.124228 + -0.061631 -0.154668 -0.125919 + -0.071699 -0.149443 -0.122681 + -0.078711 -0.151406 -0.118253 + -0.075651 -0.138389 -0.118471 + -0.079415 -0.135666 -0.114857 + -0.073991 -0.138539 -0.116024 + -0.073978 -0.146863 -0.115564 + -0.092003 -0.147060 -0.104766 + -0.086572 -0.146785 -0.112093 + -0.087932 -0.142501 -0.104266 + -0.090481 -0.134021 -0.107100 + -0.094030 -0.131793 -0.102146 + -0.088096 -0.135210 -0.104585 + -0.096985 -0.135246 -0.090231 + -0.101652 -0.143344 -0.089507 + -0.099839 -0.142035 -0.099960 + -0.099723 -0.128558 -0.091805 + -0.103644 -0.134469 -0.093788 + -0.104862 -0.126709 -0.087385 + -0.102940 -0.122627 -0.074356 + -0.101143 -0.130158 -0.072558 + -0.104227 -0.134870 -0.072263 + -0.106325 -0.138383 -0.083216 + -0.106638 -0.120393 -0.068449 + -0.108477 -0.128534 -0.076688 + -0.103341 -0.113475 -0.050005 + -0.102401 -0.117295 -0.056338 + -0.099333 -0.123419 -0.055021 + -0.103500 -0.126359 -0.054953 + -0.105914 -0.131324 -0.065885 + -0.108313 -0.122361 -0.058264 + -0.105685 -0.118774 -0.039137 + -0.100758 -0.109116 -0.030752 + -0.097534 -0.114271 -0.038369 + -0.094202 -0.120272 -0.037211 + -0.098012 -0.120717 -0.038696 + -0.104774 -0.124132 -0.048500 + -0.099388 -0.118674 -0.033602 + -0.096254 -0.114117 -0.024439 + -0.085882 -0.112847 -0.021105 + -0.086253 -0.111681 -0.024306 + -0.084250 -0.117500 -0.022039 + -0.086599 -0.120972 -0.022683 + -0.071201 -0.216568 -0.018716 + -0.059722 -0.206224 -0.021176 + -0.072359 -0.212671 -0.020982 + -0.060746 -0.216862 -0.018551 + -0.058377 -0.209363 -0.021539 + -0.072368 -0.216290 -0.028380 + -0.071332 -0.220108 -0.025610 + -0.061838 -0.212771 -0.027827 + -0.063449 -0.208594 -0.028104 + -0.066060 -0.220153 -0.023037 + -0.068094 -0.212675 -0.034324 + -0.074482 -0.219652 -0.035660 + -0.073289 -0.223145 -0.032721 + -0.068468 -0.222585 -0.030352 + -0.065978 -0.215070 -0.034075 + -0.067576 -0.219293 -0.040729 + -0.071553 -0.217018 -0.041188 + -0.074796 -0.224588 -0.042276 + -0.074022 -0.227481 -0.039205 + -0.071493 -0.225960 -0.036809 + -0.071947 -0.230011 -0.043705 + -0.068317 -0.224206 -0.046843 + -0.071583 -0.222813 -0.047460 + -0.073954 -0.229463 -0.048870 + -0.073557 -0.231724 -0.045934 + -0.073838 -0.236603 -0.052144 + -0.072948 -0.235184 -0.049509 + -0.068600 -0.228297 -0.053699 + -0.071306 -0.228394 -0.054151 + -0.072530 -0.234080 -0.055565 + -0.069518 -0.239464 -0.061039 + -0.071188 -0.241526 -0.057801 + -0.071019 -0.240197 -0.055336 + -0.067179 -0.233451 -0.059573 + -0.069162 -0.233129 -0.061296 + -0.065372 -0.239044 -0.066576 + -0.065068 -0.243724 -0.066585 + -0.068351 -0.246671 -0.063119 + -0.068441 -0.245137 -0.060942 + -0.065014 -0.238802 -0.065086 + -0.061432 -0.243938 -0.069720 + -0.061102 -0.244746 -0.071699 + -0.060740 -0.248794 -0.071526 + -0.064145 -0.251465 -0.067877 + -0.064168 -0.250042 -0.065421 + -0.059680 -0.254477 -0.070035 + -0.057353 -0.250068 -0.072725 + -0.058789 -0.250001 -0.073259 + -0.056700 -0.252008 -0.073598 + -0.057798 -0.252492 -0.073965 + -0.059321 -0.254971 -0.072545 + 0.061721 -0.239717 -0.121476 + 0.058159 -0.248810 -0.113031 + 0.060492 -0.242652 -0.121706 + 0.058892 -0.240026 -0.120573 + 0.058255 -0.246757 -0.112863 + 0.045318 -0.234285 -0.127916 + 0.045165 -0.231702 -0.127749 + 0.051323 -0.247510 -0.121106 + 0.043260 -0.240081 -0.120437 + 0.042881 -0.242348 -0.120381 + 0.036527 -0.238783 -0.126814 + 0.043275 -0.232880 -0.126688 + 0.021228 -0.229419 -0.130770 + 0.029925 -0.224826 -0.132146 + 0.028666 -0.221758 -0.131263 + 0.028065 -0.223337 -0.130341 + 0.028119 -0.231523 -0.125869 + 0.027813 -0.233436 -0.125565 + 0.011661 -0.224924 -0.128655 + 0.004624 -0.220929 -0.131602 + 0.013387 -0.216094 -0.134191 + 0.011532 -0.212082 -0.132998 + 0.012192 -0.214018 -0.132295 + 0.013148 -0.221344 -0.129095 + -0.002889 -0.212256 -0.129641 + -0.005304 -0.217125 -0.128649 + -0.012621 -0.213327 -0.130988 + -0.002611 -0.206200 -0.133662 + -0.006243 -0.203213 -0.131244 + -0.004892 -0.206409 -0.131742 + -0.021936 -0.199162 -0.128300 + -0.020744 -0.206312 -0.126755 + -0.022376 -0.209506 -0.126920 + -0.029733 -0.206354 -0.126947 + -0.019131 -0.197172 -0.131495 + -0.024215 -0.194827 -0.128664 + -0.041605 -0.186563 -0.123301 + -0.038716 -0.192337 -0.123130 + -0.036602 -0.197579 -0.122200 + -0.039095 -0.202478 -0.121728 + -0.045883 -0.198317 -0.121692 + -0.035968 -0.189257 -0.127470 + -0.052293 -0.181400 -0.121827 + -0.058556 -0.178414 -0.116796 + -0.054684 -0.184118 -0.117881 + -0.052915 -0.190297 -0.116453 + -0.055439 -0.194983 -0.116230 + -0.061945 -0.191700 -0.114744 + -0.076667 -0.185692 -0.105175 + -0.068288 -0.174263 -0.114699 + -0.074967 -0.172451 -0.107375 + -0.070482 -0.178452 -0.109709 + -0.068599 -0.184161 -0.108415 + -0.070525 -0.188818 -0.107218 + -0.084129 -0.182806 -0.096328 + -0.090230 -0.180519 -0.093869 + -0.083067 -0.170593 -0.103807 + -0.088993 -0.168772 -0.094899 + -0.084280 -0.173202 -0.098783 + -0.082948 -0.179233 -0.097890 + -0.094113 -0.173586 -0.084965 + -0.094641 -0.178347 -0.082611 + -0.100224 -0.175167 -0.080119 + -0.095970 -0.166844 -0.091257 + -0.100750 -0.163186 -0.082398 + -0.095222 -0.166051 -0.086848 + -0.103242 -0.159376 -0.072997 + -0.100815 -0.166994 -0.070573 + -0.102011 -0.171132 -0.068556 + -0.105740 -0.166404 -0.066536 + -0.106484 -0.160270 -0.078155 + -0.105024 -0.154112 -0.068551 + -0.105426 -0.145314 -0.053106 + -0.101956 -0.152230 -0.057928 + -0.100993 -0.157585 -0.056616 + -0.101783 -0.160532 -0.055823 + -0.104668 -0.156165 -0.053284 + -0.108527 -0.153251 -0.062750 + -0.107653 -0.146275 -0.047230 + -0.101200 -0.136656 -0.038237 + -0.099785 -0.145353 -0.042752 + -0.098387 -0.148708 -0.042704 + -0.099639 -0.150537 -0.042926 + -0.103695 -0.148553 -0.038585 + -0.096899 -0.144207 -0.025649 + -0.104869 -0.142279 -0.031056 + -0.096493 -0.131614 -0.022042 + -0.093252 -0.139911 -0.028222 + -0.091733 -0.143504 -0.028298 + -0.094581 -0.144572 -0.029130 + -0.083628 -0.143331 -0.014549 + -0.085238 -0.143172 -0.015280 + -0.095346 -0.136971 -0.019098 + -0.081701 -0.136786 -0.016103 + -0.080452 -0.140119 -0.017070 + -0.080042 -0.140359 -0.016125 + -0.012220 -0.003946 -0.034011 + -0.000602 -0.012149 -0.041464 + -0.004589 -0.007338 -0.047685 + -0.017257 -0.006157 -0.034664 + -0.015270 -0.001015 -0.037887 + -0.003717 -0.015528 -0.042447 + -0.006490 -0.011248 -0.048988 + -0.008218 -0.002806 -0.054250 + -0.009047 -0.006094 -0.054980 + -0.020086 -0.002986 -0.038333 + -0.019125 0.001869 -0.041248 + -0.022664 0.000358 -0.042061 + -0.011285 0.001601 -0.061097 + -0.012762 -0.001170 -0.060810 + -0.026327 0.003705 -0.044840 + -0.023520 0.004906 -0.044055 + -0.016811 0.006845 -0.066079 + -0.017425 0.004490 -0.065426 + -0.031192 0.006876 -0.046985 + -0.027854 0.008188 -0.046631 + -0.023904 0.012729 -0.068713 + -0.024039 0.010111 -0.068207 + -0.034908 0.010411 -0.049662 + -0.031860 0.011439 -0.049558 + -0.031904 0.018396 -0.068404 + -0.032479 0.014830 -0.068869 + -0.036180 0.015264 -0.051786 + -0.034982 0.015662 -0.052104 + -0.040239 0.023348 -0.066018 + -0.041007 0.019101 -0.066727 + -0.040994 0.018498 -0.053546 + -0.039280 0.019624 -0.052729 + -0.048619 0.027722 -0.062745 + -0.048461 0.024097 -0.063840 + -0.047424 0.020780 -0.053852 + -0.044835 0.022842 -0.051585 + -0.056036 0.031885 -0.058004 + -0.056026 0.028383 -0.059952 + -0.052174 0.023409 -0.051272 + -0.050261 0.024868 -0.049158 + -0.062291 0.036190 -0.052455 + -0.063824 0.031495 -0.055419 + -0.055647 0.026085 -0.047031 + -0.052590 0.028232 -0.045302 + -0.070506 0.039350 -0.048152 + -0.070251 0.033787 -0.049803 + -0.058537 0.028135 -0.042335 + -0.054984 0.029696 -0.040438 + -0.074281 0.037552 -0.041572 + -0.075597 0.033301 -0.043023 + -0.060108 0.029528 -0.037283 + -0.057009 0.031198 -0.035558 + -0.065414 0.037731 -0.038180 + -0.069552 0.035169 -0.037376 + -0.060657 0.029453 -0.031962 + -0.058453 0.030863 -0.030237 + -0.063454 0.036326 -0.029955 + -0.065870 0.034382 -0.030352 + -0.062048 0.027990 -0.026835 + -0.058576 0.028437 -0.025692 + -0.065252 0.034142 -0.021842 + -0.068682 0.031140 -0.023463 + -0.065598 0.024910 -0.023417 + -0.060032 0.025927 -0.021103 + 0.019689 -0.047500 -0.042707 + 0.016543 -0.044262 -0.055465 + 0.019055 -0.043917 -0.055919 + 0.020802 -0.040417 -0.040700 + 0.021402 -0.041687 -0.040038 + 0.022632 -0.049129 -0.043701 + 0.010304 -0.040159 -0.066332 + 0.012481 -0.039403 -0.066968 + 0.017773 -0.035538 -0.050393 + 0.019048 -0.037033 -0.051417 + 0.013396 -0.032600 -0.061526 + 0.002692 -0.036421 -0.076289 + 0.004453 -0.035148 -0.076743 + 0.012508 -0.031930 -0.059511 + 0.006572 -0.028423 -0.070768 + 0.006469 -0.027898 -0.067850 + -0.007119 -0.032939 -0.084162 + -0.005904 -0.030970 -0.083976 + -0.002663 -0.025178 -0.077939 + -0.001645 -0.024470 -0.074297 + -0.018135 -0.029834 -0.090292 + -0.016813 -0.027009 -0.090501 + -0.012665 -0.021747 -0.083749 + -0.010634 -0.021311 -0.079577 + -0.028478 -0.024602 -0.095959 + -0.026993 -0.021431 -0.097035 + -0.022593 -0.016173 -0.087694 + -0.019979 -0.017123 -0.083127 + -0.038642 -0.017932 -0.099644 + -0.036609 -0.012708 -0.099354 + -0.032511 -0.009330 -0.088094 + -0.028797 -0.010777 -0.083961 + -0.047700 -0.009195 -0.095102 + -0.046146 -0.004479 -0.094158 + -0.041693 -0.002847 -0.085153 + -0.038138 -0.005493 -0.082189 + -0.056604 -0.001536 -0.088723 + -0.056136 0.002669 -0.088296 + -0.050851 0.004132 -0.080389 + -0.046605 0.000695 -0.078588 + -0.064809 0.006094 -0.081286 + -0.063806 0.010789 -0.080191 + -0.058103 0.010405 -0.073068 + -0.054304 0.006635 -0.073215 + -0.070252 0.012513 -0.070578 + -0.069589 0.017136 -0.069180 + -0.062940 0.016071 -0.062787 + -0.060438 0.011832 -0.065061 + -0.074328 0.016912 -0.058759 + -0.072758 0.022866 -0.056854 + -0.066645 0.021726 -0.052000 + -0.062814 0.015989 -0.053640 + -0.074770 0.017135 -0.045984 + -0.075774 0.023206 -0.044362 + -0.068811 0.022525 -0.041672 + -0.063650 0.017516 -0.044729 + -0.070395 0.012557 -0.034730 + -0.072368 0.014142 -0.037544 + -0.066884 0.016807 -0.033726 + -0.062735 0.016515 -0.034033 + -0.068638 0.009038 -0.023148 + -0.068305 0.012472 -0.024176 + -0.063610 0.012747 -0.022675 + -0.057918 0.014691 -0.024229 + 0.037845 -0.063051 -0.051357 + 0.038888 -0.071721 -0.053771 + 0.033149 -0.068016 -0.069315 + 0.034754 -0.061673 -0.050136 + 0.033126 -0.059166 -0.067047 + 0.034267 -0.071832 -0.053500 + 0.035802 -0.074709 -0.052819 + 0.031073 -0.071668 -0.069101 + 0.025321 -0.062274 -0.082865 + 0.022839 -0.066532 -0.082855 + 0.032232 -0.062954 -0.051324 + 0.033140 -0.058270 -0.065654 + 0.026498 -0.055290 -0.081758 + 0.030325 -0.069176 -0.069562 + 0.030034 -0.059428 -0.066151 + 0.022619 -0.063792 -0.083036 + 0.014765 -0.057356 -0.094670 + 0.012663 -0.060528 -0.094722 + 0.012403 -0.058512 -0.094560 + 0.026449 -0.053406 -0.078759 + 0.015772 -0.050064 -0.092777 + 0.023736 -0.054654 -0.079172 + 0.013627 -0.050734 -0.089270 + 0.002145 -0.054435 -0.104739 + 0.000281 -0.056882 -0.105113 + 0.000327 -0.054284 -0.104276 + 0.002070 -0.045792 -0.096976 + 0.017244 -0.047488 -0.089390 + 0.003276 -0.045466 -0.101663 + 0.005451 -0.043430 -0.097852 + -0.011323 -0.050081 -0.112563 + -0.013497 -0.052568 -0.112880 + -0.013296 -0.051538 -0.112054 + -0.010833 -0.042998 -0.102606 + -0.007897 -0.040595 -0.103851 + -0.010453 -0.041767 -0.108858 + -0.025457 -0.043299 -0.115850 + -0.028092 -0.046333 -0.115669 + -0.027959 -0.047159 -0.114650 + -0.024110 -0.038404 -0.105642 + -0.021414 -0.036682 -0.108538 + -0.024958 -0.037091 -0.112644 + -0.040484 -0.038468 -0.113609 + -0.042902 -0.040219 -0.113310 + -0.042733 -0.041958 -0.113621 + -0.037716 -0.034813 -0.104933 + -0.035207 -0.031507 -0.107481 + -0.039404 -0.031698 -0.110199 + -0.054486 -0.032105 -0.108765 + -0.056951 -0.033416 -0.108433 + -0.056291 -0.036138 -0.108107 + -0.050421 -0.028910 -0.101427 + -0.048476 -0.026446 -0.103166 + -0.053598 -0.026464 -0.105672 + -0.067042 -0.025324 -0.100931 + -0.068537 -0.025176 -0.099760 + -0.068513 -0.028729 -0.100885 + -0.061430 -0.021487 -0.095179 + -0.060479 -0.020156 -0.096681 + -0.065530 -0.019300 -0.097618 + -0.077248 -0.016678 -0.091353 + -0.080386 -0.018879 -0.090070 + -0.079160 -0.021161 -0.091380 + -0.071030 -0.014232 -0.086391 + -0.070418 -0.012333 -0.088250 + -0.075530 -0.012036 -0.087036 + -0.086481 -0.009525 -0.079507 + -0.088497 -0.011680 -0.076951 + -0.087517 -0.013003 -0.079690 + -0.078669 -0.008630 -0.074610 + -0.078491 -0.006171 -0.076491 + -0.084077 -0.004671 -0.075183 + -0.089832 -0.003225 -0.063985 + -0.091055 -0.005772 -0.060948 + -0.087732 -0.006945 -0.064334 + -0.082712 -0.004729 -0.060271 + -0.082424 -0.000615 -0.062394 + -0.086744 0.001313 -0.060342 + -0.088160 0.001676 -0.047545 + -0.088714 0.001436 -0.045627 + -0.084671 -0.005009 -0.048411 + -0.080542 -0.002008 -0.045398 + -0.081398 0.003836 -0.047150 + -0.085521 0.004622 -0.045807 + -0.081486 -0.000266 -0.035688 + -0.083533 -0.005292 -0.035063 + -0.078877 -0.007597 -0.032999 + -0.074694 -0.004646 -0.031484 + -0.075945 0.001637 -0.032905 + -0.079364 0.001613 -0.036080 + -0.074310 -0.005655 -0.021346 + -0.076753 -0.010562 -0.020176 + -0.071532 -0.013405 -0.019504 + -0.064422 -0.008905 -0.022270 + -0.068663 -0.003962 -0.020752 + -0.072964 -0.004120 -0.022142 + 0.054363 -0.113610 -0.081816 + 0.054766 -0.122197 -0.083080 + 0.044582 -0.116347 -0.097219 + 0.052867 -0.111481 -0.080227 + 0.044078 -0.108320 -0.095841 + 0.049590 -0.112289 -0.079356 + 0.049762 -0.122114 -0.081402 + 0.052022 -0.125715 -0.081547 + 0.042419 -0.119559 -0.096100 + 0.033793 -0.110688 -0.110940 + 0.031811 -0.113198 -0.109533 + 0.043317 -0.105529 -0.093976 + 0.033932 -0.102796 -0.109939 + 0.040925 -0.106408 -0.092937 + 0.041742 -0.115806 -0.095515 + 0.031107 -0.110043 -0.107781 + 0.019686 -0.105471 -0.120613 + 0.018444 -0.106940 -0.119686 + 0.018280 -0.104900 -0.117414 + 0.033697 -0.099914 -0.107684 + 0.020425 -0.098135 -0.120331 + 0.030916 -0.102259 -0.106108 + 0.018939 -0.096016 -0.116018 + 0.004401 -0.100805 -0.128422 + 0.003046 -0.102319 -0.127085 + 0.004126 -0.099199 -0.124164 + 0.004945 -0.091063 -0.122896 + 0.020909 -0.094096 -0.117685 + 0.005504 -0.093437 -0.128285 + 0.006223 -0.089217 -0.124766 + -0.011903 -0.095159 -0.131140 + -0.013421 -0.097198 -0.130084 + -0.011083 -0.093911 -0.127768 + -0.009983 -0.085689 -0.126315 + -0.009162 -0.085163 -0.129455 + -0.010949 -0.089296 -0.131649 + -0.028960 -0.091734 -0.130659 + -0.030031 -0.092008 -0.128952 + -0.026966 -0.089684 -0.127973 + -0.025514 -0.081311 -0.126843 + -0.025282 -0.080767 -0.129234 + -0.027088 -0.083422 -0.131519 + -0.044501 -0.084349 -0.126792 + -0.046331 -0.087202 -0.124840 + -0.042316 -0.084945 -0.124403 + -0.040735 -0.076729 -0.123885 + -0.041315 -0.076210 -0.127418 + -0.043088 -0.078015 -0.127953 + -0.059797 -0.081083 -0.120062 + -0.061431 -0.081447 -0.117846 + -0.056009 -0.079084 -0.117699 + -0.055301 -0.072198 -0.118184 + -0.056268 -0.070876 -0.121596 + -0.058621 -0.073171 -0.121837 + -0.074019 -0.074189 -0.112087 + -0.075928 -0.076613 -0.108725 + -0.069081 -0.073458 -0.108807 + -0.068400 -0.066054 -0.110285 + -0.070346 -0.066095 -0.113145 + -0.072726 -0.067847 -0.112817 + -0.087172 -0.070190 -0.100605 + -0.088414 -0.072066 -0.096638 + -0.081784 -0.068828 -0.098907 + -0.080556 -0.061305 -0.100035 + -0.083422 -0.061281 -0.103056 + -0.085754 -0.062753 -0.101976 + -0.097736 -0.064974 -0.086936 + -0.098039 -0.067723 -0.081709 + -0.090955 -0.063813 -0.085498 + -0.090722 -0.056813 -0.087411 + -0.092574 -0.057427 -0.088643 + -0.095835 -0.058422 -0.087577 + -0.102325 -0.060898 -0.069579 + -0.099190 -0.061496 -0.064594 + -0.095522 -0.060475 -0.068979 + -0.095216 -0.052632 -0.071230 + -0.099457 -0.054210 -0.072496 + -0.099414 -0.053633 -0.070407 + -0.100160 -0.054016 -0.052023 + -0.097723 -0.055288 -0.046870 + -0.093666 -0.056543 -0.051762 + -0.094072 -0.049211 -0.054180 + -0.097224 -0.048389 -0.055633 + -0.098326 -0.049092 -0.052222 + -0.093966 -0.049338 -0.037835 + -0.091040 -0.055082 -0.037116 + -0.086080 -0.055077 -0.036046 + -0.087978 -0.047479 -0.038108 + -0.090047 -0.045552 -0.039683 + -0.091618 -0.045412 -0.038343 + -0.081457 -0.050916 -0.022276 + -0.081551 -0.057621 -0.019781 + -0.076556 -0.058213 -0.022001 + -0.076569 -0.046303 -0.025658 + -0.079422 -0.045391 -0.025534 + -0.081194 -0.047340 -0.023415 + 0.061842 -0.142579 -0.094783 + 0.062904 -0.152962 -0.093248 + 0.050896 -0.150652 -0.108513 + 0.060406 -0.139559 -0.093436 + 0.051218 -0.139038 -0.109923 + 0.058867 -0.140089 -0.092520 + 0.058183 -0.151984 -0.089272 + 0.057569 -0.156741 -0.088042 + 0.048375 -0.154488 -0.104744 + 0.037085 -0.144492 -0.120089 + 0.036458 -0.148190 -0.117940 + 0.050706 -0.136379 -0.108219 + 0.036348 -0.133785 -0.118666 + 0.049790 -0.134708 -0.107802 + 0.047577 -0.148630 -0.104400 + 0.036994 -0.138984 -0.114180 + 0.021024 -0.140853 -0.128662 + 0.021005 -0.144041 -0.126898 + 0.022028 -0.133598 -0.122128 + 0.036651 -0.132278 -0.117089 + 0.021049 -0.130813 -0.127584 + 0.035063 -0.133645 -0.116368 + 0.019845 -0.129881 -0.123884 + 0.004647 -0.134324 -0.134456 + 0.005333 -0.136597 -0.132538 + 0.006856 -0.127401 -0.128729 + 0.004778 -0.123973 -0.129839 + 0.021954 -0.129163 -0.125124 + 0.005313 -0.124637 -0.133234 + 0.007049 -0.123603 -0.131024 + -0.011993 -0.127042 -0.137891 + -0.010509 -0.128409 -0.136381 + -0.008847 -0.120175 -0.131636 + -0.010864 -0.117533 -0.132202 + -0.008099 -0.116712 -0.133547 + -0.010503 -0.117057 -0.136184 + -0.028675 -0.119463 -0.136595 + -0.026861 -0.120877 -0.136047 + -0.024675 -0.112836 -0.130959 + -0.026062 -0.109292 -0.131299 + -0.023226 -0.109116 -0.133893 + -0.026470 -0.109132 -0.135473 + -0.044941 -0.111035 -0.133312 + -0.043211 -0.113928 -0.131867 + -0.040541 -0.106212 -0.127556 + -0.041206 -0.101702 -0.127447 + -0.038359 -0.102071 -0.130887 + -0.042523 -0.102216 -0.131993 + -0.061349 -0.106033 -0.126167 + -0.059520 -0.108654 -0.125635 + -0.056706 -0.103113 -0.121898 + -0.056332 -0.095525 -0.121475 + -0.053800 -0.096978 -0.126180 + -0.057971 -0.096254 -0.125168 + -0.076559 -0.099733 -0.116926 + -0.074652 -0.102772 -0.116703 + -0.071429 -0.098134 -0.113110 + -0.070760 -0.090737 -0.112629 + -0.067718 -0.091017 -0.117807 + -0.072917 -0.091150 -0.116460 + -0.090594 -0.095298 -0.104541 + -0.088271 -0.097200 -0.105029 + -0.085003 -0.092106 -0.102775 + -0.084154 -0.085325 -0.102239 + -0.081383 -0.086059 -0.108332 + -0.086633 -0.085669 -0.105814 + -0.101974 -0.091375 -0.089217 + -0.099868 -0.094497 -0.089854 + -0.096748 -0.089454 -0.089422 + -0.094254 -0.083594 -0.087310 + -0.091966 -0.081787 -0.095086 + -0.099082 -0.084671 -0.092332 + -0.103853 -0.085540 -0.070355 + -0.102470 -0.088122 -0.072115 + -0.100100 -0.084440 -0.071993 + -0.098762 -0.079377 -0.069720 + -0.097659 -0.077864 -0.078270 + -0.102511 -0.077680 -0.075261 + -0.101768 -0.077851 -0.051358 + -0.099713 -0.078608 -0.055145 + -0.097008 -0.078426 -0.053907 + -0.096785 -0.070974 -0.052898 + -0.096852 -0.070939 -0.060940 + -0.101504 -0.073042 -0.056091 + -0.093605 -0.075398 -0.039448 + -0.091864 -0.077172 -0.038561 + -0.090443 -0.076967 -0.036180 + -0.090248 -0.068124 -0.035472 + -0.093893 -0.065318 -0.043754 + -0.095455 -0.068335 -0.040093 + -0.085687 -0.075494 -0.020217 + -0.082341 -0.079324 -0.022121 + -0.079830 -0.075688 -0.021523 + -0.078966 -0.071987 -0.023150 + -0.086341 -0.066242 -0.028384 + -0.086676 -0.069942 -0.022827 + + + + + 0 1 2 + 3 4 0 + 0 2 5 + 3 0 5 + 4 1 0 + 4 6 1 + 6 2 1 + 2 7 8 + 6 9 2 + 2 8 5 + 9 7 2 + 10 3 5 + 11 12 3 + 3 10 11 + 12 4 3 + 12 13 4 + 13 6 4 + 10 5 8 + 13 14 6 + 14 9 6 + 9 15 7 + 15 8 7 + 15 10 8 + 14 16 9 + 16 15 9 + 17 11 10 + 17 10 15 + 18 19 11 + 18 11 17 + 19 12 11 + 19 20 12 + 20 13 12 + 20 21 13 + 21 14 13 + 21 22 14 + 22 16 14 + 16 17 15 + 22 23 16 + 23 17 16 + 23 18 17 + 24 25 18 + 24 18 23 + 25 19 18 + 25 26 19 + 26 20 19 + 26 27 20 + 27 21 20 + 27 28 21 + 28 22 21 + 28 29 22 + 29 23 22 + 29 24 23 + 30 31 24 + 30 24 29 + 31 25 24 + 31 32 25 + 32 26 25 + 32 33 26 + 33 27 26 + 33 34 27 + 34 28 27 + 34 35 28 + 35 29 28 + 35 30 29 + 36 37 30 + 37 31 30 + 36 30 35 + 37 38 31 + 38 32 31 + 38 39 32 + 39 33 32 + 39 40 33 + 40 34 33 + 40 41 34 + 41 35 34 + 41 36 35 + 42 43 36 + 42 36 41 + 43 37 36 + 43 44 37 + 38 37 44 + 44 45 38 + 45 39 38 + 45 46 39 + 46 40 39 + 46 47 40 + 47 41 40 + 47 42 41 + 48 49 42 + 48 42 47 + 49 43 42 + 49 50 43 + 50 44 43 + 50 51 44 + 51 45 44 + 51 52 45 + 52 46 45 + 52 53 46 + 53 47 46 + 53 48 47 + 54 55 48 + 54 48 53 + 55 49 48 + 56 49 55 + 56 50 49 + 56 57 50 + 57 51 50 + 57 58 51 + 58 52 51 + 58 59 52 + 59 53 52 + 59 54 53 + 60 61 54 + 60 54 59 + 61 55 54 + 61 62 55 + 56 55 62 + 62 63 56 + 63 57 56 + 63 64 57 + 64 58 57 + 64 65 58 + 65 59 58 + 65 60 59 + 66 67 60 + 66 60 65 + 67 61 60 + 67 68 61 + 68 62 61 + 68 69 62 + 63 62 69 + 69 70 63 + 70 64 63 + 70 71 64 + 71 65 64 + 71 66 65 + 72 73 66 + 73 67 66 + 72 66 71 + 73 74 67 + 74 68 67 + 74 75 68 + 75 69 68 + 75 76 69 + 76 70 69 + 76 77 70 + 77 71 70 + 77 72 71 + 78 79 72 + 78 72 77 + 79 73 72 + 79 80 73 + 80 74 73 + 80 81 74 + 81 75 74 + 81 82 75 + 82 76 75 + 82 83 76 + 83 77 76 + 83 78 77 + 84 85 78 + 84 78 83 + 85 79 78 + 85 86 79 + 86 80 79 + 86 87 80 + 87 81 80 + 87 88 81 + 88 82 81 + 88 89 82 + 89 83 82 + 89 84 83 + 90 91 84 + 90 84 89 + 91 85 84 + 91 92 85 + 92 86 85 + 92 93 86 + 93 87 86 + 93 94 87 + 94 88 87 + 94 95 88 + 95 89 88 + 95 90 89 + 90 95 94 + 91 90 94 + 91 93 92 + 91 94 93 + 96 97 98 + 97 96 99 + 96 100 101 + 96 98 100 + 96 101 99 + 98 97 102 + 97 99 102 + 98 103 100 + 103 98 104 + 98 102 104 + 102 99 105 + 99 101 106 + 99 106 105 + 103 107 100 + 100 107 108 + 100 108 101 + 101 108 109 + 101 109 106 + 104 102 110 + 102 105 110 + 107 103 111 + 103 104 111 + 111 104 112 + 104 110 112 + 110 105 113 + 105 106 114 + 105 114 113 + 106 109 115 + 106 115 114 + 107 111 108 + 108 111 116 + 108 116 109 + 109 116 117 + 109 117 115 + 112 110 118 + 110 113 118 + 111 112 116 + 116 112 119 + 112 118 119 + 118 113 120 + 113 114 121 + 113 121 120 + 114 115 122 + 114 122 121 + 115 117 123 + 115 123 122 + 116 119 117 + 117 119 124 + 117 124 123 + 119 118 125 + 118 120 125 + 119 125 124 + 125 120 126 + 120 121 127 + 120 127 126 + 121 122 128 + 128 127 121 + 122 123 129 + 122 129 128 + 123 124 130 + 123 130 129 + 124 125 131 + 124 131 130 + 125 126 131 + 131 126 132 + 126 127 133 + 126 133 132 + 127 128 134 + 127 134 133 + 128 129 135 + 128 135 134 + 129 130 136 + 129 136 135 + 130 131 137 + 130 137 136 + 131 132 137 + 137 132 138 + 132 133 139 + 132 139 138 + 133 134 140 + 133 140 139 + 134 135 141 + 134 141 140 + 135 136 142 + 135 142 141 + 136 137 143 + 136 143 142 + 137 138 143 + 143 138 144 + 138 139 145 + 138 145 144 + 140 146 139 + 139 146 145 + 140 141 147 + 140 147 146 + 141 142 148 + 141 148 147 + 143 149 142 + 142 149 148 + 143 144 149 + 149 144 150 + 144 145 151 + 144 151 150 + 145 146 152 + 145 152 151 + 146 147 153 + 146 153 152 + 147 148 154 + 147 154 153 + 149 155 148 + 148 155 154 + 149 150 155 + 155 150 156 + 150 151 157 + 150 157 156 + 151 152 158 + 151 158 157 + 152 153 159 + 152 159 158 + 153 154 160 + 153 160 159 + 154 155 161 + 154 161 160 + 155 156 161 + 161 156 162 + 156 157 163 + 156 163 162 + 157 158 164 + 157 164 163 + 158 159 165 + 158 165 164 + 159 160 166 + 159 166 165 + 160 161 167 + 160 167 166 + 161 162 167 + 167 162 168 + 162 163 169 + 162 169 168 + 163 164 170 + 163 170 169 + 164 165 171 + 164 171 170 + 165 166 172 + 165 172 171 + 166 167 173 + 166 173 172 + 167 168 173 + 173 168 174 + 168 169 175 + 168 175 174 + 169 170 176 + 169 176 175 + 170 171 177 + 170 177 176 + 171 172 178 + 171 178 177 + 172 173 179 + 172 179 178 + 173 174 179 + 179 174 180 + 174 175 181 + 174 181 180 + 175 176 182 + 175 182 181 + 176 177 183 + 176 183 182 + 177 178 184 + 177 184 183 + 178 179 185 + 178 185 184 + 179 180 185 + 186 180 181 + 187 180 186 + 188 185 180 + 187 188 180 + 181 182 189 + 181 189 190 + 190 186 181 + 182 183 191 + 182 191 189 + 183 184 192 + 183 192 191 + 184 185 188 + 184 188 192 + 187 186 190 + 188 187 192 + 192 187 190 + 192 190 189 + 192 189 191 + 193 194 195 + 193 195 196 + 197 194 193 + 197 193 198 + 198 193 196 + 199 200 194 + 199 194 197 + 200 201 194 + 195 194 201 + 196 195 201 + 201 202 196 + 198 196 202 + 203 199 197 + 203 197 204 + 204 197 198 + 205 204 198 + 205 198 202 + 206 207 199 + 206 199 203 + 207 200 199 + 207 208 200 + 208 209 200 + 200 209 201 + 209 210 201 + 201 210 202 + 210 205 202 + 211 206 203 + 211 203 212 + 212 203 204 + 212 204 205 + 213 212 205 + 213 205 210 + 214 215 206 + 214 206 211 + 215 207 206 + 215 216 207 + 216 208 207 + 216 217 208 + 217 218 208 + 208 218 209 + 218 213 209 + 209 213 210 + 219 214 211 + 219 211 220 + 220 211 212 + 220 212 213 + 218 220 213 + 221 222 214 + 221 214 219 + 222 215 214 + 222 223 215 + 223 216 215 + 223 224 216 + 224 217 216 + 224 225 217 + 225 226 217 + 217 226 218 + 226 220 218 + 227 221 219 + 227 219 226 + 226 219 220 + 228 229 221 + 228 221 227 + 229 222 221 + 229 230 222 + 230 223 222 + 230 231 223 + 231 224 223 + 231 232 224 + 232 225 224 + 232 233 225 + 233 227 225 + 227 226 225 + 228 227 233 + 234 235 228 + 235 229 228 + 234 228 233 + 235 236 229 + 236 230 229 + 236 237 230 + 237 231 230 + 237 238 231 + 238 232 231 + 238 239 232 + 239 233 232 + 239 234 233 + 240 241 234 + 240 234 239 + 241 235 234 + 241 242 235 + 242 236 235 + 242 243 236 + 243 237 236 + 243 244 237 + 244 238 237 + 244 245 238 + 245 239 238 + 245 240 239 + 246 247 240 + 246 240 245 + 247 241 240 + 247 248 241 + 248 242 241 + 248 249 242 + 249 243 242 + 249 250 243 + 250 244 243 + 250 251 244 + 251 245 244 + 251 246 245 + 252 253 246 + 252 246 251 + 253 247 246 + 253 254 247 + 254 248 247 + 254 255 248 + 255 249 248 + 255 256 249 + 256 250 249 + 256 257 250 + 257 251 250 + 257 252 251 + 258 259 252 + 258 252 257 + 259 253 252 + 259 260 253 + 260 254 253 + 260 261 254 + 261 255 254 + 261 262 255 + 262 256 255 + 262 263 256 + 263 257 256 + 263 258 257 + 264 265 258 + 258 263 264 + 265 259 258 + 265 266 259 + 266 260 259 + 266 267 260 + 267 261 260 + 267 268 261 + 268 262 261 + 268 269 262 + 269 263 262 + 269 264 263 + 270 271 264 + 271 265 264 + 270 264 269 + 271 272 265 + 272 266 265 + 272 273 266 + 273 267 266 + 273 274 267 + 274 268 267 + 274 275 268 + 275 269 268 + 275 270 269 + 276 277 270 + 277 271 270 + 276 270 275 + 277 278 271 + 278 272 271 + 278 279 272 + 279 273 272 + 279 280 273 + 280 274 273 + 280 281 274 + 281 275 274 + 281 276 275 + 282 283 276 + 282 276 281 + 283 277 276 + 283 284 277 + 284 278 277 + 284 285 278 + 285 279 278 + 285 286 279 + 286 280 279 + 286 287 280 + 287 281 280 + 287 282 281 + 284 282 285 + 284 283 282 + 282 287 286 + 286 285 282 + 288 289 290 + 291 292 288 + 288 290 293 + 291 288 293 + 292 289 288 + 289 294 295 + 292 296 289 + 289 295 290 + 296 294 289 + 297 298 290 + 293 290 298 + 297 290 295 + 291 298 299 + 293 298 291 + 291 299 300 + 300 292 291 + 300 301 292 + 301 296 292 + 296 302 294 + 302 295 294 + 302 297 295 + 301 303 296 + 303 302 296 + 304 305 297 + 305 298 297 + 304 297 302 + 305 299 298 + 306 307 299 + 300 299 307 + 306 299 305 + 300 307 308 + 308 301 300 + 308 309 301 + 309 303 301 + 303 304 302 + 309 310 303 + 310 304 303 + 310 311 304 + 311 305 304 + 311 306 305 + 312 313 306 + 313 307 306 + 312 306 311 + 313 314 307 + 308 307 314 + 308 314 315 + 315 309 308 + 315 316 309 + 316 310 309 + 316 317 310 + 317 311 310 + 317 312 311 + 318 319 312 + 318 312 317 + 319 313 312 + 319 320 313 + 320 314 313 + 320 321 314 + 315 314 321 + 315 321 322 + 322 316 315 + 322 323 316 + 323 317 316 + 323 318 317 + 324 325 318 + 324 318 323 + 325 319 318 + 325 326 319 + 326 320 319 + 326 327 320 + 327 321 320 + 327 328 321 + 322 321 328 + 322 328 329 + 329 323 322 + 329 324 323 + 330 331 324 + 330 324 329 + 331 325 324 + 331 332 325 + 332 326 325 + 332 333 326 + 333 327 326 + 333 334 327 + 334 328 327 + 334 335 328 + 329 328 335 + 329 335 330 + 330 335 336 + 330 336 337 + 337 331 330 + 337 338 331 + 338 332 331 + 338 339 332 + 339 333 332 + 339 340 333 + 340 334 333 + 340 341 334 + 341 335 334 + 341 336 335 + 342 343 336 + 337 336 343 + 342 336 341 + 337 343 344 + 344 338 337 + 344 345 338 + 345 339 338 + 345 346 339 + 346 340 339 + 346 347 340 + 347 341 340 + 347 342 341 + 348 349 342 + 349 343 342 + 348 342 347 + 349 350 343 + 344 343 350 + 344 350 351 + 351 345 344 + 351 352 345 + 352 346 345 + 352 353 346 + 353 347 346 + 348 347 353 + 354 348 355 + 355 348 353 + 354 349 348 + 354 356 349 + 356 350 349 + 356 357 350 + 350 357 351 + 351 357 358 + 358 352 351 + 358 359 352 + 359 353 352 + 359 355 353 + 360 354 355 + 360 361 354 + 361 356 354 + 362 360 355 + 362 355 359 + 361 363 356 + 363 357 356 + 363 364 357 + 358 357 364 + 358 364 365 + 365 359 358 + 365 362 359 + 366 360 362 + 366 367 360 + 367 361 360 + 367 368 361 + 368 363 361 + 369 366 362 + 369 362 365 + 368 370 363 + 370 364 363 + 370 371 364 + 365 364 371 + 365 371 369 + 372 366 369 + 372 367 366 + 372 373 367 + 373 368 367 + 373 374 368 + 374 370 368 + 369 371 375 + 369 375 372 + 374 376 370 + 376 371 370 + 376 375 371 + 372 375 377 + 377 373 372 + 378 374 373 + 378 373 377 + 376 374 378 + 379 380 375 + 375 380 377 + 379 375 376 + 378 379 376 + 378 377 379 + 377 380 379 + 381 382 383 + 384 385 381 + 385 382 381 + 386 381 383 + 387 384 381 + 387 381 386 + 382 388 383 + 389 388 382 + 389 382 390 + 390 382 385 + 383 388 391 + 392 383 391 + 386 383 392 + 384 393 394 + 385 384 394 + 395 393 384 + 395 384 387 + 390 385 396 + 396 385 394 + 392 397 386 + 386 397 398 + 386 398 387 + 387 398 399 + 387 399 395 + 388 400 391 + 401 400 388 + 401 388 389 + 402 401 389 + 402 389 403 + 403 389 390 + 403 390 397 + 397 390 396 + 391 400 404 + 405 391 404 + 392 391 405 + 405 403 392 + 392 403 397 + 406 394 393 + 407 406 393 + 408 407 393 + 408 393 395 + 396 394 409 + 409 394 406 + 395 399 410 + 395 410 408 + 397 396 398 + 398 396 409 + 398 409 399 + 399 409 411 + 399 411 410 + 400 412 404 + 413 412 400 + 413 400 401 + 414 413 401 + 414 401 402 + 415 414 402 + 415 402 405 + 405 402 403 + 416 417 404 + 416 404 412 + 415 404 417 + 405 404 415 + 418 406 407 + 409 406 411 + 411 406 418 + 419 418 407 + 420 419 407 + 420 407 408 + 408 410 421 + 408 421 420 + 410 411 422 + 410 422 421 + 411 418 422 + 423 416 412 + 423 412 413 + 424 423 413 + 424 413 414 + 425 424 414 + 425 414 415 + 415 417 425 + 426 427 416 + 426 416 423 + 416 427 428 + 417 416 428 + 425 417 428 + 422 418 429 + 418 419 429 + 419 430 429 + 431 430 419 + 431 419 420 + 420 421 432 + 420 432 431 + 421 422 429 + 421 429 432 + 433 426 423 + 433 423 424 + 434 433 424 + 434 424 425 + 425 428 434 + 435 436 426 + 436 427 426 + 435 426 433 + 436 437 427 + 427 437 428 + 434 428 438 + 437 438 428 + 432 429 439 + 440 439 429 + 440 429 430 + 441 440 430 + 441 430 431 + 431 432 442 + 431 442 441 + 432 439 442 + 443 435 433 + 443 433 434 + 434 438 443 + 444 445 435 + 445 436 435 + 444 435 443 + 445 446 436 + 446 437 436 + 446 447 437 + 438 437 447 + 443 438 448 + 448 438 447 + 442 439 449 + 450 449 439 + 450 439 440 + 451 450 440 + 451 440 441 + 441 442 452 + 441 452 451 + 442 449 452 + 443 448 444 + 453 445 444 + 444 454 453 + 444 448 454 + 453 455 445 + 455 446 445 + 455 456 446 + 456 447 446 + 456 457 447 + 447 457 448 + 457 454 448 + 450 452 449 + 450 451 452 + 453 456 455 + 453 454 456 + 454 457 456 + 458 459 460 + 461 462 458 + 461 458 463 + 462 464 458 + 463 458 460 + 458 464 459 + 459 465 460 + 464 466 459 + 459 466 467 + 459 467 465 + 465 468 460 + 463 460 469 + 470 469 460 + 460 471 472 + 460 472 470 + 460 468 473 + 473 471 460 + 474 475 461 + 475 462 461 + 474 461 476 + 476 461 463 + 477 462 475 + 477 478 462 + 462 478 464 + 476 463 479 + 479 463 469 + 478 480 464 + 464 480 466 + 468 465 481 + 465 467 482 + 465 482 481 + 480 472 466 + 466 472 471 + 466 471 467 + 467 471 483 + 467 483 482 + 482 473 468 + 482 468 481 + 479 469 470 + 470 472 484 + 470 484 479 + 473 483 471 + 480 484 472 + 482 483 473 + 485 486 474 + 474 486 487 + 487 475 474 + 485 474 476 + 488 477 475 + 488 475 489 + 487 489 475 + 476 490 485 + 479 490 476 + 488 491 477 + 477 491 478 + 491 492 478 + 478 492 480 + 479 484 490 + 492 484 480 + 492 490 484 + 493 486 485 + 493 485 494 + 494 485 490 + 495 496 486 + 495 486 493 + 487 486 496 + 487 496 497 + 497 489 487 + 498 488 489 + 499 488 498 + 488 499 491 + 500 498 489 + 497 500 489 + 494 490 492 + 499 494 491 + 491 494 492 + 501 495 493 + 501 493 499 + 499 493 494 + 502 503 495 + 502 495 501 + 503 496 495 + 503 504 496 + 497 496 504 + 497 504 505 + 505 500 497 + 506 507 498 + 506 498 500 + 507 501 498 + 498 501 499 + 505 506 500 + 507 502 501 + 508 509 502 + 508 502 507 + 509 503 502 + 509 510 503 + 510 504 503 + 510 511 504 + 505 504 511 + 505 511 512 + 512 506 505 + 512 513 506 + 513 507 506 + 513 508 507 + 514 515 508 + 514 508 513 + 515 509 508 + 515 516 509 + 516 510 509 + 516 517 510 + 517 511 510 + 517 518 511 + 512 511 518 + 512 518 519 + 519 513 512 + 519 514 513 + 520 521 514 + 521 515 514 + 520 514 519 + 521 522 515 + 522 516 515 + 522 523 516 + 523 517 516 + 523 524 517 + 524 518 517 + 524 525 518 + 519 518 525 + 519 525 520 + 520 526 527 + 527 521 520 + 520 525 526 + 527 528 521 + 528 522 521 + 528 529 522 + 529 523 522 + 529 530 523 + 530 524 523 + 530 531 524 + 531 525 524 + 531 526 525 + 532 533 526 + 527 526 533 + 532 526 531 + 527 533 534 + 534 528 527 + 534 535 528 + 535 529 528 + 535 536 529 + 536 530 529 + 536 537 530 + 537 531 530 + 537 532 531 + 538 539 532 + 538 532 537 + 539 533 532 + 539 540 533 + 534 533 540 + 534 540 541 + 541 535 534 + 541 542 535 + 542 536 535 + 542 543 536 + 543 537 536 + 543 538 537 + 544 545 538 + 544 538 543 + 545 539 538 + 545 546 539 + 546 540 539 + 546 547 540 + 541 540 547 + 541 547 548 + 548 542 541 + 548 549 542 + 549 543 542 + 549 544 543 + 548 547 544 + 548 544 549 + 547 545 544 + 547 546 545 + 550 551 552 + 553 554 550 + 554 551 550 + 553 550 552 + 551 555 552 + 551 556 555 + 554 557 551 + 557 556 551 + 552 555 558 + 552 558 553 + 553 558 559 + 560 554 553 + 553 559 560 + 560 561 554 + 561 557 554 + 555 556 558 + 557 562 556 + 556 562 558 + 561 563 557 + 563 562 557 + 559 558 562 + 560 559 564 + 559 565 564 + 565 559 562 + 566 561 560 + 560 564 566 + 566 567 561 + 567 563 561 + 563 565 562 + 567 568 563 + 568 565 563 + 566 564 569 + 565 570 564 + 569 564 570 + 568 570 565 + 571 567 566 + 566 569 571 + 572 568 567 + 571 572 567 + 572 573 568 + 573 570 568 + 571 569 574 + 575 569 570 + 569 575 574 + 573 575 570 + 576 572 571 + 571 574 576 + 577 573 572 + 576 577 572 + 577 578 573 + 578 575 573 + 576 574 579 + 575 580 574 + 579 574 580 + 578 580 575 + 581 577 576 + 576 579 581 + 582 578 577 + 581 582 577 + 582 583 578 + 583 580 578 + 581 579 584 + 585 584 579 + 586 585 579 + 586 579 580 + 583 586 580 + 587 582 581 + 581 584 587 + 588 583 582 + 587 588 582 + 588 589 583 + 589 586 583 + 587 584 590 + 585 591 584 + 591 590 584 + 589 585 586 + 592 585 589 + 592 591 585 + 593 588 587 + 587 590 593 + 594 589 588 + 593 594 588 + 594 592 589 + 593 590 595 + 596 595 590 + 591 596 590 + 597 591 592 + 597 596 591 + 598 597 592 + 598 592 594 + 599 594 593 + 593 595 599 + 599 598 594 + 599 595 600 + 601 600 595 + 596 601 595 + 602 596 597 + 602 601 596 + 603 602 597 + 603 597 598 + 604 603 598 + 604 598 599 + 599 600 604 + 604 600 605 + 606 607 600 + 605 600 607 + 601 606 600 + 608 601 602 + 608 606 601 + 609 608 602 + 609 602 603 + 610 609 603 + 610 603 604 + 604 605 610 + 610 605 611 + 611 605 607 + 612 606 608 + 612 607 606 + 613 607 612 + 613 614 607 + 607 614 611 + 615 612 608 + 615 608 609 + 616 615 609 + 616 609 610 + 610 611 616 + 616 611 617 + 614 617 611 + 618 613 612 + 618 612 615 + 619 620 613 + 620 614 613 + 619 613 618 + 620 621 614 + 614 621 617 + 622 618 615 + 622 615 616 + 616 617 622 + 622 617 623 + 621 623 617 + 624 619 618 + 624 618 622 + 625 620 619 + 626 625 619 + 626 619 624 + 625 627 620 + 627 621 620 + 627 628 621 + 628 629 621 + 629 623 621 + 622 623 624 + 629 630 623 + 630 624 623 + 624 630 626 + 629 625 626 + 629 627 625 + 630 629 626 + 627 629 628 + 631 632 633 + 634 635 631 + 634 631 636 + 635 637 631 + 636 631 633 + 631 637 632 + 632 638 639 + 637 638 632 + 632 639 640 + 633 632 640 + 633 640 641 + 642 633 641 + 636 633 642 + 643 644 634 + 643 634 645 + 644 635 634 + 645 634 636 + 644 646 635 + 646 647 635 + 635 647 637 + 645 636 648 + 648 636 642 + 647 649 637 + 637 649 638 + 638 650 639 + 638 651 650 + 649 651 638 + 639 652 653 + 639 650 652 + 640 639 653 + 640 653 654 + 641 640 654 + 642 641 655 + 641 654 656 + 655 641 656 + 657 642 655 + 648 642 657 + 658 659 643 + 658 643 660 + 659 644 643 + 660 643 645 + 659 661 644 + 661 646 644 + 660 645 662 + 662 645 648 + 661 663 646 + 663 664 646 + 646 664 647 + 664 665 647 + 647 665 649 + 662 648 649 + 649 648 657 + 665 662 649 + 649 657 651 + 651 666 650 + 650 667 652 + 650 666 667 + 651 657 666 + 656 652 667 + 656 653 652 + 656 654 653 + 657 655 666 + 655 656 668 + 666 655 668 + 656 667 668 + 669 670 658 + 669 658 671 + 670 659 658 + 671 658 660 + 670 672 659 + 672 661 659 + 671 660 673 + 673 660 662 + 672 674 661 + 674 663 661 + 673 662 665 + 674 675 663 + 675 676 663 + 663 676 664 + 676 673 664 + 664 673 665 + 666 668 667 + 677 678 669 + 678 670 669 + 677 669 679 + 679 669 671 + 678 680 670 + 680 672 670 + 679 671 676 + 676 671 673 + 680 681 672 + 681 674 672 + 681 682 674 + 682 675 674 + 682 683 675 + 683 679 675 + 675 679 676 + 684 685 677 + 684 677 683 + 685 678 677 + 683 677 679 + 685 686 678 + 686 680 678 + 686 687 680 + 687 681 680 + 687 688 681 + 688 682 681 + 688 689 682 + 689 683 682 + 689 684 683 + 690 691 684 + 690 684 689 + 691 685 684 + 691 692 685 + 692 686 685 + 692 693 686 + 693 687 686 + 693 694 687 + 694 688 687 + 694 695 688 + 695 689 688 + 695 690 689 + 696 697 690 + 696 690 695 + 697 691 690 + 697 698 691 + 698 692 691 + 698 699 692 + 699 693 692 + 699 700 693 + 700 694 693 + 700 701 694 + 701 695 694 + 701 696 695 + 702 703 696 + 702 696 701 + 703 697 696 + 703 704 697 + 704 698 697 + 704 705 698 + 705 699 698 + 705 706 699 + 706 700 699 + 706 707 700 + 707 701 700 + 707 702 701 + 708 709 702 + 708 702 707 + 709 703 702 + 709 710 703 + 710 704 703 + 710 711 704 + 711 705 704 + 712 705 711 + 712 706 705 + 712 713 706 + 713 707 706 + 713 708 707 + 714 715 708 + 715 709 708 + 714 708 713 + 715 716 709 + 716 710 709 + 716 717 710 + 717 711 710 + 717 718 711 + 712 711 718 + 718 719 712 + 719 713 712 + 719 714 713 + 720 721 714 + 721 715 714 + 720 714 719 + 721 722 715 + 722 716 715 + 722 723 716 + 723 717 716 + 723 724 717 + 724 718 717 + 724 725 718 + 725 719 718 + 725 720 719 + 725 721 720 + 721 725 724 + 721 724 723 + 721 723 722 + 726 727 728 + 726 728 729 + 727 726 730 + 730 726 731 + 726 732 731 + 726 729 732 + 728 727 733 + 727 734 733 + 727 730 734 + 729 728 735 + 728 733 735 + 729 735 732 + 730 731 734 + 734 731 736 + 731 737 736 + 731 732 737 + 732 738 737 + 732 735 738 + 735 733 739 + 733 740 739 + 733 734 740 + 734 736 740 + 735 739 738 + 740 736 741 + 736 742 741 + 736 737 742 + 737 743 742 + 737 738 743 + 738 744 743 + 738 739 744 + 739 740 745 + 739 745 744 + 740 741 745 + 745 741 746 + 741 747 746 + 741 742 747 + 742 748 747 + 742 743 748 + 743 749 748 + 743 744 749 + 744 750 749 + 744 745 750 + 745 746 750 + 746 747 751 + 746 751 752 + 750 746 752 + 747 753 751 + 747 748 753 + 748 754 753 + 748 749 754 + 749 755 754 + 749 750 755 + 750 752 755 + 751 753 756 + 751 756 757 + 752 751 757 + 755 752 758 + 752 757 758 + 753 759 756 + 753 754 759 + 754 760 759 + 754 755 760 + 755 758 760 + 756 759 761 + 756 761 762 + 757 756 762 + 758 757 763 + 757 762 763 + 760 758 764 + 758 763 764 + 759 765 761 + 759 760 765 + 760 764 765 + 761 765 766 + 761 766 767 + 762 761 767 + 762 767 768 + 763 762 768 + 764 763 769 + 763 768 769 + 765 764 770 + 764 769 770 + 765 770 766 + 766 770 771 + 766 771 772 + 767 766 772 + 767 772 773 + 768 767 773 + 769 768 774 + 768 773 774 + 770 769 775 + 769 774 775 + 775 771 770 + 771 775 772 + 775 773 772 + 775 774 773 + 776 777 778 + 779 776 780 + 781 782 776 + 776 778 780 + 782 777 776 + 781 776 779 + 782 783 777 + 777 784 785 + 777 785 778 + 783 784 777 + 778 785 786 + 778 786 780 + 784 779 786 + 787 781 779 + 787 779 784 + 779 780 786 + 788 789 781 + 788 781 787 + 789 782 781 + 789 790 782 + 790 783 782 + 790 791 783 + 783 787 784 + 791 787 783 + 784 786 785 + 791 788 787 + 792 793 788 + 792 788 791 + 793 789 788 + 793 794 789 + 794 790 789 + 794 795 790 + 795 791 790 + 795 792 791 + 796 797 792 + 796 792 795 + 797 793 792 + 797 798 793 + 798 794 793 + 798 799 794 + 799 795 794 + 799 796 795 + 800 801 796 + 801 797 796 + 800 796 799 + 801 802 797 + 802 798 797 + 802 803 798 + 803 799 798 + 803 800 799 + 804 805 800 + 804 800 803 + 805 801 800 + 805 806 801 + 806 802 801 + 806 807 802 + 807 803 802 + 807 804 803 + 808 809 804 + 808 804 807 + 809 805 804 + 809 810 805 + 810 806 805 + 810 811 806 + 811 807 806 + 811 808 807 + 812 813 808 + 812 808 811 + 813 809 808 + 813 814 809 + 814 810 809 + 814 815 810 + 815 811 810 + 815 812 811 + 816 817 812 + 817 813 812 + 816 812 815 + 817 818 813 + 818 814 813 + 818 819 814 + 819 815 814 + 819 816 815 + 820 821 816 + 820 816 819 + 821 817 816 + 821 822 817 + 822 818 817 + 822 823 818 + 823 819 818 + 823 820 819 + 824 825 820 + 824 820 823 + 825 821 820 + 825 826 821 + 826 822 821 + 826 827 822 + 827 823 822 + 827 824 823 + 828 829 824 + 824 827 828 + 829 825 824 + 829 830 825 + 830 826 825 + 830 831 826 + 831 827 826 + 831 828 827 + 832 833 828 + 833 829 828 + 832 828 831 + 833 834 829 + 834 830 829 + 834 835 830 + 835 831 830 + 835 832 831 + 836 837 832 + 836 832 835 + 837 833 832 + 837 838 833 + 838 834 833 + 838 839 834 + 839 835 834 + 839 836 835 + 836 839 838 + 836 838 837 + 840 841 842 + 843 840 844 + 845 846 840 + 844 840 842 + 840 846 841 + 843 845 840 + 846 847 841 + 842 841 847 + 844 842 848 + 842 847 848 + 849 843 850 + 851 845 843 + 850 843 844 + 849 851 843 + 850 844 852 + 852 844 848 + 853 854 845 + 845 854 846 + 851 853 845 + 854 852 846 + 846 852 847 + 852 848 847 + 855 849 856 + 857 851 849 + 856 849 850 + 855 857 849 + 856 850 854 + 854 850 852 + 858 853 851 + 857 858 851 + 859 856 853 + 853 856 854 + 858 859 853 + 860 855 859 + 861 857 855 + 859 855 856 + 860 861 855 + 862 858 857 + 861 862 857 + 863 859 858 + 862 863 858 + 863 860 859 + 864 860 863 + 865 861 860 + 864 865 860 + 866 862 861 + 865 866 861 + 867 863 862 + 866 867 862 + 867 864 863 + 868 864 867 + 869 865 864 + 868 869 864 + 870 866 865 + 869 870 865 + 871 867 866 + 870 871 866 + 871 868 867 + 872 868 871 + 873 869 868 + 872 873 868 + 874 870 869 + 873 874 869 + 875 871 870 + 874 875 870 + 875 872 871 + 876 872 875 + 877 873 872 + 876 877 872 + 878 874 873 + 877 878 873 + 879 875 874 + 878 879 874 + 879 876 875 + 880 876 879 + 881 877 876 + 880 881 876 + 882 878 877 + 881 882 877 + 883 879 878 + 882 883 878 + 883 880 879 + 884 880 883 + 885 881 880 + 884 885 880 + 886 882 881 + 885 886 881 + 887 883 882 + 886 887 882 + 887 884 883 + 888 884 887 + 889 885 884 + 888 889 884 + 890 886 885 + 889 890 885 + 891 887 886 + 890 891 886 + 891 888 887 + 892 888 891 + 893 889 888 + 892 893 888 + 894 890 889 + 893 894 889 + 895 891 890 + 894 895 890 + 895 892 891 + 896 892 895 + 897 893 892 + 896 897 892 + 898 894 893 + 897 898 893 + 899 895 894 + 898 899 894 + 899 896 895 + 900 896 899 + 901 897 896 + 900 901 896 + 902 897 901 + 897 902 898 + 902 903 898 + 904 899 898 + 903 904 898 + 904 900 899 + 900 904 903 + 901 900 903 + 903 902 901 + 905 906 907 + 908 905 909 + 910 911 905 + 905 907 909 + 911 906 905 + 910 905 908 + 911 912 906 + 906 913 914 + 906 914 907 + 912 913 906 + 907 914 915 + 916 909 907 + 916 907 915 + 917 908 918 + 919 910 908 + 919 908 917 + 908 909 918 + 916 918 909 + 920 921 910 + 920 910 919 + 921 911 910 + 921 922 911 + 922 912 911 + 922 923 912 + 912 924 913 + 923 924 912 + 913 925 915 + 913 915 914 + 924 925 913 + 925 916 915 + 925 917 916 + 917 918 916 + 926 919 917 + 926 917 925 + 927 920 919 + 927 919 926 + 928 929 920 + 928 920 927 + 929 921 920 + 929 930 921 + 930 922 921 + 930 931 922 + 931 923 922 + 931 932 923 + 923 933 924 + 932 933 923 + 924 926 925 + 933 926 924 + 933 927 926 + 934 928 927 + 934 927 933 + 935 936 928 + 935 928 934 + 936 929 928 + 936 937 929 + 937 930 929 + 937 938 930 + 938 931 930 + 938 939 931 + 939 932 931 + 939 940 932 + 932 934 933 + 940 934 932 + 940 935 934 + 941 942 935 + 941 935 940 + 936 935 942 + 942 943 936 + 943 937 936 + 943 944 937 + 944 938 937 + 944 945 938 + 945 939 938 + 945 946 939 + 946 940 939 + 946 941 940 + 947 948 941 + 947 941 946 + 948 942 941 + 948 949 942 + 949 943 942 + 949 950 943 + 950 944 943 + 950 951 944 + 951 945 944 + 951 952 945 + 952 946 945 + 952 947 946 + 953 954 947 + 954 948 947 + 953 947 952 + 954 955 948 + 955 949 948 + 955 956 949 + 956 950 949 + 956 957 950 + 957 951 950 + 957 958 951 + 958 952 951 + 958 953 952 + 959 960 953 + 959 953 958 + 960 954 953 + 960 961 954 + 961 955 954 + 961 962 955 + 962 956 955 + 962 963 956 + 963 957 956 + 963 964 957 + 964 958 957 + 964 959 958 + 965 966 959 + 965 959 964 + 966 960 959 + 966 967 960 + 967 961 960 + 967 968 961 + 968 962 961 + 968 969 962 + 969 963 962 + 969 970 963 + 970 964 963 + 970 965 964 + 971 965 972 + 972 965 970 + 971 966 965 + 971 973 966 + 973 967 966 + 973 974 967 + 974 968 967 + 974 975 968 + 975 969 968 + 975 976 969 + 976 970 969 + 976 972 970 + 977 971 972 + 977 978 971 + 978 973 971 + 979 977 972 + 979 972 976 + 978 980 973 + 980 974 973 + 980 981 974 + 981 975 974 + 981 982 975 + 982 976 975 + 982 979 976 + 983 977 979 + 983 984 977 + 984 978 977 + 984 985 978 + 985 980 978 + 986 983 979 + 986 979 982 + 985 987 980 + 987 981 980 + 987 988 981 + 988 982 981 + 988 986 982 + 989 983 986 + 989 990 983 + 990 984 983 + 990 991 984 + 991 985 984 + 991 992 985 + 992 987 985 + 993 989 986 + 993 986 988 + 992 994 987 + 994 988 987 + 994 993 988 + 995 989 993 + 995 996 989 + 996 990 989 + 996 997 990 + 997 991 990 + 997 998 991 + 998 992 991 + 998 999 992 + 999 994 992 + 1000 995 993 + 1000 993 994 + 999 1000 994 + 995 1000 999 + 995 999 998 + 995 998 997 + 995 997 996 + 1001 1002 1003 + 1004 1001 1005 + 1006 1007 1001 + 1001 1003 1005 + 1007 1002 1001 + 1006 1001 1004 + 1007 1008 1002 + 1002 1009 1010 + 1002 1010 1003 + 1008 1009 1002 + 1003 1010 1011 + 1003 1011 1012 + 1003 1012 1013 + 1003 1013 1005 + 1014 1004 1013 + 1015 1006 1004 + 1015 1004 1014 + 1004 1005 1013 + 1016 1017 1006 + 1016 1006 1015 + 1017 1007 1006 + 1017 1018 1007 + 1018 1008 1007 + 1018 1019 1008 + 1008 1020 1009 + 1019 1020 1008 + 1009 1021 1011 + 1009 1011 1010 + 1020 1021 1009 + 1021 1012 1011 + 1021 1014 1012 + 1014 1013 1012 + 1022 1015 1014 + 1022 1014 1021 + 1023 1016 1015 + 1023 1015 1022 + 1024 1025 1016 + 1024 1016 1023 + 1025 1017 1016 + 1025 1026 1017 + 1026 1018 1017 + 1026 1027 1018 + 1027 1019 1018 + 1027 1028 1019 + 1019 1029 1020 + 1028 1029 1019 + 1020 1022 1021 + 1029 1022 1020 + 1029 1023 1022 + 1030 1024 1023 + 1030 1023 1029 + 1031 1032 1024 + 1031 1024 1030 + 1032 1025 1024 + 1032 1033 1025 + 1033 1026 1025 + 1033 1034 1026 + 1034 1027 1026 + 1034 1035 1027 + 1035 1028 1027 + 1035 1036 1028 + 1028 1030 1029 + 1036 1030 1028 + 1036 1031 1030 + 1037 1038 1031 + 1037 1031 1036 + 1038 1032 1031 + 1038 1039 1032 + 1039 1033 1032 + 1039 1040 1033 + 1040 1034 1033 + 1040 1041 1034 + 1041 1035 1034 + 1041 1042 1035 + 1042 1036 1035 + 1042 1037 1036 + 1043 1044 1037 + 1043 1037 1042 + 1044 1038 1037 + 1044 1045 1038 + 1045 1039 1038 + 1045 1046 1039 + 1046 1040 1039 + 1046 1047 1040 + 1047 1041 1040 + 1047 1048 1041 + 1048 1042 1041 + 1048 1043 1042 + 1049 1050 1043 + 1050 1044 1043 + 1049 1043 1048 + 1050 1051 1044 + 1051 1045 1044 + 1051 1052 1045 + 1052 1046 1045 + 1052 1053 1046 + 1053 1047 1046 + 1053 1054 1047 + 1054 1048 1047 + 1054 1049 1048 + 1055 1056 1049 + 1055 1049 1054 + 1056 1050 1049 + 1056 1057 1050 + 1057 1051 1050 + 1057 1058 1051 + 1058 1052 1051 + 1058 1059 1052 + 1059 1053 1052 + 1059 1060 1053 + 1060 1054 1053 + 1060 1055 1054 + 1061 1062 1055 + 1061 1055 1060 + 1062 1056 1055 + 1062 1063 1056 + 1063 1057 1056 + 1063 1064 1057 + 1064 1058 1057 + 1064 1065 1058 + 1065 1059 1058 + 1065 1066 1059 + 1066 1060 1059 + 1066 1061 1060 + 1067 1068 1061 + 1067 1061 1066 + 1068 1062 1061 + 1068 1069 1062 + 1069 1063 1062 + 1069 1070 1063 + 1070 1064 1063 + 1070 1071 1064 + 1071 1065 1064 + 1071 1072 1065 + 1072 1066 1065 + 1072 1067 1066 + 1073 1074 1067 + 1073 1067 1072 + 1074 1068 1067 + 1074 1075 1068 + 1075 1069 1068 + 1075 1076 1069 + 1076 1070 1069 + 1076 1077 1070 + 1077 1071 1070 + 1078 1071 1077 + 1078 1072 1071 + 1078 1073 1072 + 1079 1080 1073 + 1079 1073 1078 + 1080 1074 1073 + 1080 1081 1074 + 1081 1075 1074 + 1081 1082 1075 + 1082 1076 1075 + 1082 1083 1076 + 1083 1077 1076 + 1083 1084 1077 + 1084 1078 1077 + 1084 1079 1078 + 1085 1086 1079 + 1086 1080 1079 + 1085 1079 1084 + 1086 1087 1080 + 1087 1081 1080 + 1087 1088 1081 + 1088 1082 1081 + 1088 1089 1082 + 1089 1083 1082 + 1089 1090 1083 + 1090 1084 1083 + 1090 1085 1084 + 1091 1092 1085 + 1091 1085 1090 + 1092 1086 1085 + 1092 1093 1086 + 1093 1087 1086 + 1093 1094 1087 + 1094 1088 1087 + 1094 1095 1088 + 1095 1089 1088 + 1095 1096 1089 + 1096 1090 1089 + 1096 1091 1090 + 1091 1096 1093 + 1091 1093 1092 + 1093 1096 1095 + 1093 1095 1094 + 1097 1098 1099 + 1100 1097 1101 + 1102 1103 1097 + 1097 1099 1101 + 1103 1098 1097 + 1102 1097 1100 + 1103 1104 1098 + 1098 1105 1106 + 1098 1106 1099 + 1104 1105 1098 + 1099 1106 1107 + 1099 1107 1108 + 1099 1108 1109 + 1099 1109 1101 + 1110 1100 1109 + 1111 1102 1100 + 1100 1110 1111 + 1100 1101 1109 + 1112 1113 1102 + 1112 1102 1111 + 1113 1103 1102 + 1113 1114 1103 + 1114 1104 1103 + 1114 1115 1104 + 1104 1116 1105 + 1115 1116 1104 + 1105 1117 1107 + 1105 1107 1106 + 1116 1117 1105 + 1117 1108 1107 + 1117 1110 1108 + 1110 1109 1108 + 1118 1111 1110 + 1118 1110 1117 + 1119 1112 1111 + 1119 1111 1118 + 1120 1121 1112 + 1120 1112 1119 + 1121 1113 1112 + 1121 1122 1113 + 1122 1114 1113 + 1122 1123 1114 + 1123 1115 1114 + 1123 1124 1115 + 1115 1125 1116 + 1124 1125 1115 + 1116 1118 1117 + 1125 1118 1116 + 1125 1119 1118 + 1126 1120 1119 + 1126 1119 1125 + 1127 1128 1120 + 1127 1120 1126 + 1128 1121 1120 + 1128 1129 1121 + 1129 1122 1121 + 1129 1130 1122 + 1130 1123 1122 + 1130 1131 1123 + 1131 1124 1123 + 1131 1132 1124 + 1124 1126 1125 + 1132 1126 1124 + 1132 1127 1126 + 1133 1134 1127 + 1133 1127 1132 + 1134 1128 1127 + 1134 1135 1128 + 1135 1129 1128 + 1135 1136 1129 + 1136 1130 1129 + 1136 1137 1130 + 1137 1131 1130 + 1137 1138 1131 + 1138 1132 1131 + 1138 1133 1132 + 1139 1140 1133 + 1139 1133 1138 + 1140 1134 1133 + 1140 1141 1134 + 1141 1135 1134 + 1141 1142 1135 + 1142 1136 1135 + 1142 1143 1136 + 1143 1137 1136 + 1143 1144 1137 + 1144 1138 1137 + 1144 1139 1138 + 1145 1146 1139 + 1146 1140 1139 + 1145 1139 1144 + 1146 1147 1140 + 1147 1141 1140 + 1147 1148 1141 + 1148 1142 1141 + 1148 1149 1142 + 1149 1143 1142 + 1149 1150 1143 + 1150 1144 1143 + 1150 1145 1144 + 1151 1152 1145 + 1151 1145 1150 + 1152 1146 1145 + 1152 1153 1146 + 1153 1147 1146 + 1153 1154 1147 + 1154 1148 1147 + 1154 1155 1148 + 1155 1149 1148 + 1155 1156 1149 + 1156 1150 1149 + 1156 1151 1150 + 1157 1158 1151 + 1157 1151 1156 + 1158 1152 1151 + 1158 1159 1152 + 1159 1153 1152 + 1159 1160 1153 + 1160 1154 1153 + 1160 1161 1154 + 1161 1155 1154 + 1161 1162 1155 + 1162 1156 1155 + 1162 1157 1156 + 1163 1164 1157 + 1163 1157 1162 + 1164 1158 1157 + 1164 1165 1158 + 1159 1158 1165 + 1165 1166 1159 + 1166 1160 1159 + 1166 1167 1160 + 1167 1161 1160 + 1167 1168 1161 + 1168 1162 1161 + 1168 1163 1162 + 1169 1170 1163 + 1169 1163 1168 + 1170 1164 1163 + 1170 1171 1164 + 1171 1165 1164 + 1171 1172 1165 + 1172 1166 1165 + 1172 1173 1166 + 1173 1167 1166 + 1173 1174 1167 + 1174 1168 1167 + 1174 1169 1168 + 1175 1176 1169 + 1175 1169 1174 + 1176 1170 1169 + 1176 1177 1170 + 1177 1171 1170 + 1177 1178 1171 + 1178 1172 1171 + 1178 1179 1172 + 1179 1173 1172 + 1179 1180 1173 + 1180 1174 1173 + 1180 1175 1174 + 1181 1182 1175 + 1182 1176 1175 + 1181 1175 1180 + 1182 1183 1176 + 1183 1177 1176 + 1183 1184 1177 + 1184 1178 1177 + 1184 1185 1178 + 1185 1179 1178 + 1185 1186 1179 + 1186 1180 1179 + 1186 1181 1180 + 1187 1188 1181 + 1181 1186 1187 + 1188 1182 1181 + 1188 1189 1182 + 1189 1183 1182 + 1189 1190 1183 + 1190 1184 1183 + 1190 1191 1184 + 1191 1185 1184 + 1191 1192 1185 + 1192 1186 1185 + 1192 1187 1186 + 1188 1187 1190 + 1192 1191 1187 + 1187 1191 1190 + 1188 1190 1189 + 1193 1194 1195 + 1196 1197 1193 + 1196 1193 1198 + 1197 1199 1193 + 1193 1195 1198 + 1193 1199 1194 + 1199 1200 1194 + 1194 1201 1202 + 1194 1200 1201 + 1195 1194 1202 + 1198 1195 1203 + 1195 1202 1204 + 1203 1195 1204 + 1205 1196 1198 + 1206 1207 1196 + 1207 1197 1196 + 1206 1196 1205 + 1208 1209 1197 + 1207 1208 1197 + 1209 1210 1197 + 1199 1197 1210 + 1205 1198 1211 + 1211 1198 1203 + 1199 1210 1200 + 1200 1212 1201 + 1200 1213 1212 + 1210 1213 1200 + 1201 1214 1215 + 1202 1201 1215 + 1201 1212 1214 + 1202 1215 1216 + 1204 1202 1216 + 1203 1204 1217 + 1218 1203 1217 + 1211 1203 1218 + 1217 1204 1219 + 1204 1216 1219 + 1220 1205 1221 + 1220 1222 1205 + 1222 1206 1205 + 1221 1205 1223 + 1205 1211 1223 + 1224 1206 1222 + 1224 1225 1206 + 1225 1207 1206 + 1225 1226 1207 + 1226 1208 1207 + 1208 1227 1209 + 1226 1228 1208 + 1228 1227 1208 + 1227 1221 1209 + 1210 1209 1221 + 1210 1223 1213 + 1223 1210 1221 + 1223 1211 1218 + 1212 1229 1230 + 1212 1230 1214 + 1213 1229 1212 + 1213 1218 1229 + 1223 1218 1213 + 1214 1231 1232 + 1215 1214 1232 + 1214 1230 1231 + 1215 1232 1233 + 1216 1215 1233 + 1216 1233 1234 + 1219 1216 1234 + 1217 1219 1235 + 1229 1217 1235 + 1218 1217 1229 + 1219 1234 1236 + 1235 1219 1236 + 1237 1222 1220 + 1237 1220 1227 + 1227 1220 1221 + 1237 1224 1222 + 1238 1224 1237 + 1238 1239 1224 + 1239 1225 1224 + 1239 1240 1225 + 1240 1226 1225 + 1241 1228 1226 + 1240 1241 1226 + 1228 1237 1227 + 1242 1237 1228 + 1241 1242 1228 + 1229 1235 1230 + 1230 1243 1231 + 1230 1235 1243 + 1231 1244 1245 + 1232 1231 1245 + 1231 1243 1244 + 1232 1245 1246 + 1233 1232 1246 + 1233 1246 1247 + 1234 1233 1247 + 1234 1247 1248 + 1236 1234 1248 + 1235 1236 1243 + 1236 1248 1249 + 1243 1236 1249 + 1250 1238 1237 + 1250 1237 1242 + 1251 1239 1238 + 1252 1251 1238 + 1252 1238 1250 + 1251 1253 1239 + 1253 1240 1239 + 1253 1254 1240 + 1254 1241 1240 + 1254 1255 1241 + 1255 1242 1241 + 1250 1242 1255 + 1243 1249 1244 + 1244 1256 1257 + 1245 1244 1257 + 1244 1249 1256 + 1245 1257 1258 + 1246 1245 1258 + 1246 1258 1259 + 1247 1246 1259 + 1247 1259 1260 + 1248 1247 1260 + 1248 1260 1261 + 1249 1248 1261 + 1249 1261 1256 + 1262 1252 1250 + 1262 1250 1255 + 1263 1253 1251 + 1264 1263 1251 + 1264 1251 1252 + 1265 1264 1252 + 1265 1252 1262 + 1263 1266 1253 + 1266 1254 1253 + 1266 1267 1254 + 1267 1255 1254 + 1267 1268 1255 + 1268 1262 1255 + 1256 1269 1270 + 1257 1256 1270 + 1256 1261 1269 + 1257 1270 1271 + 1258 1257 1271 + 1258 1271 1272 + 1259 1258 1272 + 1259 1272 1273 + 1260 1259 1273 + 1261 1260 1273 + 1261 1273 1269 + 1268 1265 1262 + 1265 1266 1263 + 1263 1264 1265 + 1267 1265 1268 + 1265 1267 1266 + 1274 1270 1269 + 1275 1274 1269 + 1269 1276 1275 + 1273 1277 1269 + 1277 1276 1269 + 1278 1271 1270 + 1279 1278 1270 + 1270 1274 1279 + 1271 1280 1272 + 1271 1278 1280 + 1272 1281 1273 + 1280 1282 1272 + 1272 1282 1281 + 1273 1283 1284 + 1284 1277 1273 + 1281 1283 1273 + 1279 1274 1285 + 1275 1285 1274 + 1275 1276 1286 + 1285 1275 1286 + 1277 1286 1276 + 1277 1284 1287 + 1286 1277 1287 + 1280 1278 1288 + 1279 1288 1278 + 1288 1279 1285 + 1280 1289 1282 + 1289 1280 1288 + 1281 1290 1283 + 1281 1282 1290 + 1282 1289 1290 + 1283 1290 1287 + 1284 1283 1287 + 1288 1285 1289 + 1285 1286 1289 + 1286 1287 1289 + 1287 1290 1289 + 1291 1292 1293 + 1294 1295 1291 + 1293 1294 1291 + 1296 1297 1291 + 1295 1296 1291 + 1292 1291 1297 + 1292 1298 1299 + 1292 1299 1300 + 1292 1301 1298 + 1302 1301 1292 + 1302 1292 1297 + 1292 1300 1293 + 1300 1303 1293 + 1293 1304 1294 + 1293 1303 1304 + 1294 1304 1305 + 1294 1305 1306 + 1295 1294 1306 + 1307 1295 1308 + 1295 1306 1308 + 1307 1296 1295 + 1309 1297 1296 + 1303 1309 1296 + 1303 1296 1307 + 1310 1302 1297 + 1311 1297 1309 + 1312 1310 1297 + 1312 1297 1311 + 1298 1313 1314 + 1315 1313 1298 + 1315 1298 1301 + 1299 1298 1316 + 1298 1314 1316 + 1317 1318 1299 + 1299 1318 1319 + 1317 1299 1320 + 1300 1299 1319 + 1299 1316 1320 + 1300 1319 1321 + 1300 1321 1309 + 1300 1309 1303 + 1322 1315 1301 + 1322 1301 1302 + 1322 1302 1323 + 1324 1323 1302 + 1324 1302 1310 + 1303 1307 1304 + 1304 1307 1325 + 1304 1325 1305 + 1305 1325 1326 + 1305 1326 1327 + 1306 1305 1328 + 1329 1328 1305 + 1329 1305 1327 + 1308 1306 1330 + 1306 1328 1331 + 1306 1331 1330 + 1307 1308 1325 + 1326 1325 1308 + 1326 1308 1332 + 1308 1333 1332 + 1308 1330 1333 + 1309 1321 1334 + 1311 1309 1334 + 1335 1324 1310 + 1335 1310 1312 + 1336 1311 1337 + 1338 1311 1334 + 1338 1337 1311 + 1339 1312 1311 + 1339 1311 1336 + 1340 1335 1312 + 1340 1312 1339 + 1313 1341 1342 + 1313 1342 1317 + 1315 1341 1313 + 1313 1317 1343 + 1313 1343 1314 + 1314 1343 1344 + 1316 1314 1345 + 1314 1344 1345 + 1346 1341 1315 + 1322 1346 1315 + 1320 1316 1347 + 1316 1345 1347 + 1317 1342 1318 + 1317 1320 1343 + 1318 1342 1348 + 1318 1348 1349 + 1319 1318 1349 + 1319 1349 1350 + 1351 1321 1319 + 1351 1319 1350 + 1343 1320 1352 + 1320 1347 1352 + 1334 1321 1351 + 1353 1346 1322 + 1323 1353 1322 + 1323 1354 1353 + 1355 1354 1323 + 1355 1323 1324 + 1356 1355 1324 + 1356 1324 1335 + 1326 1332 1357 + 1327 1326 1358 + 1358 1326 1359 + 1357 1359 1326 + 1329 1327 1358 + 1332 1328 1329 + 1360 1328 1332 + 1360 1331 1328 + 1332 1329 1357 + 1357 1329 1361 + 1329 1358 1361 + 1333 1330 1362 + 1330 1331 1363 + 1330 1363 1362 + 1331 1360 1364 + 1331 1364 1363 + 1333 1360 1332 + 1360 1333 1365 + 1333 1362 1365 + 1334 1351 1366 + 1367 1334 1366 + 1334 1367 1368 + 1369 1338 1334 + 1334 1368 1369 + 1370 1356 1335 + 1370 1335 1340 + 1371 1336 1337 + 1372 1339 1336 + 1372 1336 1371 + 1373 1337 1338 + 1373 1374 1337 + 1374 1371 1337 + 1375 1338 1369 + 1375 1373 1338 + 1340 1339 1372 + 1372 1370 1340 + 1376 1377 1341 + 1376 1341 1378 + 1379 1342 1341 + 1377 1379 1341 + 1346 1378 1341 + 1348 1342 1380 + 1381 1380 1342 + 1379 1381 1342 + 1343 1352 1344 + 1345 1344 1382 + 1344 1352 1383 + 1344 1383 1382 + 1347 1345 1384 + 1345 1382 1384 + 1385 1378 1346 + 1353 1385 1346 + 1352 1347 1386 + 1347 1384 1386 + 1348 1380 1387 + 1387 1388 1348 + 1349 1348 1388 + 1349 1388 1389 + 1350 1349 1389 + 1350 1389 1390 + 1350 1390 1391 + 1350 1391 1351 + 1366 1351 1391 + 1352 1386 1383 + 1353 1392 1385 + 1393 1353 1354 + 1392 1353 1393 + 1394 1354 1355 + 1394 1393 1354 + 1395 1394 1355 + 1395 1355 1356 + 1395 1356 1370 + 1357 1361 1396 + 1357 1396 1359 + 1375 1397 1358 + 1375 1358 1398 + 1399 1358 1359 + 1398 1358 1399 + 1400 1358 1397 + 1400 1361 1358 + 1401 1402 1359 + 1399 1359 1402 + 1401 1359 1396 + 1360 1365 1364 + 1396 1361 1403 + 1361 1404 1405 + 1361 1405 1403 + 1400 1404 1361 + 1365 1362 1406 + 1362 1363 1407 + 1362 1407 1406 + 1363 1408 1407 + 1363 1364 1408 + 1364 1365 1409 + 1364 1409 1408 + 1365 1406 1409 + 1366 1391 1410 + 1411 1366 1410 + 1367 1366 1411 + 1412 1367 1411 + 1368 1367 1412 + 1368 1413 1369 + 1368 1412 1414 + 1368 1414 1413 + 1415 1371 1369 + 1416 1375 1369 + 1416 1369 1371 + 1369 1413 1415 + 1395 1370 1417 + 1370 1418 1417 + 1418 1370 1372 + 1374 1416 1371 + 1371 1415 1372 + 1419 1418 1372 + 1420 1372 1415 + 1420 1421 1372 + 1372 1421 1422 + 1372 1422 1423 + 1372 1423 1419 + 1398 1373 1375 + 1398 1374 1373 + 1399 1416 1374 + 1398 1399 1374 + 1402 1375 1416 + 1402 1397 1375 + 1376 1424 1425 + 1426 1424 1376 + 1376 1425 1377 + 1378 1426 1376 + 1377 1425 1427 + 1377 1427 1379 + 1378 1428 1426 + 1385 1428 1378 + 1381 1379 1429 + 1379 1427 1430 + 1379 1430 1429 + 1380 1431 1432 + 1433 1431 1380 + 1380 1432 1387 + 1433 1380 1381 + 1433 1381 1434 + 1381 1429 1434 + 1384 1382 1435 + 1382 1383 1436 + 1382 1436 1435 + 1383 1386 1437 + 1383 1437 1436 + 1386 1384 1438 + 1384 1435 1438 + 1439 1428 1385 + 1392 1439 1385 + 1386 1438 1437 + 1387 1432 1440 + 1387 1441 1388 + 1387 1440 1441 + 1388 1441 1442 + 1428 1388 1442 + 1443 1388 1428 + 1389 1388 1443 + 1444 1389 1443 + 1390 1389 1444 + 1390 1444 1445 + 1391 1390 1445 + 1446 1391 1445 + 1410 1391 1446 + 1447 1439 1392 + 1445 1444 1392 + 1448 1392 1444 + 1448 1447 1392 + 1392 1393 1445 + 1393 1394 1449 + 1450 1445 1393 + 1449 1450 1393 + 1394 1451 1449 + 1410 1394 1395 + 1451 1394 1446 + 1394 1410 1446 + 1410 1395 1452 + 1395 1417 1452 + 1401 1396 1453 + 1453 1396 1454 + 1396 1403 1454 + 1401 1397 1402 + 1401 1400 1397 + 1399 1402 1416 + 1455 1400 1401 + 1400 1456 1404 + 1455 1456 1400 + 1457 1458 1401 + 1453 1459 1401 + 1457 1401 1459 + 1455 1401 1458 + 1454 1403 1460 + 1403 1405 1461 + 1403 1461 1460 + 1404 1453 1462 + 1453 1404 1456 + 1404 1462 1405 + 1405 1462 1463 + 1405 1463 1461 + 1409 1406 1464 + 1406 1407 1465 + 1406 1465 1464 + 1407 1466 1465 + 1407 1408 1466 + 1408 1409 1467 + 1408 1467 1466 + 1409 1464 1467 + 1411 1410 1468 + 1469 1468 1410 + 1410 1452 1470 + 1469 1410 1470 + 1414 1411 1468 + 1412 1411 1414 + 1413 1414 1469 + 1423 1413 1470 + 1413 1421 1420 + 1413 1420 1415 + 1422 1421 1413 + 1423 1422 1413 + 1413 1469 1470 + 1414 1468 1471 + 1414 1471 1469 + 1418 1419 1417 + 1452 1417 1472 + 1417 1473 1472 + 1417 1419 1473 + 1470 1419 1423 + 1419 1470 1474 + 1419 1474 1473 + 1424 1475 1476 + 1477 1475 1424 + 1424 1476 1425 + 1426 1477 1424 + 1425 1476 1478 + 1425 1479 1480 + 1425 1478 1479 + 1427 1425 1480 + 1481 1477 1426 + 1482 1481 1426 + 1428 1482 1426 + 1427 1480 1433 + 1427 1433 1483 + 1427 1483 1430 + 1428 1442 1482 + 1443 1428 1439 + 1434 1429 1484 + 1429 1430 1485 + 1429 1485 1484 + 1430 1483 1486 + 1430 1486 1485 + 1431 1487 1488 + 1489 1487 1431 + 1431 1488 1432 + 1480 1489 1431 + 1480 1431 1433 + 1432 1488 1490 + 1432 1490 1440 + 1433 1434 1483 + 1483 1434 1491 + 1434 1484 1491 + 1438 1435 1492 + 1435 1436 1493 + 1435 1493 1492 + 1436 1437 1494 + 1436 1494 1493 + 1437 1438 1495 + 1437 1495 1494 + 1438 1492 1495 + 1496 1443 1439 + 1447 1496 1439 + 1440 1490 1497 + 1440 1497 1498 + 1441 1440 1499 + 1499 1440 1498 + 1442 1441 1499 + 1500 1442 1499 + 1501 1482 1442 + 1500 1501 1442 + 1496 1502 1443 + 1502 1444 1443 + 1502 1448 1444 + 1503 1446 1445 + 1450 1503 1445 + 1503 1451 1446 + 1504 1496 1447 + 1505 1504 1447 + 1505 1447 1448 + 1506 1448 1502 + 1506 1505 1448 + 1507 1450 1449 + 1508 1449 1451 + 1508 1507 1449 + 1509 1503 1450 + 1507 1509 1450 + 1510 1451 1503 + 1510 1508 1451 + 1470 1452 1511 + 1452 1472 1511 + 1456 1459 1453 + 1453 1454 1462 + 1462 1454 1512 + 1454 1460 1512 + 1455 1458 1513 + 1455 1513 1514 + 1455 1515 1456 + 1514 1515 1455 + 1515 1459 1456 + 1516 1517 1457 + 1518 1457 1515 + 1515 1457 1459 + 1518 1516 1457 + 1517 1458 1457 + 1517 1513 1458 + 1512 1460 1519 + 1460 1461 1520 + 1460 1520 1519 + 1461 1463 1521 + 1461 1521 1520 + 1462 1512 1463 + 1463 1512 1522 + 1463 1522 1521 + 1467 1464 1523 + 1464 1465 1524 + 1464 1524 1523 + 1465 1466 1525 + 1465 1525 1524 + 1466 1467 1526 + 1466 1526 1525 + 1467 1523 1526 + 1471 1468 1469 + 1470 1511 1474 + 1511 1472 1527 + 1472 1473 1527 + 1473 1474 1528 + 1473 1528 1527 + 1474 1511 1529 + 1474 1529 1530 + 1474 1530 1528 + 1475 1531 1532 + 1533 1531 1475 + 1475 1532 1476 + 1477 1533 1475 + 1476 1532 1534 + 1476 1534 1478 + 1535 1533 1477 + 1498 1535 1477 + 1498 1477 1481 + 1478 1534 1479 + 1479 1534 1536 + 1489 1479 1537 + 1480 1479 1489 + 1479 1536 1537 + 1499 1498 1481 + 1538 1539 1481 + 1539 1499 1481 + 1538 1481 1482 + 1501 1538 1482 + 1483 1491 1486 + 1491 1484 1540 + 1484 1485 1541 + 1484 1541 1540 + 1485 1486 1542 + 1485 1542 1541 + 1486 1491 1543 + 1486 1543 1542 + 1487 1544 1545 + 1546 1544 1487 + 1487 1545 1488 + 1546 1487 1489 + 1488 1545 1547 + 1488 1547 1490 + 1546 1489 1548 + 1489 1537 1548 + 1490 1547 1549 + 1497 1490 1549 + 1491 1540 1543 + 1495 1492 1550 + 1492 1493 1551 + 1492 1551 1550 + 1493 1494 1552 + 1493 1552 1551 + 1494 1495 1553 + 1494 1553 1552 + 1495 1550 1553 + 1504 1554 1496 + 1554 1502 1496 + 1555 1497 1549 + 1555 1556 1497 + 1497 1535 1498 + 1556 1535 1497 + 1539 1500 1499 + 1557 1500 1539 + 1557 1558 1500 + 1558 1501 1500 + 1559 1538 1501 + 1558 1559 1501 + 1554 1506 1502 + 1509 1510 1503 + 1560 1561 1504 + 1560 1504 1505 + 1561 1554 1504 + 1562 1505 1506 + 1562 1560 1505 + 1563 1506 1554 + 1563 1562 1506 + 1564 1509 1507 + 1565 1564 1507 + 1565 1507 1508 + 1566 1508 1510 + 1566 1565 1508 + 1567 1510 1509 + 1564 1567 1509 + 1567 1566 1510 + 1511 1568 1529 + 1527 1568 1511 + 1512 1519 1522 + 1517 1569 1513 + 1514 1513 1569 + 1514 1570 1515 + 1514 1569 1571 + 1571 1570 1514 + 1572 1518 1515 + 1572 1515 1570 + 1516 1573 1517 + 1574 1573 1516 + 1575 1574 1516 + 1575 1516 1518 + 1517 1576 1569 + 1577 1576 1517 + 1573 1578 1517 + 1578 1577 1517 + 1579 1575 1518 + 1579 1518 1572 + 1522 1519 1520 + 1522 1520 1521 + 1526 1523 1580 + 1523 1524 1581 + 1523 1581 1580 + 1524 1525 1582 + 1524 1582 1581 + 1525 1526 1583 + 1525 1583 1582 + 1526 1580 1583 + 1527 1584 1568 + 1528 1584 1527 + 1530 1584 1528 + 1529 1568 1585 + 1586 1530 1529 + 1586 1529 1585 + 1530 1587 1588 + 1587 1530 1586 + 1530 1588 1584 + 1531 1589 1590 + 1591 1589 1531 + 1531 1590 1532 + 1533 1591 1531 + 1532 1590 1592 + 1532 1592 1534 + 1593 1591 1533 + 1535 1593 1533 + 1534 1592 1594 + 1534 1594 1546 + 1534 1546 1595 + 1534 1595 1536 + 1535 1596 1593 + 1597 1596 1535 + 1556 1597 1535 + 1536 1595 1598 + 1537 1536 1599 + 1536 1598 1599 + 1548 1537 1600 + 1537 1599 1600 + 1559 1601 1538 + 1601 1539 1538 + 1601 1557 1539 + 1543 1540 1602 + 1540 1541 1603 + 1540 1603 1602 + 1541 1542 1604 + 1541 1604 1603 + 1542 1543 1605 + 1542 1605 1604 + 1543 1602 1605 + 1544 1606 1607 + 1544 1607 1545 + 1594 1606 1544 + 1594 1544 1546 + 1545 1607 1608 + 1545 1608 1547 + 1546 1548 1595 + 1549 1547 1608 + 1595 1548 1609 + 1548 1600 1609 + 1549 1608 1610 + 1549 1610 1611 + 1612 1555 1549 + 1612 1549 1596 + 1549 1611 1596 + 1553 1550 1551 + 1553 1551 1552 + 1561 1563 1554 + 1613 1555 1612 + 1613 1614 1555 + 1614 1556 1555 + 1615 1597 1556 + 1614 1615 1556 + 1616 1557 1601 + 1616 1617 1557 + 1617 1558 1557 + 1618 1559 1558 + 1617 1618 1558 + 1618 1619 1559 + 1619 1601 1559 + 1620 1621 1560 + 1620 1560 1562 + 1621 1561 1560 + 1621 1622 1561 + 1622 1563 1561 + 1623 1562 1563 + 1623 1620 1562 + 1622 1623 1563 + 1587 1567 1564 + 1588 1587 1564 + 1624 1564 1565 + 1588 1564 1624 + 1625 1565 1566 + 1626 1624 1565 + 1625 1626 1565 + 1566 1567 1587 + 1627 1566 1587 + 1627 1628 1566 + 1628 1625 1566 + 1568 1629 1585 + 1568 1584 1630 + 1568 1630 1629 + 1631 1569 1576 + 1571 1569 1632 + 1631 1632 1569 + 1571 1577 1570 + 1633 1570 1578 + 1570 1633 1572 + 1578 1570 1577 + 1634 1577 1571 + 1571 1632 1634 + 1633 1573 1572 + 1635 1572 1573 + 1635 1579 1572 + 1573 1633 1578 + 1574 1635 1573 + 1636 1637 1574 + 1636 1574 1575 + 1637 1635 1574 + 1638 1636 1575 + 1638 1575 1579 + 1576 1639 1631 + 1576 1577 1639 + 1634 1639 1577 + 1640 1579 1635 + 1640 1638 1579 + 1582 1583 1580 + 1582 1580 1581 + 1630 1584 1588 + 1641 1586 1585 + 1642 1585 1643 + 1643 1585 1629 + 1585 1642 1641 + 1587 1586 1644 + 1586 1630 1644 + 1645 1586 1641 + 1645 1646 1586 + 1646 1630 1586 + 1644 1627 1587 + 1588 1624 1647 + 1630 1588 1647 + 1589 1648 1649 + 1650 1648 1589 + 1589 1649 1651 + 1589 1651 1590 + 1652 1650 1589 + 1591 1652 1589 + 1590 1651 1653 + 1590 1653 1654 + 1590 1654 1592 + 1611 1652 1591 + 1593 1596 1591 + 1596 1611 1591 + 1592 1654 1655 + 1594 1592 1656 + 1592 1655 1656 + 1653 1594 1657 + 1594 1653 1606 + 1594 1656 1657 + 1595 1609 1598 + 1597 1612 1596 + 1658 1612 1597 + 1615 1658 1597 + 1599 1598 1659 + 1598 1609 1660 + 1598 1660 1659 + 1600 1599 1661 + 1599 1659 1661 + 1609 1600 1662 + 1600 1661 1662 + 1619 1616 1601 + 1605 1602 1663 + 1602 1603 1664 + 1602 1664 1663 + 1603 1604 1665 + 1603 1665 1664 + 1604 1605 1666 + 1604 1666 1665 + 1605 1663 1666 + 1653 1667 1606 + 1667 1607 1606 + 1607 1668 1669 + 1667 1668 1607 + 1607 1669 1670 + 1608 1607 1670 + 1608 1670 1671 + 1608 1671 1610 + 1609 1662 1660 + 1672 1610 1671 + 1672 1673 1610 + 1673 1611 1610 + 1611 1674 1652 + 1675 1674 1611 + 1673 1675 1611 + 1658 1613 1612 + 1676 1613 1658 + 1676 1677 1613 + 1677 1614 1613 + 1677 1678 1614 + 1678 1615 1614 + 1679 1658 1615 + 1678 1679 1615 + 1680 1616 1619 + 1680 1681 1616 + 1681 1617 1616 + 1682 1618 1617 + 1681 1682 1617 + 1682 1683 1618 + 1683 1619 1618 + 1683 1680 1619 + 1684 1685 1620 + 1684 1620 1623 + 1685 1621 1620 + 1685 1686 1621 + 1686 1622 1621 + 1686 1687 1622 + 1687 1623 1622 + 1687 1684 1623 + 1647 1624 1627 + 1627 1624 1688 + 1624 1626 1688 + 1689 1625 1628 + 1690 1626 1625 + 1689 1690 1625 + 1691 1688 1626 + 1690 1691 1626 + 1644 1647 1627 + 1627 1688 1628 + 1692 1628 1688 + 1692 1689 1628 + 1630 1693 1629 + 1629 1694 1695 + 1693 1694 1629 + 1643 1629 1696 + 1629 1695 1696 + 1630 1647 1644 + 1697 1693 1630 + 1646 1697 1630 + 1631 1639 1698 + 1631 1698 1699 + 1700 1632 1631 + 1700 1631 1699 + 1634 1632 1700 + 1698 1639 1634 + 1634 1700 1701 + 1698 1634 1701 + 1637 1640 1635 + 1637 1636 1638 + 1637 1638 1640 + 1702 1645 1641 + 1642 1694 1641 + 1702 1641 1693 + 1694 1693 1641 + 1642 1703 1695 + 1694 1642 1695 + 1642 1643 1703 + 1704 1643 1696 + 1703 1643 1704 + 1705 1645 1702 + 1706 1646 1645 + 1705 1706 1645 + 1707 1697 1646 + 1706 1707 1646 + 1708 1709 1648 + 1648 1710 1708 + 1648 1711 1710 + 1648 1709 1649 + 1712 1711 1648 + 1650 1712 1648 + 1649 1709 1713 + 1649 1713 1714 + 1651 1649 1714 + 1715 1712 1650 + 1674 1671 1650 + 1715 1650 1671 + 1674 1650 1652 + 1651 1714 1716 + 1653 1651 1716 + 1653 1716 1667 + 1654 1653 1717 + 1653 1657 1717 + 1654 1717 1655 + 1655 1717 1718 + 1656 1655 1719 + 1655 1718 1719 + 1657 1656 1720 + 1656 1719 1720 + 1717 1657 1721 + 1657 1720 1721 + 1679 1676 1658 + 1661 1659 1722 + 1659 1660 1723 + 1659 1723 1722 + 1660 1662 1724 + 1660 1724 1723 + 1662 1661 1725 + 1661 1722 1725 + 1662 1725 1724 + 1666 1663 1726 + 1663 1664 1727 + 1663 1727 1726 + 1664 1665 1728 + 1664 1728 1727 + 1665 1666 1729 + 1665 1729 1728 + 1666 1726 1729 + 1667 1730 1668 + 1716 1730 1667 + 1668 1731 1732 + 1668 1732 1733 + 1733 1734 1668 + 1668 1734 1669 + 1730 1731 1668 + 1669 1734 1735 + 1670 1669 1736 + 1669 1735 1736 + 1670 1715 1671 + 1670 1736 1715 + 1737 1672 1671 + 1737 1671 1674 + 1738 1672 1737 + 1738 1739 1672 + 1739 1673 1672 + 1740 1675 1673 + 1739 1740 1673 + 1675 1737 1674 + 1741 1737 1675 + 1740 1741 1675 + 1742 1676 1679 + 1742 1743 1676 + 1743 1677 1676 + 1743 1744 1677 + 1744 1678 1677 + 1745 1679 1678 + 1744 1745 1678 + 1745 1742 1679 + 1746 1680 1683 + 1746 1747 1680 + 1747 1681 1680 + 1748 1682 1681 + 1747 1748 1681 + 1748 1749 1682 + 1749 1683 1682 + 1749 1746 1683 + 1750 1751 1684 + 1751 1685 1684 + 1750 1684 1687 + 1751 1752 1685 + 1752 1686 1685 + 1752 1753 1686 + 1753 1687 1686 + 1753 1750 1687 + 1691 1692 1688 + 1754 1689 1692 + 1754 1755 1689 + 1756 1690 1689 + 1755 1756 1689 + 1756 1757 1690 + 1757 1691 1690 + 1754 1692 1691 + 1757 1754 1691 + 1697 1702 1693 + 1695 1703 1758 + 1695 1758 1759 + 1760 1695 1759 + 1696 1695 1760 + 1761 1704 1696 + 1696 1760 1761 + 1762 1702 1697 + 1707 1762 1697 + 1699 1698 1763 + 1763 1698 1701 + 1699 1763 1764 + 1764 1765 1699 + 1765 1700 1699 + 1701 1700 1766 + 1700 1765 1767 + 1700 1767 1766 + 1701 1766 1768 + 1763 1701 1768 + 1762 1705 1702 + 1703 1769 1770 + 1703 1770 1758 + 1703 1704 1769 + 1771 1704 1761 + 1704 1771 1772 + 1704 1772 1769 + 1773 1705 1762 + 1773 1774 1705 + 1774 1706 1705 + 1775 1707 1706 + 1774 1775 1706 + 1776 1762 1707 + 1775 1776 1707 + 1708 1777 1778 + 1710 1777 1708 + 1708 1779 1709 + 1708 1778 1779 + 1780 1713 1709 + 1780 1709 1781 + 1782 1709 1779 + 1782 1781 1709 + 1710 1783 1777 + 1783 1710 1784 + 1710 1711 1785 + 1710 1785 1784 + 1736 1735 1711 + 1785 1711 1735 + 1736 1711 1712 + 1715 1736 1712 + 1780 1731 1713 + 1714 1713 1731 + 1714 1731 1730 + 1716 1714 1730 + 1717 1721 1718 + 1719 1718 1786 + 1718 1721 1787 + 1718 1787 1786 + 1720 1719 1788 + 1719 1786 1788 + 1721 1720 1789 + 1720 1788 1789 + 1721 1789 1787 + 1725 1722 1790 + 1722 1723 1791 + 1722 1791 1790 + 1723 1724 1792 + 1723 1792 1791 + 1724 1725 1793 + 1724 1793 1792 + 1725 1790 1793 + 1727 1729 1726 + 1727 1728 1729 + 1780 1732 1731 + 1732 1794 1795 + 1732 1795 1733 + 1780 1794 1732 + 1733 1795 1796 + 1733 1796 1797 + 1733 1797 1734 + 1734 1797 1796 + 1734 1796 1798 + 1734 1798 1799 + 1735 1734 1800 + 1734 1799 1800 + 1785 1735 1800 + 1741 1738 1737 + 1801 1738 1741 + 1801 1802 1738 + 1802 1739 1738 + 1802 1803 1739 + 1803 1740 1739 + 1804 1741 1740 + 1803 1804 1740 + 1804 1801 1741 + 1805 1742 1745 + 1805 1806 1742 + 1806 1743 1742 + 1806 1807 1743 + 1807 1744 1743 + 1808 1745 1744 + 1807 1808 1744 + 1808 1805 1745 + 1809 1746 1749 + 1809 1810 1746 + 1810 1747 1746 + 1811 1748 1747 + 1810 1811 1747 + 1811 1812 1748 + 1812 1749 1748 + 1812 1809 1749 + 1750 1753 1752 + 1750 1752 1751 + 1813 1754 1757 + 1813 1814 1754 + 1814 1755 1754 + 1815 1756 1755 + 1814 1815 1755 + 1815 1816 1756 + 1816 1757 1756 + 1816 1813 1757 + 1758 1770 1817 + 1758 1817 1818 + 1759 1758 1818 + 1759 1819 1760 + 1759 1820 1819 + 1820 1759 1821 + 1759 1818 1821 + 1761 1760 1822 + 1823 1760 1819 + 1760 1772 1822 + 1760 1823 1772 + 1824 1771 1761 + 1761 1822 1824 + 1776 1773 1762 + 1764 1763 1825 + 1763 1826 1827 + 1763 1827 1825 + 1763 1768 1826 + 1764 1825 1828 + 1828 1829 1764 + 1829 1765 1764 + 1829 1767 1765 + 1766 1767 1830 + 1766 1830 1831 + 1768 1766 1831 + 1826 1767 1829 + 1767 1826 1832 + 1767 1832 1830 + 1768 1831 1833 + 1833 1826 1768 + 1769 1823 1819 + 1769 1820 1770 + 1769 1819 1820 + 1823 1769 1772 + 1770 1820 1834 + 1770 1834 1817 + 1835 1771 1824 + 1772 1771 1835 + 1836 1837 1772 + 1837 1822 1772 + 1772 1835 1836 + 1776 1775 1773 + 1775 1774 1773 + 1777 1838 1839 + 1783 1838 1777 + 1777 1839 1778 + 1839 1840 1778 + 1841 1778 1840 + 1841 1782 1778 + 1782 1779 1778 + 1780 1841 1840 + 1780 1840 1794 + 1841 1780 1842 + 1780 1781 1843 + 1780 1843 1842 + 1781 1782 1844 + 1781 1844 1843 + 1782 1841 1845 + 1782 1845 1844 + 1783 1846 1838 + 1783 1847 1846 + 1783 1798 1847 + 1798 1783 1799 + 1783 1784 1799 + 1848 1799 1784 + 1849 1848 1784 + 1849 1784 1785 + 1850 1785 1800 + 1850 1849 1785 + 1788 1786 1851 + 1786 1787 1852 + 1786 1852 1851 + 1787 1789 1853 + 1787 1853 1852 + 1789 1788 1854 + 1788 1851 1854 + 1789 1854 1853 + 1793 1790 1855 + 1790 1791 1856 + 1790 1856 1855 + 1791 1792 1857 + 1791 1857 1856 + 1792 1793 1858 + 1792 1858 1857 + 1793 1855 1858 + 1840 1859 1794 + 1859 1795 1794 + 1859 1860 1795 + 1796 1795 1860 + 1796 1860 1847 + 1796 1847 1798 + 1848 1861 1799 + 1861 1800 1799 + 1861 1850 1800 + 1862 1801 1804 + 1862 1863 1801 + 1863 1802 1801 + 1863 1864 1802 + 1864 1803 1802 + 1865 1804 1803 + 1864 1865 1803 + 1865 1862 1804 + 1866 1805 1808 + 1866 1867 1805 + 1867 1806 1805 + 1867 1868 1806 + 1868 1807 1806 + 1869 1808 1807 + 1868 1869 1807 + 1869 1866 1808 + 1812 1810 1809 + 1812 1811 1810 + 1870 1813 1816 + 1870 1871 1813 + 1871 1814 1813 + 1872 1815 1814 + 1871 1872 1814 + 1873 1816 1815 + 1872 1873 1815 + 1873 1870 1816 + 1817 1834 1874 + 1817 1874 1875 + 1818 1817 1875 + 1821 1818 1876 + 1818 1875 1876 + 1820 1821 1834 + 1834 1821 1877 + 1821 1876 1877 + 1824 1822 1837 + 1878 1835 1824 + 1824 1837 1878 + 1828 1825 1879 + 1825 1827 1880 + 1825 1880 1879 + 1826 1829 1827 + 1833 1832 1826 + 1827 1829 1881 + 1827 1881 1880 + 1828 1879 1882 + 1829 1828 1882 + 1829 1882 1881 + 1831 1830 1883 + 1830 1884 1883 + 1830 1832 1884 + 1831 1883 1885 + 1833 1831 1885 + 1886 1832 1833 + 1886 1884 1832 + 1833 1885 1886 + 1834 1877 1874 + 1887 1835 1878 + 1888 1836 1835 + 1888 1835 1887 + 1888 1889 1836 + 1889 1837 1836 + 1890 1878 1837 + 1890 1837 1889 + 1838 1860 1859 + 1846 1860 1838 + 1838 1859 1839 + 1839 1859 1840 + 1841 1842 1845 + 1845 1842 1891 + 1842 1843 1892 + 1842 1892 1891 + 1843 1844 1893 + 1843 1893 1892 + 1844 1845 1894 + 1844 1894 1893 + 1845 1891 1894 + 1846 1847 1860 + 1895 1896 1848 + 1896 1861 1848 + 1895 1848 1849 + 1897 1895 1849 + 1897 1849 1850 + 1898 1850 1861 + 1898 1897 1850 + 1854 1851 1899 + 1851 1852 1900 + 1851 1900 1899 + 1852 1853 1901 + 1852 1901 1900 + 1853 1854 1902 + 1853 1902 1901 + 1854 1899 1902 + 1858 1855 1856 + 1858 1856 1857 + 1896 1898 1861 + 1903 1862 1865 + 1903 1904 1862 + 1904 1863 1862 + 1904 1905 1863 + 1905 1864 1863 + 1906 1865 1864 + 1905 1906 1864 + 1906 1903 1865 + 1869 1867 1866 + 1869 1868 1867 + 1907 1908 1870 + 1907 1870 1873 + 1908 1871 1870 + 1909 1872 1871 + 1908 1909 1871 + 1910 1873 1872 + 1909 1910 1872 + 1910 1907 1873 + 1875 1874 1877 + 1876 1875 1877 + 1890 1887 1878 + 1882 1879 1911 + 1879 1880 1912 + 1879 1912 1911 + 1880 1881 1913 + 1880 1913 1912 + 1881 1882 1914 + 1881 1914 1913 + 1882 1911 1914 + 1883 1915 1916 + 1885 1883 1916 + 1883 1884 1915 + 1917 1884 1886 + 1917 1915 1884 + 1886 1885 1918 + 1885 1916 1918 + 1886 1918 1917 + 1919 1887 1890 + 1920 1921 1887 + 1919 1920 1887 + 1888 1887 1921 + 1922 1923 1888 + 1923 1889 1888 + 1888 1921 1922 + 1924 1890 1889 + 1924 1889 1923 + 1924 1919 1890 + 1894 1891 1925 + 1891 1892 1926 + 1891 1926 1925 + 1892 1893 1927 + 1892 1927 1926 + 1893 1894 1928 + 1893 1928 1927 + 1894 1925 1928 + 1929 1930 1895 + 1929 1895 1897 + 1930 1896 1895 + 1930 1931 1896 + 1931 1898 1896 + 1932 1897 1898 + 1932 1929 1897 + 1931 1932 1898 + 1902 1899 1933 + 1899 1900 1934 + 1899 1934 1933 + 1900 1901 1935 + 1900 1935 1934 + 1901 1902 1936 + 1901 1936 1935 + 1902 1933 1936 + 1937 1903 1906 + 1937 1938 1903 + 1938 1904 1903 + 1938 1939 1904 + 1939 1905 1904 + 1940 1906 1905 + 1939 1940 1905 + 1940 1937 1906 + 1908 1907 1910 + 1909 1908 1910 + 1914 1911 1941 + 1911 1912 1942 + 1911 1942 1941 + 1912 1913 1943 + 1912 1943 1942 + 1913 1944 1943 + 1913 1914 1944 + 1914 1941 1944 + 1916 1915 1945 + 1946 1915 1917 + 1946 1945 1915 + 1916 1945 1947 + 1918 1916 1947 + 1917 1918 1948 + 1917 1948 1946 + 1918 1947 1948 + 1949 1920 1919 + 1950 1949 1919 + 1950 1919 1924 + 1921 1920 1951 + 1951 1920 1952 + 1953 1952 1920 + 1949 1953 1920 + 1922 1921 1951 + 1954 1955 1922 + 1955 1923 1922 + 1922 1951 1954 + 1956 1952 1923 + 1955 1956 1923 + 1952 1924 1923 + 1957 1950 1924 + 1924 1952 1957 + 1928 1925 1958 + 1925 1926 1959 + 1925 1959 1958 + 1926 1927 1960 + 1926 1960 1959 + 1927 1928 1961 + 1927 1961 1960 + 1928 1958 1961 + 1962 1963 1929 + 1962 1929 1932 + 1963 1930 1929 + 1963 1964 1930 + 1964 1931 1930 + 1964 1965 1931 + 1965 1932 1931 + 1965 1962 1932 + 1936 1933 1934 + 1936 1934 1935 + 1940 1938 1937 + 1940 1939 1938 + 1944 1941 1966 + 1941 1942 1967 + 1941 1967 1966 + 1942 1943 1968 + 1942 1968 1967 + 1943 1944 1969 + 1943 1969 1968 + 1944 1966 1969 + 1947 1945 1946 + 1947 1946 1948 + 1970 1949 1950 + 1970 1971 1949 + 1971 1953 1949 + 1972 1970 1950 + 1972 1950 1957 + 1973 1954 1951 + 1956 1951 1952 + 1974 1973 1951 + 1974 1951 1956 + 1952 1953 1957 + 1957 1953 1975 + 1953 1971 1975 + 1976 1955 1954 + 1973 1976 1954 + 1977 1956 1955 + 1976 1977 1955 + 1977 1974 1956 + 1975 1972 1957 + 1961 1958 1978 + 1958 1959 1979 + 1958 1979 1978 + 1959 1960 1980 + 1959 1980 1979 + 1960 1961 1981 + 1960 1981 1980 + 1961 1978 1981 + 1982 1983 1962 + 1982 1962 1965 + 1983 1963 1962 + 1983 1984 1963 + 1984 1964 1963 + 1984 1985 1964 + 1985 1965 1964 + 1985 1982 1965 + 1967 1969 1966 + 1967 1968 1969 + 1986 1987 1970 + 1986 1970 1972 + 1987 1971 1970 + 1975 1971 1988 + 1971 1987 1988 + 1989 1972 1975 + 1989 1986 1972 + 1990 1973 1974 + 1991 1976 1973 + 1990 1991 1973 + 1992 1974 1977 + 1992 1990 1974 + 1988 1989 1975 + 1993 1977 1976 + 1991 1993 1976 + 1993 1992 1977 + 1981 1978 1994 + 1978 1979 1995 + 1978 1995 1994 + 1979 1980 1996 + 1979 1996 1995 + 1980 1981 1997 + 1980 1997 1996 + 1981 1994 1997 + 1998 1999 1982 + 1999 1983 1982 + 1998 1982 1985 + 1999 2000 1983 + 2000 1984 1983 + 2000 2001 1984 + 2001 1985 1984 + 2001 1998 1985 + 2002 1987 1986 + 2003 2002 1986 + 2003 1986 1989 + 1988 1987 2004 + 1987 2002 2004 + 2005 1989 1988 + 2005 1988 2004 + 2005 2003 1989 + 2006 1990 1992 + 2007 1991 1990 + 2006 2007 1990 + 2008 1993 1991 + 2007 2008 1991 + 2009 2006 1992 + 2009 1992 1993 + 2008 2009 1993 + 1995 1997 1994 + 1995 1996 1997 + 2001 1999 1998 + 2001 2000 1999 + 2004 2002 2003 + 2005 2004 2003 + 2010 2006 2009 + 2011 2007 2006 + 2010 2011 2006 + 2012 2008 2007 + 2011 2012 2007 + 2013 2009 2008 + 2012 2013 2008 + 2013 2010 2009 + 2011 2010 2013 + 2011 2013 2012 + 2014 2015 2016 + 2017 2018 2014 + 2017 2014 2019 + 2018 2015 2014 + 2019 2014 2020 + 2014 2016 2020 + 2018 2021 2015 + 2021 2022 2015 + 2015 2022 2023 + 2015 2023 2016 + 2016 2023 2020 + 2024 2025 2017 + 2024 2017 2026 + 2025 2018 2017 + 2026 2017 2019 + 2025 2027 2018 + 2027 2021 2018 + 2019 2028 2026 + 2019 2029 2028 + 2019 2020 2029 + 2023 2029 2020 + 2027 2030 2021 + 2030 2031 2021 + 2021 2031 2022 + 2031 2032 2022 + 2022 2032 2033 + 2022 2033 2023 + 2023 2033 2029 + 2034 2035 2024 + 2035 2025 2024 + 2034 2024 2036 + 2036 2024 2026 + 2035 2037 2025 + 2037 2027 2025 + 2036 2026 2038 + 2038 2026 2028 + 2037 2039 2027 + 2039 2030 2027 + 2038 2028 2032 + 2032 2028 2040 + 2028 2029 2040 + 2033 2040 2029 + 2039 2041 2030 + 2041 2042 2030 + 2030 2042 2031 + 2042 2038 2031 + 2031 2038 2032 + 2032 2040 2033 + 2043 2044 2034 + 2043 2034 2045 + 2044 2035 2034 + 2045 2034 2036 + 2046 2037 2035 + 2044 2046 2035 + 2045 2036 2042 + 2042 2036 2038 + 2046 2047 2037 + 2047 2039 2037 + 2047 2048 2039 + 2048 2041 2039 + 2048 2049 2041 + 2049 2045 2041 + 2041 2045 2042 + 2050 2051 2043 + 2050 2043 2049 + 2051 2044 2043 + 2049 2043 2045 + 2051 2052 2044 + 2052 2046 2044 + 2052 2053 2046 + 2053 2047 2046 + 2053 2054 2047 + 2054 2048 2047 + 2054 2055 2048 + 2055 2049 2048 + 2055 2050 2049 + 2056 2057 2050 + 2057 2051 2050 + 2056 2050 2055 + 2057 2058 2051 + 2058 2052 2051 + 2058 2059 2052 + 2059 2053 2052 + 2059 2060 2053 + 2060 2054 2053 + 2060 2061 2054 + 2061 2055 2054 + 2061 2056 2055 + 2062 2063 2056 + 2062 2056 2061 + 2063 2057 2056 + 2063 2064 2057 + 2064 2058 2057 + 2064 2065 2058 + 2065 2059 2058 + 2065 2066 2059 + 2066 2060 2059 + 2066 2061 2060 + 2066 2062 2061 + 2067 2068 2062 + 2068 2069 2062 + 2069 2063 2062 + 2062 2066 2070 + 2070 2067 2062 + 2069 2071 2063 + 2071 2064 2063 + 2071 2072 2064 + 2072 2065 2064 + 2072 2070 2065 + 2070 2066 2065 + 2073 2067 2070 + 2073 2074 2067 + 2068 2067 2074 + 2075 2069 2068 + 2075 2068 2074 + 2075 2076 2069 + 2076 2071 2069 + 2077 2073 2070 + 2077 2070 2072 + 2076 2078 2071 + 2078 2072 2071 + 2078 2077 2072 + 2079 2080 2073 + 2079 2073 2077 + 2080 2074 2073 + 2080 2081 2074 + 2075 2074 2081 + 2081 2082 2075 + 2082 2076 2075 + 2082 2083 2076 + 2083 2078 2076 + 2084 2079 2077 + 2084 2077 2078 + 2083 2084 2078 + 2085 2086 2079 + 2085 2079 2084 + 2086 2080 2079 + 2086 2087 2080 + 2087 2081 2080 + 2087 2088 2081 + 2088 2082 2081 + 2088 2089 2082 + 2089 2083 2082 + 2089 2090 2083 + 2090 2084 2083 + 2090 2085 2084 + 2091 2092 2085 + 2091 2085 2090 + 2092 2086 2085 + 2092 2093 2086 + 2093 2087 2086 + 2093 2094 2087 + 2094 2088 2087 + 2094 2095 2088 + 2095 2089 2088 + 2095 2096 2089 + 2096 2090 2089 + 2096 2091 2090 + 2097 2098 2091 + 2097 2091 2096 + 2098 2092 2091 + 2098 2099 2092 + 2093 2092 2099 + 2094 2093 2099 + 2099 2100 2094 + 2100 2095 2094 + 2100 2101 2095 + 2101 2096 2095 + 2101 2097 2096 + 2102 2103 2097 + 2102 2097 2101 + 2103 2098 2097 + 2103 2104 2098 + 2104 2099 2098 + 2105 2106 2099 + 2106 2100 2099 + 2104 2105 2099 + 2106 2107 2100 + 2107 2101 2100 + 2107 2102 2101 + 2106 2103 2102 + 2106 2102 2107 + 2106 2104 2103 + 2106 2105 2104 + 2108 2109 2110 + 2108 2111 2112 + 2108 2112 2109 + 2113 2114 2108 + 2108 2110 2115 + 2114 2111 2108 + 2113 2108 2115 + 2116 2117 2109 + 2116 2109 2112 + 2117 2110 2109 + 2117 2118 2110 + 2118 2115 2110 + 2114 2119 2111 + 2119 2112 2111 + 2119 2116 2112 + 2118 2113 2115 + 2120 2121 2113 + 2120 2113 2118 + 2121 2114 2113 + 2121 2122 2114 + 2119 2114 2122 + 2123 2124 2116 + 2123 2116 2119 + 2124 2117 2116 + 2124 2125 2117 + 2125 2118 2117 + 2125 2120 2118 + 2122 2123 2119 + 2126 2127 2120 + 2126 2120 2125 + 2127 2121 2120 + 2127 2128 2121 + 2128 2122 2121 + 2128 2129 2122 + 2129 2123 2122 + 2129 2130 2123 + 2130 2124 2123 + 2130 2131 2124 + 2131 2125 2124 + 2131 2126 2125 + 2132 2133 2126 + 2132 2126 2131 + 2133 2127 2126 + 2133 2134 2127 + 2134 2128 2127 + 2134 2135 2128 + 2135 2129 2128 + 2135 2136 2129 + 2136 2130 2129 + 2136 2137 2130 + 2137 2131 2130 + 2137 2132 2131 + 2138 2139 2132 + 2138 2132 2137 + 2139 2133 2132 + 2139 2140 2133 + 2140 2134 2133 + 2140 2141 2134 + 2141 2135 2134 + 2141 2142 2135 + 2142 2136 2135 + 2142 2143 2136 + 2143 2137 2136 + 2143 2138 2137 + 2144 2145 2138 + 2144 2138 2143 + 2145 2139 2138 + 2145 2146 2139 + 2146 2140 2139 + 2146 2147 2140 + 2141 2140 2147 + 2147 2148 2141 + 2148 2142 2141 + 2148 2149 2142 + 2149 2143 2142 + 2149 2144 2143 + 2150 2151 2144 + 2151 2145 2144 + 2150 2144 2149 + 2151 2152 2145 + 2152 2146 2145 + 2152 2153 2146 + 2153 2147 2146 + 2153 2154 2147 + 2154 2148 2147 + 2154 2155 2148 + 2155 2149 2148 + 2155 2150 2149 + 2156 2157 2150 + 2156 2150 2155 + 2157 2151 2150 + 2157 2158 2151 + 2158 2152 2151 + 2158 2159 2152 + 2159 2153 2152 + 2159 2160 2153 + 2160 2154 2153 + 2160 2161 2154 + 2161 2155 2154 + 2161 2156 2155 + 2162 2156 2163 + 2163 2156 2161 + 2162 2157 2156 + 2162 2164 2157 + 2164 2158 2157 + 2164 2165 2158 + 2165 2159 2158 + 2165 2166 2159 + 2166 2160 2159 + 2166 2167 2160 + 2167 2161 2160 + 2167 2163 2161 + 2162 2163 2168 + 2168 2169 2162 + 2169 2164 2162 + 2170 2168 2163 + 2170 2163 2167 + 2169 2171 2164 + 2171 2165 2164 + 2171 2172 2165 + 2172 2166 2165 + 2172 2173 2166 + 2173 2167 2166 + 2173 2170 2167 + 2174 2168 2170 + 2174 2175 2168 + 2169 2168 2175 + 2175 2176 2169 + 2176 2171 2169 + 2177 2174 2170 + 2177 2170 2173 + 2176 2178 2171 + 2178 2172 2171 + 2178 2179 2172 + 2179 2173 2172 + 2179 2177 2173 + 2180 2174 2177 + 2180 2181 2174 + 2181 2175 2174 + 2181 2182 2175 + 2176 2175 2182 + 2182 2183 2176 + 2183 2178 2176 + 2184 2180 2177 + 2184 2177 2179 + 2183 2185 2178 + 2185 2179 2178 + 2185 2184 2179 + 2186 2180 2184 + 2186 2187 2180 + 2187 2181 2180 + 2187 2188 2181 + 2188 2182 2181 + 2188 2189 2182 + 2189 2183 2182 + 2189 2190 2183 + 2190 2185 2183 + 2191 2186 2184 + 2191 2184 2185 + 2190 2191 2185 + 2192 2186 2191 + 2192 2193 2186 + 2193 2187 2186 + 2193 2194 2187 + 2194 2188 2187 + 2194 2195 2188 + 2195 2189 2188 + 2195 2196 2189 + 2190 2189 2196 + 2197 2191 2190 + 2196 2197 2190 + 2197 2192 2191 + 2198 2192 2197 + 2198 2199 2192 + 2199 2193 2192 + 2199 2200 2193 + 2200 2194 2193 + 2200 2201 2194 + 2201 2195 2194 + 2201 2202 2195 + 2202 2196 2195 + 2197 2196 2203 + 2202 2203 2196 + 2203 2198 2197 + 2203 2199 2198 + 2200 2199 2203 + 2202 2200 2203 + 2202 2201 2200 + 2204 2205 2206 + 2204 2207 2208 + 2204 2208 2205 + 2209 2210 2204 + 2209 2204 2206 + 2210 2207 2204 + 2211 2212 2205 + 2211 2205 2208 + 2212 2206 2205 + 2212 2209 2206 + 2210 2213 2207 + 2213 2208 2207 + 2213 2211 2208 + 2214 2215 2209 + 2214 2209 2212 + 2215 2210 2209 + 2215 2216 2210 + 2216 2213 2210 + 2217 2218 2211 + 2218 2212 2211 + 2217 2211 2213 + 2218 2214 2212 + 2216 2217 2213 + 2219 2220 2214 + 2219 2214 2218 + 2220 2215 2214 + 2220 2221 2215 + 2221 2216 2215 + 2221 2222 2216 + 2222 2217 2216 + 2222 2223 2217 + 2223 2218 2217 + 2223 2219 2218 + 2224 2225 2219 + 2225 2220 2219 + 2224 2219 2223 + 2225 2226 2220 + 2226 2221 2220 + 2226 2227 2221 + 2227 2222 2221 + 2227 2228 2222 + 2228 2223 2222 + 2228 2224 2223 + 2229 2230 2224 + 2229 2224 2228 + 2230 2225 2224 + 2230 2231 2225 + 2231 2226 2225 + 2231 2232 2226 + 2232 2227 2226 + 2232 2233 2227 + 2233 2228 2227 + 2233 2229 2228 + 2234 2235 2229 + 2234 2229 2233 + 2235 2230 2229 + 2235 2236 2230 + 2236 2231 2230 + 2236 2237 2231 + 2237 2232 2231 + 2237 2238 2232 + 2238 2233 2232 + 2238 2234 2233 + 2239 2240 2234 + 2239 2234 2238 + 2240 2235 2234 + 2240 2241 2235 + 2241 2236 2235 + 2241 2242 2236 + 2242 2237 2236 + 2242 2243 2237 + 2243 2238 2237 + 2243 2239 2238 + 2244 2245 2239 + 2244 2239 2243 + 2245 2240 2239 + 2245 2246 2240 + 2246 2241 2240 + 2246 2247 2241 + 2247 2242 2241 + 2247 2248 2242 + 2248 2243 2242 + 2248 2244 2243 + 2249 2250 2244 + 2249 2244 2248 + 2250 2245 2244 + 2251 2246 2245 + 2252 2251 2245 + 2250 2252 2245 + 2246 2251 2253 + 2253 2247 2246 + 2253 2254 2247 + 2254 2248 2247 + 2254 2249 2248 + 2249 2252 2250 + 2249 2254 2253 + 2249 2253 2252 + 2251 2252 2253 + 2255 2256 2257 + 2255 2258 2259 + 2260 2261 2255 + 2255 2259 2256 + 2260 2255 2257 + 2261 2258 2255 + 2256 2262 2257 + 2263 2264 2256 + 2263 2256 2259 + 2264 2262 2256 + 2265 2260 2257 + 2265 2257 2262 + 2261 2266 2258 + 2266 2259 2258 + 2266 2263 2259 + 2267 2268 2260 + 2268 2261 2260 + 2267 2260 2265 + 2268 2269 2261 + 2269 2266 2261 + 2264 2265 2262 + 2270 2271 2263 + 2270 2263 2266 + 2271 2264 2263 + 2271 2272 2264 + 2272 2265 2264 + 2272 2267 2265 + 2269 2270 2266 + 2273 2274 2267 + 2273 2267 2272 + 2274 2268 2267 + 2274 2275 2268 + 2275 2269 2268 + 2275 2276 2269 + 2276 2270 2269 + 2276 2277 2270 + 2277 2271 2270 + 2277 2278 2271 + 2278 2272 2271 + 2278 2273 2272 + 2279 2280 2273 + 2279 2273 2278 + 2280 2274 2273 + 2280 2281 2274 + 2281 2275 2274 + 2281 2282 2275 + 2282 2276 2275 + 2282 2283 2276 + 2283 2277 2276 + 2283 2284 2277 + 2284 2278 2277 + 2284 2279 2278 + 2285 2286 2279 + 2285 2279 2284 + 2286 2280 2279 + 2286 2287 2280 + 2287 2281 2280 + 2287 2288 2281 + 2288 2282 2281 + 2288 2289 2282 + 2289 2283 2282 + 2289 2290 2283 + 2290 2284 2283 + 2290 2285 2284 + 2291 2292 2285 + 2291 2285 2290 + 2292 2286 2285 + 2292 2293 2286 + 2293 2287 2286 + 2293 2294 2287 + 2294 2288 2287 + 2294 2295 2288 + 2295 2289 2288 + 2295 2296 2289 + 2296 2290 2289 + 2296 2291 2290 + 2297 2298 2291 + 2297 2291 2296 + 2298 2292 2291 + 2298 2299 2292 + 2299 2293 2292 + 2299 2300 2293 + 2300 2294 2293 + 2300 2301 2294 + 2301 2295 2294 + 2301 2302 2295 + 2302 2296 2295 + 2302 2297 2296 + 2303 2304 2297 + 2304 2298 2297 + 2303 2297 2302 + 2304 2305 2298 + 2305 2299 2298 + 2305 2306 2299 + 2306 2300 2299 + 2306 2307 2300 + 2307 2301 2300 + 2307 2308 2301 + 2308 2302 2301 + 2308 2303 2302 + 2309 2310 2303 + 2309 2303 2308 + 2310 2304 2303 + 2310 2311 2304 + 2311 2305 2304 + 2311 2312 2305 + 2312 2306 2305 + 2312 2313 2306 + 2313 2307 2306 + 2313 2314 2307 + 2314 2308 2307 + 2314 2309 2308 + 2315 2316 2309 + 2315 2309 2314 + 2316 2310 2309 + 2316 2317 2310 + 2317 2311 2310 + 2317 2318 2311 + 2318 2312 2311 + 2318 2319 2312 + 2319 2313 2312 + 2319 2320 2313 + 2320 2314 2313 + 2320 2315 2314 + 2321 2322 2315 + 2321 2315 2320 + 2322 2316 2315 + 2322 2323 2316 + 2323 2317 2316 + 2323 2324 2317 + 2324 2318 2317 + 2324 2325 2318 + 2325 2319 2318 + 2325 2326 2319 + 2326 2320 2319 + 2321 2320 2326 + 2327 2328 2321 + 2327 2321 2326 + 2328 2322 2321 + 2328 2329 2322 + 2329 2323 2322 + 2329 2330 2323 + 2330 2324 2323 + 2330 2331 2324 + 2331 2325 2324 + 2331 2332 2325 + 2332 2326 2325 + 2332 2327 2326 + 2333 2334 2327 + 2333 2327 2332 + 2334 2328 2327 + 2334 2335 2328 + 2335 2329 2328 + 2335 2336 2329 + 2336 2330 2329 + 2336 2337 2330 + 2337 2331 2330 + 2337 2338 2331 + 2338 2332 2331 + 2338 2333 2332 + 2339 2340 2333 + 2340 2334 2333 + 2339 2333 2338 + 2340 2341 2334 + 2341 2335 2334 + 2341 2342 2335 + 2342 2336 2335 + 2342 2343 2336 + 2343 2337 2336 + 2343 2344 2337 + 2344 2338 2337 + 2344 2339 2338 + 2345 2339 2346 + 2346 2339 2344 + 2345 2340 2339 + 2345 2347 2340 + 2347 2341 2340 + 2347 2348 2341 + 2348 2342 2341 + 2348 2349 2342 + 2349 2343 2342 + 2349 2350 2343 + 2350 2344 2343 + 2350 2346 2344 + 2350 2345 2346 + 2348 2347 2345 + 2348 2345 2350 + 2348 2350 2349 + 2351 2352 2353 + 2354 2351 2355 + 2351 2354 2356 + 2351 2353 2355 + 2351 2356 2352 + 2352 2356 2357 + 2352 2357 2353 + 2355 2353 2358 + 2353 2357 2359 + 2353 2359 2358 + 2356 2354 2360 + 2354 2355 2360 + 2360 2355 2361 + 2355 2358 2361 + 2356 2360 2357 + 2357 2360 2362 + 2357 2362 2359 + 2361 2358 2363 + 2358 2359 2364 + 2358 2364 2363 + 2359 2362 2365 + 2359 2365 2364 + 2360 2361 2362 + 2362 2361 2366 + 2361 2363 2366 + 2362 2366 2365 + 2366 2363 2367 + 2363 2364 2368 + 2363 2368 2367 + 2364 2365 2369 + 2364 2369 2368 + 2365 2366 2370 + 2365 2370 2369 + 2366 2367 2370 + 2370 2367 2371 + 2367 2368 2372 + 2367 2372 2371 + 2368 2369 2373 + 2368 2373 2372 + 2369 2370 2374 + 2369 2374 2373 + 2370 2371 2374 + 2374 2371 2375 + 2371 2372 2376 + 2371 2376 2375 + 2372 2373 2377 + 2372 2377 2376 + 2373 2374 2378 + 2373 2378 2377 + 2374 2375 2378 + 2378 2375 2379 + 2375 2376 2380 + 2375 2380 2379 + 2376 2377 2381 + 2376 2381 2380 + 2377 2378 2382 + 2377 2382 2381 + 2378 2379 2382 + 2382 2379 2383 + 2379 2380 2384 + 2379 2384 2383 + 2380 2381 2385 + 2380 2385 2384 + 2381 2382 2386 + 2381 2386 2385 + 2382 2383 2386 + 2386 2383 2387 + 2383 2384 2388 + 2383 2388 2387 + 2384 2385 2389 + 2384 2389 2388 + 2385 2386 2390 + 2385 2390 2389 + 2386 2387 2390 + 2390 2387 2391 + 2387 2388 2392 + 2387 2392 2391 + 2388 2389 2393 + 2388 2393 2392 + 2389 2390 2394 + 2389 2394 2393 + 2390 2391 2394 + 2394 2391 2395 + 2391 2392 2396 + 2391 2396 2395 + 2392 2393 2397 + 2392 2397 2396 + 2393 2394 2398 + 2393 2398 2397 + 2394 2395 2398 + 2398 2395 2399 + 2395 2396 2400 + 2395 2400 2399 + 2396 2397 2401 + 2396 2401 2400 + 2397 2398 2402 + 2397 2402 2401 + 2398 2399 2402 + 2402 2399 2403 + 2399 2400 2404 + 2399 2404 2403 + 2400 2401 2405 + 2400 2405 2404 + 2401 2402 2406 + 2401 2406 2405 + 2402 2403 2406 + 2406 2403 2407 + 2403 2404 2408 + 2403 2408 2407 + 2404 2405 2409 + 2404 2409 2408 + 2405 2406 2410 + 2405 2410 2409 + 2406 2407 2410 + 2410 2407 2411 + 2407 2408 2412 + 2407 2412 2411 + 2408 2409 2413 + 2408 2413 2412 + 2409 2410 2414 + 2409 2414 2413 + 2410 2411 2414 + 2413 2414 2411 + 2413 2411 2412 + 2415 2416 2417 + 2418 2415 2419 + 2415 2417 2420 + 2415 2418 2416 + 2419 2415 2420 + 2416 2421 2422 + 2418 2423 2416 + 2417 2416 2422 + 2416 2423 2421 + 2420 2417 2424 + 2417 2422 2425 + 2424 2417 2425 + 2419 2423 2418 + 2419 2424 2423 + 2419 2420 2424 + 2421 2426 2427 + 2423 2428 2421 + 2422 2421 2427 + 2421 2428 2426 + 2422 2427 2429 + 2425 2422 2429 + 2423 2424 2428 + 2424 2425 2428 + 2425 2429 2430 + 2428 2425 2430 + 2426 2431 2432 + 2428 2430 2426 + 2427 2426 2432 + 2426 2430 2431 + 2427 2432 2433 + 2429 2427 2433 + 2429 2433 2434 + 2430 2429 2434 + 2430 2434 2431 + 2431 2435 2436 + 2432 2431 2436 + 2431 2434 2435 + 2432 2436 2437 + 2433 2432 2437 + 2433 2437 2438 + 2434 2433 2438 + 2434 2438 2435 + 2435 2439 2440 + 2436 2435 2440 + 2435 2438 2439 + 2436 2440 2441 + 2437 2436 2441 + 2437 2441 2442 + 2438 2437 2442 + 2438 2442 2439 + 2439 2443 2444 + 2440 2439 2444 + 2439 2442 2443 + 2440 2444 2445 + 2441 2440 2445 + 2441 2445 2446 + 2442 2441 2446 + 2442 2446 2443 + 2443 2447 2448 + 2444 2443 2448 + 2443 2446 2447 + 2444 2448 2449 + 2445 2444 2449 + 2445 2449 2450 + 2446 2445 2450 + 2446 2450 2447 + 2447 2451 2452 + 2448 2447 2452 + 2447 2450 2451 + 2448 2452 2453 + 2449 2448 2453 + 2449 2453 2454 + 2450 2449 2454 + 2450 2454 2451 + 2451 2455 2456 + 2452 2451 2456 + 2451 2454 2455 + 2452 2456 2457 + 2453 2452 2457 + 2453 2457 2458 + 2454 2453 2458 + 2454 2458 2455 + 2455 2459 2460 + 2456 2455 2460 + 2455 2458 2459 + 2456 2460 2461 + 2457 2456 2461 + 2457 2461 2462 + 2458 2457 2462 + 2458 2462 2459 + 2459 2463 2464 + 2460 2459 2464 + 2459 2462 2463 + 2460 2464 2465 + 2461 2460 2465 + 2461 2465 2466 + 2462 2461 2466 + 2462 2466 2463 + 2463 2467 2468 + 2464 2463 2468 + 2463 2466 2467 + 2464 2468 2469 + 2465 2464 2469 + 2465 2469 2470 + 2466 2465 2470 + 2466 2470 2467 + 2467 2471 2472 + 2468 2467 2472 + 2467 2470 2471 + 2468 2472 2473 + 2469 2468 2473 + 2469 2473 2474 + 2470 2469 2474 + 2470 2474 2471 + 2471 2475 2476 + 2472 2471 2476 + 2471 2474 2475 + 2472 2476 2477 + 2473 2472 2477 + 2473 2477 2478 + 2474 2473 2478 + 2474 2478 2475 + 2477 2476 2475 + 2475 2478 2477 + 2479 2480 2481 + 2482 2479 2483 + 2484 2480 2479 + 2479 2481 2483 + 2484 2479 2482 + 2480 2485 2486 + 2484 2485 2480 + 2480 2486 2481 + 2483 2481 2487 + 2481 2486 2488 + 2481 2488 2487 + 2489 2482 2490 + 2482 2483 2490 + 2484 2482 2489 + 2490 2483 2491 + 2483 2487 2491 + 2485 2484 2492 + 2484 2489 2493 + 2484 2493 2492 + 2485 2492 2486 + 2486 2492 2494 + 2486 2494 2488 + 2491 2487 2495 + 2487 2488 2496 + 2487 2496 2495 + 2488 2494 2497 + 2488 2497 2496 + 2489 2490 2493 + 2493 2490 2498 + 2490 2491 2498 + 2498 2491 2499 + 2491 2495 2499 + 2492 2493 2500 + 2492 2500 2494 + 2493 2498 2500 + 2494 2500 2501 + 2494 2501 2497 + 2499 2495 2502 + 2495 2496 2503 + 2495 2503 2502 + 2496 2497 2504 + 2496 2504 2503 + 2497 2501 2505 + 2497 2505 2504 + 2500 2498 2506 + 2498 2499 2506 + 2506 2499 2507 + 2499 2502 2507 + 2500 2506 2501 + 2501 2506 2508 + 2501 2508 2505 + 2507 2502 2509 + 2502 2503 2510 + 2502 2510 2509 + 2503 2504 2511 + 2503 2511 2510 + 2504 2505 2512 + 2504 2512 2511 + 2505 2508 2513 + 2505 2513 2512 + 2506 2507 2508 + 2508 2507 2514 + 2507 2509 2514 + 2508 2514 2513 + 2514 2509 2515 + 2509 2510 2516 + 2509 2516 2515 + 2511 2517 2510 + 2510 2517 2516 + 2511 2512 2518 + 2511 2518 2517 + 2512 2513 2519 + 2512 2519 2518 + 2513 2514 2520 + 2513 2520 2519 + 2514 2515 2520 + 2520 2515 2521 + 2515 2516 2522 + 2515 2522 2521 + 2516 2517 2523 + 2516 2523 2522 + 2517 2518 2524 + 2517 2524 2523 + 2518 2519 2525 + 2518 2525 2524 + 2519 2520 2526 + 2519 2526 2525 + 2520 2521 2526 + 2526 2521 2527 + 2521 2522 2528 + 2521 2528 2527 + 2522 2523 2529 + 2522 2529 2528 + 2523 2524 2530 + 2523 2530 2529 + 2524 2525 2531 + 2524 2531 2530 + 2525 2526 2532 + 2525 2532 2531 + 2526 2527 2532 + 2532 2527 2533 + 2527 2528 2534 + 2527 2534 2533 + 2528 2529 2535 + 2528 2535 2534 + 2529 2530 2536 + 2529 2536 2535 + 2530 2531 2537 + 2530 2537 2536 + 2531 2532 2538 + 2531 2538 2537 + 2532 2533 2538 + 2538 2533 2539 + 2533 2534 2540 + 2533 2540 2539 + 2534 2535 2541 + 2534 2541 2540 + 2535 2536 2542 + 2535 2542 2541 + 2536 2537 2543 + 2536 2543 2542 + 2537 2538 2544 + 2537 2544 2543 + 2538 2539 2544 + 2544 2539 2545 + 2539 2540 2546 + 2539 2546 2545 + 2540 2541 2547 + 2540 2547 2546 + 2541 2542 2548 + 2541 2548 2547 + 2542 2543 2549 + 2542 2549 2548 + 2543 2544 2550 + 2543 2550 2549 + 2544 2545 2550 + 2550 2545 2551 + 2545 2546 2552 + 2545 2552 2551 + 2546 2547 2553 + 2553 2552 2546 + 2547 2548 2554 + 2547 2554 2553 + 2548 2549 2555 + 2548 2555 2554 + 2549 2550 2556 + 2549 2556 2555 + 2550 2551 2556 + 2556 2551 2557 + 2551 2552 2558 + 2551 2558 2557 + 2552 2553 2559 + 2552 2559 2558 + 2553 2554 2560 + 2553 2560 2559 + 2554 2555 2561 + 2554 2561 2560 + 2555 2556 2562 + 2555 2562 2561 + 2556 2557 2562 + 2562 2557 2563 + 2557 2558 2564 + 2557 2564 2563 + 2558 2559 2565 + 2558 2565 2564 + 2559 2560 2566 + 2559 2566 2565 + 2560 2561 2567 + 2560 2567 2566 + 2561 2562 2568 + 2561 2568 2567 + 2562 2563 2568 + 2568 2563 2569 + 2563 2564 2570 + 2563 2570 2569 + 2564 2565 2571 + 2564 2571 2570 + 2565 2566 2572 + 2565 2572 2571 + 2566 2567 2573 + 2566 2573 2572 + 2567 2568 2574 + 2567 2574 2573 + 2568 2569 2574 + 2574 2569 2570 + 2574 2570 2571 + 2571 2572 2573 + 2574 2571 2573 + 2575 2576 2577 + 2578 2575 2579 + 2575 2578 2580 + 2575 2577 2579 + 2575 2580 2581 + 2575 2581 2576 + 2576 2582 2583 + 2581 2582 2576 + 2576 2583 2577 + 2579 2577 2584 + 2577 2583 2585 + 2577 2585 2584 + 2580 2578 2586 + 2578 2579 2586 + 2586 2579 2587 + 2579 2584 2587 + 2581 2580 2588 + 2580 2586 2588 + 2582 2581 2589 + 2581 2588 2589 + 2582 2589 2583 + 2583 2589 2590 + 2583 2590 2585 + 2587 2584 2591 + 2584 2585 2592 + 2584 2592 2591 + 2585 2590 2593 + 2585 2593 2592 + 2588 2586 2594 + 2586 2587 2594 + 2594 2587 2595 + 2587 2591 2595 + 2589 2588 2596 + 2588 2594 2596 + 2589 2596 2590 + 2590 2596 2597 + 2590 2597 2593 + 2595 2591 2598 + 2591 2592 2599 + 2591 2599 2598 + 2592 2593 2600 + 2592 2600 2599 + 2593 2597 2601 + 2593 2601 2600 + 2596 2594 2602 + 2594 2595 2602 + 2602 2595 2603 + 2595 2598 2603 + 2596 2602 2597 + 2597 2602 2604 + 2597 2604 2601 + 2603 2598 2605 + 2598 2599 2606 + 2598 2606 2605 + 2599 2600 2607 + 2599 2607 2606 + 2600 2601 2608 + 2600 2608 2607 + 2601 2604 2609 + 2601 2609 2608 + 2602 2603 2604 + 2604 2603 2610 + 2603 2605 2610 + 2604 2610 2609 + 2610 2605 2611 + 2605 2606 2612 + 2605 2612 2611 + 2606 2607 2613 + 2606 2613 2612 + 2607 2608 2614 + 2607 2614 2613 + 2608 2609 2615 + 2608 2615 2614 + 2609 2610 2616 + 2609 2616 2615 + 2610 2611 2616 + 2616 2611 2617 + 2611 2612 2618 + 2611 2618 2617 + 2612 2613 2619 + 2612 2619 2618 + 2613 2614 2620 + 2613 2620 2619 + 2614 2615 2621 + 2614 2621 2620 + 2615 2616 2622 + 2615 2622 2621 + 2616 2617 2622 + 2622 2617 2623 + 2617 2618 2624 + 2617 2624 2623 + 2618 2619 2625 + 2618 2625 2624 + 2619 2620 2626 + 2619 2626 2625 + 2620 2621 2627 + 2620 2627 2626 + 2621 2622 2628 + 2621 2628 2627 + 2622 2623 2628 + 2628 2623 2629 + 2623 2624 2630 + 2623 2630 2629 + 2624 2625 2631 + 2624 2631 2630 + 2625 2626 2632 + 2625 2632 2631 + 2626 2627 2633 + 2626 2633 2632 + 2627 2628 2634 + 2627 2634 2633 + 2628 2629 2634 + 2634 2629 2635 + 2629 2630 2636 + 2629 2636 2635 + 2630 2631 2637 + 2630 2637 2636 + 2631 2632 2638 + 2631 2638 2637 + 2632 2633 2639 + 2632 2639 2638 + 2633 2634 2640 + 2633 2640 2639 + 2634 2635 2640 + 2640 2635 2641 + 2635 2636 2642 + 2635 2642 2641 + 2636 2637 2643 + 2636 2643 2642 + 2637 2638 2644 + 2637 2644 2643 + 2638 2639 2645 + 2638 2645 2644 + 2639 2640 2646 + 2639 2646 2645 + 2640 2641 2646 + 2646 2641 2647 + 2641 2642 2648 + 2641 2648 2647 + 2642 2643 2649 + 2642 2649 2648 + 2643 2644 2650 + 2643 2650 2649 + 2644 2645 2651 + 2644 2651 2650 + 2645 2646 2652 + 2652 2651 2645 + 2646 2647 2652 + 2652 2647 2653 + 2647 2648 2654 + 2647 2654 2653 + 2648 2649 2655 + 2648 2655 2654 + 2649 2650 2656 + 2649 2656 2655 + 2650 2651 2657 + 2650 2657 2656 + 2651 2652 2658 + 2651 2658 2657 + 2652 2653 2658 + 2658 2653 2659 + 2653 2654 2660 + 2653 2660 2659 + 2654 2655 2661 + 2654 2661 2660 + 2655 2656 2662 + 2655 2662 2661 + 2656 2657 2663 + 2656 2663 2662 + 2657 2658 2664 + 2657 2664 2663 + 2658 2659 2664 + 2664 2659 2665 + 2659 2660 2666 + 2659 2666 2665 + 2660 2661 2667 + 2660 2667 2666 + 2661 2662 2668 + 2661 2668 2667 + 2662 2663 2669 + 2662 2669 2668 + 2663 2664 2670 + 2663 2670 2669 + 2664 2665 2670 + 2665 2666 2667 + 2665 2667 2670 + 2669 2670 2667 + 2669 2667 2668 + 2671 2672 2673 + 2674 2671 2675 + 2671 2674 2676 + 2671 2673 2675 + 2671 2676 2677 + 2671 2677 2672 + 2672 2678 2679 + 2677 2678 2672 + 2672 2679 2673 + 2675 2673 2680 + 2673 2679 2681 + 2673 2681 2680 + 2676 2674 2682 + 2674 2675 2682 + 2682 2675 2683 + 2675 2680 2683 + 2677 2676 2684 + 2676 2682 2684 + 2678 2677 2685 + 2677 2684 2685 + 2678 2685 2679 + 2679 2685 2686 + 2679 2686 2681 + 2683 2680 2687 + 2680 2681 2688 + 2680 2688 2687 + 2681 2686 2689 + 2681 2689 2688 + 2682 2690 2684 + 2682 2683 2690 + 2690 2683 2691 + 2683 2687 2691 + 2685 2684 2692 + 2684 2690 2692 + 2685 2692 2686 + 2686 2692 2693 + 2686 2693 2689 + 2691 2687 2694 + 2687 2688 2695 + 2687 2695 2694 + 2688 2689 2696 + 2688 2696 2695 + 2689 2693 2697 + 2689 2697 2696 + 2692 2690 2698 + 2690 2691 2698 + 2698 2691 2699 + 2691 2694 2699 + 2692 2698 2693 + 2693 2698 2700 + 2693 2700 2697 + 2699 2694 2701 + 2694 2695 2702 + 2694 2702 2701 + 2695 2696 2703 + 2695 2703 2702 + 2696 2697 2704 + 2696 2704 2703 + 2697 2700 2705 + 2697 2705 2704 + 2698 2699 2700 + 2700 2699 2706 + 2699 2701 2706 + 2700 2706 2705 + 2706 2701 2707 + 2701 2702 2708 + 2701 2708 2707 + 2702 2703 2709 + 2702 2709 2708 + 2703 2704 2710 + 2703 2710 2709 + 2704 2705 2711 + 2704 2711 2710 + 2705 2706 2712 + 2705 2712 2711 + 2706 2707 2712 + 2712 2707 2713 + 2707 2708 2714 + 2707 2714 2713 + 2708 2709 2715 + 2708 2715 2714 + 2709 2710 2716 + 2709 2716 2715 + 2710 2711 2717 + 2710 2717 2716 + 2711 2712 2718 + 2711 2718 2717 + 2712 2713 2718 + 2718 2713 2719 + 2713 2714 2720 + 2713 2720 2719 + 2714 2715 2721 + 2714 2721 2720 + 2715 2716 2722 + 2715 2722 2721 + 2716 2717 2723 + 2716 2723 2722 + 2717 2718 2724 + 2717 2724 2723 + 2718 2719 2724 + 2724 2719 2725 + 2719 2720 2726 + 2719 2726 2725 + 2720 2721 2727 + 2720 2727 2726 + 2721 2722 2728 + 2721 2728 2727 + 2722 2723 2729 + 2722 2729 2728 + 2723 2724 2730 + 2723 2730 2729 + 2724 2725 2730 + 2730 2725 2731 + 2725 2726 2732 + 2725 2732 2731 + 2726 2727 2733 + 2726 2733 2732 + 2727 2728 2734 + 2727 2734 2733 + 2728 2729 2735 + 2728 2735 2734 + 2729 2730 2736 + 2729 2736 2735 + 2730 2731 2736 + 2736 2731 2737 + 2731 2732 2738 + 2731 2738 2737 + 2732 2733 2739 + 2732 2739 2738 + 2733 2734 2740 + 2733 2740 2739 + 2734 2735 2741 + 2734 2741 2740 + 2735 2736 2742 + 2735 2742 2741 + 2736 2737 2742 + 2742 2737 2743 + 2737 2738 2744 + 2737 2744 2743 + 2738 2739 2745 + 2738 2745 2744 + 2739 2740 2746 + 2739 2746 2745 + 2740 2741 2747 + 2740 2747 2746 + 2741 2742 2748 + 2741 2748 2747 + 2742 2743 2748 + 2748 2743 2749 + 2743 2744 2750 + 2743 2750 2749 + 2744 2745 2751 + 2744 2751 2750 + 2745 2746 2752 + 2745 2752 2751 + 2746 2747 2753 + 2746 2753 2752 + 2747 2748 2754 + 2747 2754 2753 + 2748 2749 2754 + 2754 2749 2755 + 2749 2750 2756 + 2749 2756 2755 + 2750 2751 2757 + 2750 2757 2756 + 2751 2752 2758 + 2751 2758 2757 + 2752 2753 2759 + 2752 2759 2758 + 2753 2754 2760 + 2760 2759 2753 + 2754 2755 2760 + 2760 2755 2761 + 2755 2756 2762 + 2755 2762 2761 + 2757 2763 2756 + 2756 2763 2762 + 2757 2758 2764 + 2757 2764 2763 + 2758 2759 2765 + 2758 2765 2764 + 2759 2760 2766 + 2759 2766 2765 + 2760 2761 2766 + 2766 2761 2764 + 2761 2762 2763 + 2761 2763 2764 + 2766 2764 2765 + + + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 159 162 165 168 171 174 177 180 183 186 189 192 195 198 201 204 207 210 213 216 219 222 225 228 231 234 237 240 243 246 249 252 255 258 261 264 267 270 273 276 279 282 285 288 291 294 297 300 303 306 309 312 315 318 321 324 327 330 333 336 339 342 345 348 351 354 357 360 363 366 369 372 375 378 381 384 387 390 393 396 399 402 405 408 411 414 417 420 423 426 429 432 435 438 441 444 447 450 453 456 459 462 465 468 471 474 477 480 483 486 489 492 495 498 501 504 507 510 513 516 519 522 525 528 531 534 537 540 543 546 549 552 555 558 561 564 567 570 573 576 579 582 585 588 591 594 597 600 603 606 609 612 615 618 621 624 627 630 633 636 639 642 645 648 651 654 657 660 663 666 669 672 675 678 681 684 687 690 693 696 699 702 705 708 711 714 717 720 723 726 729 732 735 738 741 744 747 750 753 756 759 762 765 768 771 774 777 780 783 786 789 792 795 798 801 804 807 810 813 816 819 822 825 828 831 834 837 840 843 846 849 852 855 858 861 864 867 870 873 876 879 882 885 888 891 894 897 900 903 906 909 912 915 918 921 924 927 930 933 936 939 942 945 948 951 954 957 960 963 966 969 972 975 978 981 984 987 990 993 996 999 1002 1005 1008 1011 1014 1017 1020 1023 1026 1029 1032 1035 1038 1041 1044 1047 1050 1053 1056 1059 1062 1065 1068 1071 1074 1077 1080 1083 1086 1089 1092 1095 1098 1101 1104 1107 1110 1113 1116 1119 1122 1125 1128 1131 1134 1137 1140 1143 1146 1149 1152 1155 1158 1161 1164 1167 1170 1173 1176 1179 1182 1185 1188 1191 1194 1197 1200 1203 1206 1209 1212 1215 1218 1221 1224 1227 1230 1233 1236 1239 1242 1245 1248 1251 1254 1257 1260 1263 1266 1269 1272 1275 1278 1281 1284 1287 1290 1293 1296 1299 1302 1305 1308 1311 1314 1317 1320 1323 1326 1329 1332 1335 1338 1341 1344 1347 1350 1353 1356 1359 1362 1365 1368 1371 1374 1377 1380 1383 1386 1389 1392 1395 1398 1401 1404 1407 1410 1413 1416 1419 1422 1425 1428 1431 1434 1437 1440 1443 1446 1449 1452 1455 1458 1461 1464 1467 1470 1473 1476 1479 1482 1485 1488 1491 1494 1497 1500 1503 1506 1509 1512 1515 1518 1521 1524 1527 1530 1533 1536 1539 1542 1545 1548 1551 1554 1557 1560 1563 1566 1569 1572 1575 1578 1581 1584 1587 1590 1593 1596 1599 1602 1605 1608 1611 1614 1617 1620 1623 1626 1629 1632 1635 1638 1641 1644 1647 1650 1653 1656 1659 1662 1665 1668 1671 1674 1677 1680 1683 1686 1689 1692 1695 1698 1701 1704 1707 1710 1713 1716 1719 1722 1725 1728 1731 1734 1737 1740 1743 1746 1749 1752 1755 1758 1761 1764 1767 1770 1773 1776 1779 1782 1785 1788 1791 1794 1797 1800 1803 1806 1809 1812 1815 1818 1821 1824 1827 1830 1833 1836 1839 1842 1845 1848 1851 1854 1857 1860 1863 1866 1869 1872 1875 1878 1881 1884 1887 1890 1893 1896 1899 1902 1905 1908 1911 1914 1917 1920 1923 1926 1929 1932 1935 1938 1941 1944 1947 1950 1953 1956 1959 1962 1965 1968 1971 1974 1977 1980 1983 1986 1989 1992 1995 1998 2001 2004 2007 2010 2013 2016 2019 2022 2025 2028 2031 2034 2037 2040 2043 2046 2049 2052 2055 2058 2061 2064 2067 2070 2073 2076 2079 2082 2085 2088 2091 2094 2097 2100 2103 2106 2109 2112 2115 2118 2121 2124 2127 2130 2133 2136 2139 2142 2145 2148 2151 2154 2157 2160 2163 2166 2169 2172 2175 2178 2181 2184 2187 2190 2193 2196 2199 2202 2205 2208 2211 2214 2217 2220 2223 2226 2229 2232 2235 2238 2241 2244 2247 2250 2253 2256 2259 2262 2265 2268 2271 2274 2277 2280 2283 2286 2289 2292 2295 2298 2301 2304 2307 2310 2313 2316 2319 2322 2325 2328 2331 2334 2337 2340 2343 2346 2349 2352 2355 2358 2361 2364 2367 2370 2373 2376 2379 2382 2385 2388 2391 2394 2397 2400 2403 2406 2409 2412 2415 2418 2421 2424 2427 2430 2433 2436 2439 2442 2445 2448 2451 2454 2457 2460 2463 2466 2469 2472 2475 2478 2481 2484 2487 2490 2493 2496 2499 2502 2505 2508 2511 2514 2517 2520 2523 2526 2529 2532 2535 2538 2541 2544 2547 2550 2553 2556 2559 2562 2565 2568 2571 2574 2577 2580 2583 2586 2589 2592 2595 2598 2601 2604 2607 2610 2613 2616 2619 2622 2625 2628 2631 2634 2637 2640 2643 2646 2649 2652 2655 2658 2661 2664 2667 2670 2673 2676 2679 2682 2685 2688 2691 2694 2697 2700 2703 2706 2709 2712 2715 2718 2721 2724 2727 2730 2733 2736 2739 2742 2745 2748 2751 2754 2757 2760 2763 2766 2769 2772 2775 2778 2781 2784 2787 2790 2793 2796 2799 2802 2805 2808 2811 2814 2817 2820 2823 2826 2829 2832 2835 2838 2841 2844 2847 2850 2853 2856 2859 2862 2865 2868 2871 2874 2877 2880 2883 2886 2889 2892 2895 2898 2901 2904 2907 2910 2913 2916 2919 2922 2925 2928 2931 2934 2937 2940 2943 2946 2949 2952 2955 2958 2961 2964 2967 2970 2973 2976 2979 2982 2985 2988 2991 2994 2997 3000 3003 3006 3009 3012 3015 3018 3021 3024 3027 3030 3033 3036 3039 3042 3045 3048 3051 3054 3057 3060 3063 3066 3069 3072 3075 3078 3081 3084 3087 3090 3093 3096 3099 3102 3105 3108 3111 3114 3117 3120 3123 3126 3129 3132 3135 3138 3141 3144 3147 3150 3153 3156 3159 3162 3165 3168 3171 3174 3177 3180 3183 3186 3189 3192 3195 3198 3201 3204 3207 3210 3213 3216 3219 3222 3225 3228 3231 3234 3237 3240 3243 3246 3249 3252 3255 3258 3261 3264 3267 3270 3273 3276 3279 3282 3285 3288 3291 3294 3297 3300 3303 3306 3309 3312 3315 3318 3321 3324 3327 3330 3333 3336 3339 3342 3345 3348 3351 3354 3357 3360 3363 3366 3369 3372 3375 3378 3381 3384 3387 3390 3393 3396 3399 3402 3405 3408 3411 3414 3417 3420 3423 3426 3429 3432 3435 3438 3441 3444 3447 3450 3453 3456 3459 3462 3465 3468 3471 3474 3477 3480 3483 3486 3489 3492 3495 3498 3501 3504 3507 3510 3513 3516 3519 3522 3525 3528 3531 3534 3537 3540 3543 3546 3549 3552 3555 3558 3561 3564 3567 3570 3573 3576 3579 3582 3585 3588 3591 3594 3597 3600 3603 3606 3609 3612 3615 3618 3621 3624 3627 3630 3633 3636 3639 3642 3645 3648 3651 3654 3657 3660 3663 3666 3669 3672 3675 3678 3681 3684 3687 3690 3693 3696 3699 3702 3705 3708 3711 3714 3717 3720 3723 3726 3729 3732 3735 3738 3741 3744 3747 3750 3753 3756 3759 3762 3765 3768 3771 3774 3777 3780 3783 3786 3789 3792 3795 3798 3801 3804 3807 3810 3813 3816 3819 3822 3825 3828 3831 3834 3837 3840 3843 3846 3849 3852 3855 3858 3861 3864 3867 3870 3873 3876 3879 3882 3885 3888 3891 3894 3897 3900 3903 3906 3909 3912 3915 3918 3921 3924 3927 3930 3933 3936 3939 3942 3945 3948 3951 3954 3957 3960 3963 3966 3969 3972 3975 3978 3981 3984 3987 3990 3993 3996 3999 4002 4005 4008 4011 4014 4017 4020 4023 4026 4029 4032 4035 4038 4041 4044 4047 4050 4053 4056 4059 4062 4065 4068 4071 4074 4077 4080 4083 4086 4089 4092 4095 4098 4101 4104 4107 4110 4113 4116 4119 4122 4125 4128 4131 4134 4137 4140 4143 4146 4149 4152 4155 4158 4161 4164 4167 4170 4173 4176 4179 4182 4185 4188 4191 4194 4197 4200 4203 4206 4209 4212 4215 4218 4221 4224 4227 4230 4233 4236 4239 4242 4245 4248 4251 4254 4257 4260 4263 4266 4269 4272 4275 4278 4281 4284 4287 4290 4293 4296 4299 4302 4305 4308 4311 4314 4317 4320 4323 4326 4329 4332 4335 4338 4341 4344 4347 4350 4353 4356 4359 4362 4365 4368 4371 4374 4377 4380 4383 4386 4389 4392 4395 4398 4401 4404 4407 4410 4413 4416 4419 4422 4425 4428 4431 4434 4437 4440 4443 4446 4449 4452 4455 4458 4461 4464 4467 4470 4473 4476 4479 4482 4485 4488 4491 4494 4497 4500 4503 4506 4509 4512 4515 4518 4521 4524 4527 4530 4533 4536 4539 4542 4545 4548 4551 4554 4557 4560 4563 4566 4569 4572 4575 4578 4581 4584 4587 4590 4593 4596 4599 4602 4605 4608 4611 4614 4617 4620 4623 4626 4629 4632 4635 4638 4641 4644 4647 4650 4653 4656 4659 4662 4665 4668 4671 4674 4677 4680 4683 4686 4689 4692 4695 4698 4701 4704 4707 4710 4713 4716 4719 4722 4725 4728 4731 4734 4737 4740 4743 4746 4749 4752 4755 4758 4761 4764 4767 4770 4773 4776 4779 4782 4785 4788 4791 4794 4797 4800 4803 4806 4809 4812 4815 4818 4821 4824 4827 4830 4833 4836 4839 4842 4845 4848 4851 4854 4857 4860 4863 4866 4869 4872 4875 4878 4881 4884 4887 4890 4893 4896 4899 4902 4905 4908 4911 4914 4917 4920 4923 4926 4929 4932 4935 4938 4941 4944 4947 4950 4953 4956 4959 4962 4965 4968 4971 4974 4977 4980 4983 4986 4989 4992 4995 4998 5001 5004 5007 5010 5013 5016 5019 5022 5025 5028 5031 5034 5037 5040 5043 5046 5049 5052 5055 5058 5061 5064 5067 5070 5073 5076 5079 5082 5085 5088 5091 5094 5097 5100 5103 5106 5109 5112 5115 5118 5121 5124 5127 5130 5133 5136 5139 5142 5145 5148 5151 5154 5157 5160 5163 5166 5169 5172 5175 5178 5181 5184 5187 5190 5193 5196 5199 5202 5205 5208 5211 5214 5217 5220 5223 5226 5229 5232 5235 5238 5241 5244 5247 5250 5253 5256 5259 5262 5265 5268 5271 5274 5277 5280 5283 5286 5289 5292 5295 5298 5301 5304 5307 5310 5313 5316 5319 5322 5325 5328 5331 5334 5337 5340 5343 5346 5349 5352 5355 5358 5361 5364 5367 5370 5373 5376 5379 5382 5385 5388 5391 5394 5397 5400 5403 5406 5409 5412 5415 5418 5421 5424 5427 5430 5433 5436 5439 5442 5445 5448 5451 5454 5457 5460 5463 5466 5469 5472 5475 5478 5481 5484 5487 5490 5493 5496 5499 5502 5505 5508 5511 5514 5517 5520 5523 5526 5529 5532 5535 5538 5541 5544 5547 5550 5553 5556 5559 5562 5565 5568 5571 5574 5577 5580 5583 5586 5589 5592 5595 5598 5601 5604 5607 5610 5613 5616 5619 5622 5625 5628 5631 5634 5637 5640 5643 5646 5649 5652 5655 5658 5661 5664 5667 5670 5673 5676 5679 5682 5685 5688 5691 5694 5697 5700 5703 5706 5709 5712 5715 5718 5721 5724 5727 5730 5733 5736 5739 5742 5745 5748 5751 5754 5757 5760 5763 5766 5769 5772 5775 5778 5781 5784 5787 5790 5793 5796 5799 5802 5805 5808 5811 5814 5817 5820 5823 5826 5829 5832 5835 5838 5841 5844 5847 5850 5853 5856 5859 5862 5865 5868 5871 5874 5877 5880 5883 5886 5889 5892 5895 5898 5901 5904 5907 5910 5913 5916 5919 5922 5925 5928 5931 5934 5937 5940 5943 5946 5949 5952 5955 5958 5961 5964 5967 5970 5973 5976 5979 5982 5985 5988 5991 5994 5997 6000 6003 6006 6009 6012 6015 6018 6021 6024 6027 6030 6033 6036 6039 6042 6045 6048 6051 6054 6057 6060 6063 6066 6069 6072 6075 6078 6081 6084 6087 6090 6093 6096 6099 6102 6105 6108 6111 6114 6117 6120 6123 6126 6129 6132 6135 6138 6141 6144 6147 6150 6153 6156 6159 6162 6165 6168 6171 6174 6177 6180 6183 6186 6189 6192 6195 6198 6201 6204 6207 6210 6213 6216 6219 6222 6225 6228 6231 6234 6237 6240 6243 6246 6249 6252 6255 6258 6261 6264 6267 6270 6273 6276 6279 6282 6285 6288 6291 6294 6297 6300 6303 6306 6309 6312 6315 6318 6321 6324 6327 6330 6333 6336 6339 6342 6345 6348 6351 6354 6357 6360 6363 6366 6369 6372 6375 6378 6381 6384 6387 6390 6393 6396 6399 6402 6405 6408 6411 6414 6417 6420 6423 6426 6429 6432 6435 6438 6441 6444 6447 6450 6453 6456 6459 6462 6465 6468 6471 6474 6477 6480 6483 6486 6489 6492 6495 6498 6501 6504 6507 6510 6513 6516 6519 6522 6525 6528 6531 6534 6537 6540 6543 6546 6549 6552 6555 6558 6561 6564 6567 6570 6573 6576 6579 6582 6585 6588 6591 6594 6597 6600 6603 6606 6609 6612 6615 6618 6621 6624 6627 6630 6633 6636 6639 6642 6645 6648 6651 6654 6657 6660 6663 6666 6669 6672 6675 6678 6681 6684 6687 6690 6693 6696 6699 6702 6705 6708 6711 6714 6717 6720 6723 6726 6729 6732 6735 6738 6741 6744 6747 6750 6753 6756 6759 6762 6765 6768 6771 6774 6777 6780 6783 6786 6789 6792 6795 6798 6801 6804 6807 6810 6813 6816 6819 6822 6825 6828 6831 6834 6837 6840 6843 6846 6849 6852 6855 6858 6861 6864 6867 6870 6873 6876 6879 6882 6885 6888 6891 6894 6897 6900 6903 6906 6909 6912 6915 6918 6921 6924 6927 6930 6933 6936 6939 6942 6945 6948 6951 6954 6957 6960 6963 6966 6969 6972 6975 6978 6981 6984 6987 6990 6993 6996 6999 7002 7005 7008 7011 7014 7017 7020 7023 7026 7029 7032 7035 7038 7041 7044 7047 7050 7053 7056 7059 7062 7065 7068 7071 7074 7077 7080 7083 7086 7089 7092 7095 7098 7101 7104 7107 7110 7113 7116 7119 7122 7125 7128 7131 7134 7137 7140 7143 7146 7149 7152 7155 7158 7161 7164 7167 7170 7173 7176 7179 7182 7185 7188 7191 7194 7197 7200 7203 7206 7209 7212 7215 7218 7221 7224 7227 7230 7233 7236 7239 7242 7245 7248 7251 7254 7257 7260 7263 7266 7269 7272 7275 7278 7281 7284 7287 7290 7293 7296 7299 7302 7305 7308 7311 7314 7317 7320 7323 7326 7329 7332 7335 7338 7341 7344 7347 7350 7353 7356 7359 7362 7365 7368 7371 7374 7377 7380 7383 7386 7389 7392 7395 7398 7401 7404 7407 7410 7413 7416 7419 7422 7425 7428 7431 7434 7437 7440 7443 7446 7449 7452 7455 7458 7461 7464 7467 7470 7473 7476 7479 7482 7485 7488 7491 7494 7497 7500 7503 7506 7509 7512 7515 7518 7521 7524 7527 7530 7533 7536 7539 7542 7545 7548 7551 7554 7557 7560 7563 7566 7569 7572 7575 7578 7581 7584 7587 7590 7593 7596 7599 7602 7605 7608 7611 7614 7617 7620 7623 7626 7629 7632 7635 7638 7641 7644 7647 7650 7653 7656 7659 7662 7665 7668 7671 7674 7677 7680 7683 7686 7689 7692 7695 7698 7701 7704 7707 7710 7713 7716 7719 7722 7725 7728 7731 7734 7737 7740 7743 7746 7749 7752 7755 7758 7761 7764 7767 7770 7773 7776 7779 7782 7785 7788 7791 7794 7797 7800 7803 7806 7809 7812 7815 7818 7821 7824 7827 7830 7833 7836 7839 7842 7845 7848 7851 7854 7857 7860 7863 7866 7869 7872 7875 7878 7881 7884 7887 7890 7893 7896 7899 7902 7905 7908 7911 7914 7917 7920 7923 7926 7929 7932 7935 7938 7941 7944 7947 7950 7953 7956 7959 7962 7965 7968 7971 7974 7977 7980 7983 7986 7989 7992 7995 7998 8001 8004 8007 8010 8013 8016 8019 8022 8025 8028 8031 8034 8037 8040 8043 8046 8049 8052 8055 8058 8061 8064 8067 8070 8073 8076 8079 8082 8085 8088 8091 8094 8097 8100 8103 8106 8109 8112 8115 8118 8121 8124 8127 8130 8133 8136 8139 8142 8145 8148 8151 8154 8157 8160 8163 8166 8169 8172 8175 8178 8181 8184 8187 8190 8193 8196 8199 8202 8205 8208 8211 8214 8217 8220 8223 8226 8229 8232 8235 8238 8241 8244 8247 8250 8253 8256 8259 8262 8265 8268 8271 8274 8277 8280 8283 8286 8289 8292 8295 8298 8301 8304 8307 8310 8313 8316 8319 8322 8325 8328 8331 8334 8337 8340 8343 8346 8349 8352 8355 8358 8361 8364 8367 8370 8373 8376 8379 8382 8385 8388 8391 8394 8397 8400 8403 8406 8409 8412 8415 8418 8421 8424 8427 8430 8433 8436 8439 8442 8445 8448 8451 8454 8457 8460 8463 8466 8469 8472 8475 8478 8481 8484 8487 8490 8493 8496 8499 8502 8505 8508 8511 8514 8517 8520 8523 8526 8529 8532 8535 8538 8541 8544 8547 8550 8553 8556 8559 8562 8565 8568 8571 8574 8577 8580 8583 8586 8589 8592 8595 8598 8601 8604 8607 8610 8613 8616 8619 8622 8625 8628 8631 8634 8637 8640 8643 8646 8649 8652 8655 8658 8661 8664 8667 8670 8673 8676 8679 8682 8685 8688 8691 8694 8697 8700 8703 8706 8709 8712 8715 8718 8721 8724 8727 8730 8733 8736 8739 8742 8745 8748 8751 8754 8757 8760 8763 8766 8769 8772 8775 8778 8781 8784 8787 8790 8793 8796 8799 8802 8805 8808 8811 8814 8817 8820 8823 8826 8829 8832 8835 8838 8841 8844 8847 8850 8853 8856 8859 8862 8865 8868 8871 8874 8877 8880 8883 8886 8889 8892 8895 8898 8901 8904 8907 8910 8913 8916 8919 8922 8925 8928 8931 8934 8937 8940 8943 8946 8949 8952 8955 8958 8961 8964 8967 8970 8973 8976 8979 8982 8985 8988 8991 8994 8997 9000 9003 9006 9009 9012 9015 9018 9021 9024 9027 9030 9033 9036 9039 9042 9045 9048 9051 9054 9057 9060 9063 9066 9069 9072 9075 9078 9081 9084 9087 9090 9093 9096 9099 9102 9105 9108 9111 9114 9117 9120 9123 9126 9129 9132 9135 9138 9141 9144 9147 9150 9153 9156 9159 9162 9165 9168 9171 9174 9177 9180 9183 9186 9189 9192 9195 9198 9201 9204 9207 9210 9213 9216 9219 9222 9225 9228 9231 9234 9237 9240 9243 9246 9249 9252 9255 9258 9261 9264 9267 9270 9273 9276 9279 9282 9285 9288 9291 9294 9297 9300 9303 9306 9309 9312 9315 9318 9321 9324 9327 9330 9333 9336 9339 9342 9345 9348 9351 9354 9357 9360 9363 9366 9369 9372 9375 9378 9381 9384 9387 9390 9393 9396 9399 9402 9405 9408 9411 9414 9417 9420 9423 9426 9429 9432 9435 9438 9441 9444 9447 9450 9453 9456 9459 9462 9465 9468 9471 9474 9477 9480 9483 9486 9489 9492 9495 9498 9501 9504 9507 9510 9513 9516 9519 9522 9525 9528 9531 9534 9537 9540 9543 9546 9549 9552 9555 9558 9561 9564 9567 9570 9573 9576 9579 9582 9585 9588 9591 9594 9597 9600 9603 9606 9609 9612 9615 9618 9621 9624 9627 9630 9633 9636 9639 9642 9645 9648 9651 9654 9657 9660 9663 9666 9669 9672 9675 9678 9681 9684 9687 9690 9693 9696 9699 9702 9705 9708 9711 9714 9717 9720 9723 9726 9729 9732 9735 9738 9741 9744 9747 9750 9753 9756 9759 9762 9765 9768 9771 9774 9777 9780 9783 9786 9789 9792 9795 9798 9801 9804 9807 9810 9813 9816 9819 9822 9825 9828 9831 9834 9837 9840 9843 9846 9849 9852 9855 9858 9861 9864 9867 9870 9873 9876 9879 9882 9885 9888 9891 9894 9897 9900 9903 9906 9909 9912 9915 9918 9921 9924 9927 9930 9933 9936 9939 9942 9945 9948 9951 9954 9957 9960 9963 9966 9969 9972 9975 9978 9981 9984 9987 9990 9993 9996 9999 10002 10005 10008 10011 10014 10017 10020 10023 10026 10029 10032 10035 10038 10041 10044 10047 10050 10053 10056 10059 10062 10065 10068 10071 10074 10077 10080 10083 10086 10089 10092 10095 10098 10101 10104 10107 10110 10113 10116 10119 10122 10125 10128 10131 10134 10137 10140 10143 10146 10149 10152 10155 10158 10161 10164 10167 10170 10173 10176 10179 10182 10185 10188 10191 10194 10197 10200 10203 10206 10209 10212 10215 10218 10221 10224 10227 10230 10233 10236 10239 10242 10245 10248 10251 10254 10257 10260 10263 10266 10269 10272 10275 10278 10281 10284 10287 10290 10293 10296 10299 10302 10305 10308 10311 10314 10317 10320 10323 10326 10329 10332 10335 10338 10341 10344 10347 10350 10353 10356 10359 10362 10365 10368 10371 10374 10377 10380 10383 10386 10389 10392 10395 10398 10401 10404 10407 10410 10413 10416 10419 10422 10425 10428 10431 10434 10437 10440 10443 10446 10449 10452 10455 10458 10461 10464 10467 10470 10473 10476 10479 10482 10485 10488 10491 10494 10497 10500 10503 10506 10509 10512 10515 10518 10521 10524 10527 10530 10533 10536 10539 10542 10545 10548 10551 10554 10557 10560 10563 10566 10569 10572 10575 10578 10581 10584 10587 10590 10593 10596 10599 10602 10605 10608 10611 10614 10617 10620 10623 10626 10629 10632 10635 10638 10641 10644 10647 10650 10653 10656 10659 10662 10665 10668 10671 10674 10677 10680 10683 10686 10689 10692 10695 10698 10701 10704 10707 10710 10713 10716 10719 10722 10725 10728 10731 10734 10737 10740 10743 10746 10749 10752 10755 10758 10761 10764 10767 10770 10773 10776 10779 10782 10785 10788 10791 10794 10797 10800 10803 10806 10809 10812 10815 10818 10821 10824 10827 10830 10833 10836 10839 10842 10845 10848 10851 10854 10857 10860 10863 10866 10869 10872 10875 10878 10881 10884 10887 10890 10893 10896 10899 10902 10905 10908 10911 10914 10917 10920 10923 10926 10929 10932 10935 10938 10941 10944 10947 10950 10953 10956 10959 10962 10965 10968 10971 10974 10977 10980 10983 10986 10989 10992 10995 10998 11001 11004 11007 11010 11013 11016 11019 11022 11025 11028 11031 11034 11037 11040 11043 11046 11049 11052 11055 11058 11061 11064 11067 11070 11073 11076 11079 11082 11085 11088 11091 11094 11097 11100 11103 11106 11109 11112 11115 11118 11121 11124 11127 11130 11133 11136 11139 11142 11145 11148 11151 11154 11157 11160 11163 11166 11169 11172 11175 11178 11181 11184 11187 11190 11193 11196 11199 11202 11205 11208 11211 11214 11217 11220 11223 11226 11229 11232 11235 11238 11241 11244 11247 11250 11253 11256 11259 11262 11265 11268 11271 11274 11277 11280 11283 11286 11289 11292 11295 11298 11301 11304 11307 11310 11313 11316 11319 11322 11325 11328 11331 11334 11337 11340 11343 11346 11349 11352 11355 11358 11361 11364 11367 11370 11373 11376 11379 11382 11385 11388 11391 11394 11397 11400 11403 11406 11409 11412 11415 11418 11421 11424 11427 11430 11433 11436 11439 11442 11445 11448 11451 11454 11457 11460 11463 11466 11469 11472 11475 11478 11481 11484 11487 11490 11493 11496 11499 11502 11505 11508 11511 11514 11517 11520 11523 11526 11529 11532 11535 11538 11541 11544 11547 11550 11553 11556 11559 11562 11565 11568 11571 11574 11577 11580 11583 11586 11589 11592 11595 11598 11601 11604 11607 11610 11613 11616 11619 11622 11625 11628 11631 11634 11637 11640 11643 11646 11649 11652 11655 11658 11661 11664 11667 11670 11673 11676 11679 11682 11685 11688 11691 11694 11697 11700 11703 11706 11709 11712 11715 11718 11721 11724 11727 11730 11733 11736 11739 11742 11745 11748 11751 11754 11757 11760 11763 11766 11769 11772 11775 11778 11781 11784 11787 11790 11793 11796 11799 11802 11805 11808 11811 11814 11817 11820 11823 11826 11829 11832 11835 11838 11841 11844 11847 11850 11853 11856 11859 11862 11865 11868 11871 11874 11877 11880 11883 11886 11889 11892 11895 11898 11901 11904 11907 11910 11913 11916 11919 11922 11925 11928 11931 11934 11937 11940 11943 11946 11949 11952 11955 11958 11961 11964 11967 11970 11973 11976 11979 11982 11985 11988 11991 11994 11997 12000 12003 12006 12009 12012 12015 12018 12021 12024 12027 12030 12033 12036 12039 12042 12045 12048 12051 12054 12057 12060 12063 12066 12069 12072 12075 12078 12081 12084 12087 12090 12093 12096 12099 12102 12105 12108 12111 12114 12117 12120 12123 12126 12129 12132 12135 12138 12141 12144 12147 12150 12153 12156 12159 12162 12165 12168 12171 12174 12177 12180 12183 12186 12189 12192 12195 12198 12201 12204 12207 12210 12213 12216 12219 12222 12225 12228 12231 12234 12237 12240 12243 12246 12249 12252 12255 12258 12261 12264 12267 12270 12273 12276 12279 12282 12285 12288 12291 12294 12297 12300 12303 12306 12309 12312 12315 12318 12321 12324 12327 12330 12333 12336 12339 12342 12345 12348 12351 12354 12357 12360 12363 12366 12369 12372 12375 12378 12381 12384 12387 12390 12393 12396 12399 12402 12405 12408 12411 12414 12417 12420 12423 12426 12429 12432 12435 12438 12441 12444 12447 12450 12453 12456 12459 12462 12465 12468 12471 12474 12477 12480 12483 12486 12489 12492 12495 12498 12501 12504 12507 12510 12513 12516 12519 12522 12525 12528 12531 12534 12537 12540 12543 12546 12549 12552 12555 12558 12561 12564 12567 12570 12573 12576 12579 12582 12585 12588 12591 12594 12597 12600 12603 12606 12609 12612 12615 12618 12621 12624 12627 12630 12633 12636 12639 12642 12645 12648 12651 12654 12657 12660 12663 12666 12669 12672 12675 12678 12681 12684 12687 12690 12693 12696 12699 12702 12705 12708 12711 12714 12717 12720 12723 12726 12729 12732 12735 12738 12741 12744 12747 12750 12753 12756 12759 12762 12765 12768 12771 12774 12777 12780 12783 12786 12789 12792 12795 12798 12801 12804 12807 12810 12813 12816 12819 12822 12825 12828 12831 12834 12837 12840 12843 12846 12849 12852 12855 12858 12861 12864 12867 12870 12873 12876 12879 12882 12885 12888 12891 12894 12897 12900 12903 12906 12909 12912 12915 12918 12921 12924 12927 12930 12933 12936 12939 12942 12945 12948 12951 12954 12957 12960 12963 12966 12969 12972 12975 12978 12981 12984 12987 12990 12993 12996 12999 13002 13005 13008 13011 13014 13017 13020 13023 13026 13029 13032 13035 13038 13041 13044 13047 13050 13053 13056 13059 13062 13065 13068 13071 13074 13077 13080 13083 13086 13089 13092 13095 13098 13101 13104 13107 13110 13113 13116 13119 13122 13125 13128 13131 13134 13137 13140 13143 13146 13149 13152 13155 13158 13161 13164 13167 13170 13173 13176 13179 13182 13185 13188 13191 13194 13197 13200 13203 13206 13209 13212 13215 13218 13221 13224 13227 13230 13233 13236 13239 13242 13245 13248 13251 13254 13257 13260 13263 13266 13269 13272 13275 13278 13281 13284 13287 13290 13293 13296 13299 13302 13305 13308 13311 13314 13317 13320 13323 13326 13329 13332 13335 13338 13341 13344 13347 13350 13353 13356 13359 13362 13365 13368 13371 13374 13377 13380 13383 13386 13389 13392 13395 13398 13401 13404 13407 13410 13413 13416 13419 13422 13425 13428 13431 13434 13437 13440 13443 13446 13449 13452 13455 13458 13461 13464 13467 13470 13473 13476 13479 13482 13485 13488 13491 13494 13497 13500 13503 13506 13509 13512 13515 13518 13521 13524 13527 13530 13533 13536 13539 13542 13545 13548 13551 13554 13557 13560 13563 13566 13569 13572 13575 13578 13581 13584 13587 13590 13593 13596 13599 13602 13605 13608 13611 13614 13617 13620 13623 13626 13629 13632 13635 13638 13641 13644 13647 13650 13653 13656 13659 13662 13665 13668 13671 13674 13677 13680 13683 13686 13689 13692 13695 13698 13701 13704 13707 13710 13713 13716 13719 13722 13725 13728 13731 13734 13737 13740 13743 13746 13749 13752 13755 13758 13761 13764 13767 13770 13773 13776 13779 13782 13785 13788 13791 13794 13797 13800 13803 13806 13809 13812 13815 13818 13821 13824 13827 13830 13833 13836 13839 13842 13845 13848 13851 13854 13857 13860 13863 13866 13869 13872 13875 13878 13881 13884 13887 13890 13893 13896 13899 13902 13905 13908 13911 13914 13917 13920 13923 13926 13929 13932 13935 13938 13941 13944 13947 13950 13953 13956 13959 13962 13965 13968 13971 13974 13977 13980 13983 13986 13989 13992 13995 13998 14001 14004 14007 14010 14013 14016 14019 14022 14025 14028 14031 14034 14037 14040 14043 14046 14049 14052 14055 14058 14061 14064 14067 14070 14073 14076 14079 14082 14085 14088 14091 14094 14097 14100 14103 14106 14109 14112 14115 14118 14121 14124 14127 14130 14133 14136 14139 14142 14145 14148 14151 14154 14157 14160 14163 14166 14169 14172 14175 14178 14181 14184 14187 14190 14193 14196 14199 14202 14205 14208 14211 14214 14217 14220 14223 14226 14229 14232 14235 14238 14241 14244 14247 14250 14253 14256 14259 14262 14265 14268 14271 14274 14277 14280 14283 14286 14289 14292 14295 14298 14301 14304 14307 14310 14313 14316 14319 14322 14325 14328 14331 14334 14337 14340 14343 14346 14349 14352 14355 14358 14361 14364 14367 14370 14373 14376 14379 14382 14385 14388 14391 14394 14397 14400 14403 14406 14409 14412 14415 14418 14421 14424 14427 14430 14433 14436 14439 14442 14445 14448 14451 14454 14457 14460 14463 14466 14469 14472 14475 14478 14481 14484 14487 14490 14493 14496 14499 14502 14505 14508 14511 14514 14517 14520 14523 14526 14529 14532 14535 14538 14541 14544 14547 14550 14553 14556 14559 14562 14565 14568 14571 14574 14577 14580 14583 14586 14589 14592 14595 14598 14601 14604 14607 14610 14613 14616 14619 14622 14625 14628 14631 14634 14637 14640 14643 14646 14649 14652 14655 14658 14661 14664 14667 14670 14673 14676 14679 14682 14685 14688 14691 14694 14697 14700 14703 14706 14709 14712 14715 14718 14721 14724 14727 14730 14733 14736 14739 14742 14745 14748 14751 14754 14757 14760 14763 14766 14769 14772 14775 14778 14781 14784 14787 14790 14793 14796 14799 14802 14805 14808 14811 14814 14817 14820 14823 14826 14829 14832 14835 14838 14841 14844 14847 14850 14853 14856 14859 14862 14865 14868 14871 14874 14877 14880 14883 14886 14889 14892 14895 14898 14901 14904 14907 14910 14913 14916 14919 14922 14925 14928 14931 14934 14937 14940 14943 14946 14949 14952 14955 14958 14961 14964 14967 14970 14973 14976 14979 14982 14985 14988 14991 14994 14997 15000 15003 15006 15009 15012 15015 15018 15021 15024 15027 15030 15033 15036 15039 15042 15045 15048 15051 15054 15057 15060 15063 15066 15069 15072 15075 15078 15081 15084 15087 15090 15093 15096 15099 15102 15105 15108 15111 15114 15117 15120 15123 15126 15129 15132 15135 15138 15141 15144 15147 15150 15153 15156 15159 15162 15165 15168 15171 15174 15177 15180 15183 15186 15189 15192 15195 15198 15201 15204 15207 15210 15213 15216 15219 15222 15225 15228 15231 15234 15237 15240 15243 15246 15249 15252 15255 15258 15261 15264 15267 15270 15273 15276 15279 15282 15285 15288 15291 15294 15297 15300 15303 15306 15309 15312 15315 15318 15321 15324 15327 15330 15333 15336 15339 15342 15345 15348 15351 15354 15357 15360 15363 15366 15369 15372 15375 15378 15381 15384 15387 15390 15393 15396 15399 15402 15405 15408 15411 15414 15417 15420 15423 15426 15429 15432 15435 15438 15441 15444 15447 15450 15453 15456 15459 15462 15465 15468 15471 15474 15477 15480 15483 15486 15489 15492 15495 15498 15501 15504 15507 15510 15513 15516 15519 15522 15525 15528 15531 15534 15537 15540 15543 15546 15549 15552 15555 15558 15561 15564 15567 15570 15573 15576 15579 15582 15585 15588 15591 15594 15597 15600 15603 15606 15609 15612 15615 15618 15621 15624 15627 15630 15633 15636 15639 15642 15645 15648 15651 15654 15657 15660 15663 15666 15669 15672 15675 15678 15681 15684 15687 15690 15693 15696 15699 15702 15705 15708 15711 15714 15717 15720 15723 15726 15729 15732 15735 15738 15741 15744 15747 15750 15753 15756 15759 15762 15765 15768 15771 15774 15777 15780 15783 15786 15789 15792 15795 15798 15801 15804 15807 15810 15813 15816 15819 15822 15825 15828 15831 15834 15837 15840 15843 15846 15849 15852 15855 15858 15861 15864 15867 15870 15873 15876 15879 15882 15885 15888 15891 15894 15897 15900 15903 15906 15909 15912 15915 15918 15921 15924 15927 15930 15933 15936 15939 15942 15945 15948 15951 15954 15957 15960 15963 15966 15969 15972 15975 15978 15981 15984 15987 15990 15993 15996 15999 16002 16005 16008 16011 16014 16017 16020 16023 16026 16029 16032 16035 16038 16041 16044 16047 16050 16053 16056 16059 16062 16065 16068 16071 16074 16077 16080 16083 16086 16089 16092 16095 16098 16101 16104 16107 16110 16113 16116 16119 16122 16125 16128 16131 16134 16137 16140 16143 16146 16149 16152 16155 16158 16161 16164 16167 16170 16173 16176 16179 16182 16185 16188 16191 16194 16197 16200 16203 16206 16209 16212 16215 16218 16221 16224 16227 16230 16233 16236 16239 16242 16245 16248 16251 16254 16257 16260 16263 16266 16269 16272 16275 16278 16281 16284 16287 16290 16293 16296 16299 16302 16305 16308 16311 16314 16317 16320 16323 16326 + + + + + diff --git a/bioptim/examples/stochastic_optimal_control/models/mesh/pendulum.vtp b/bioptim/examples/stochastic_optimal_control/models/mesh/pendulum.vtp new file mode 100644 index 000000000..36b98aa9b --- /dev/null +++ b/bioptim/examples/stochastic_optimal_control/models/mesh/pendulum.vtp @@ -0,0 +1,1973 @@ + + + + + + + + + + + 0.014999999664723873 0.014999999664723873 -0.8999999761581421 -0.014999999664723873 0.014999999664723873 -0.8999999761581421 + 0.014999999664723873 0.014999999664723873 -2.220446049250313e-16 -0.014999999664723873 0.014999999664723873 -2.220446049250313e-16 + 0.014999999664723873 -0.014999999664723873 -0.8999999761581421 0.014999999664723873 -0.014999999664723873 -2.220446049250313e-16 + -0.014999999664723873 -0.014999999664723873 -0.8999999761581421 -0.014999999664723873 -0.014999999664723873 -2.220446049250313e-16 + -0.014999999664723873 -0.014999999664723873 0 0.014999999664723873 -0.014999999664723873 0 + -0.014999999664723873 0.014999999664723873 0 0.014999999664723873 0.014999999664723873 0 + 0.07500000298023224 -0.01039996836334467 -0.9594099521636963 0.07500000298023224 -0.009511898271739483 -0.9599928855895996 + 0.07500000298023224 -0.007461805362254381 -0.9601408243179321 0.07500000298023224 0.1373596489429474 -0.9594099521636963 + 0.07500000298023224 0.13824771344661713 -0.9599928855895996 0.07500000298023224 0.1402978152036667 -0.9601408243179321 + 0.07500000298023224 -0.06499999761581421 -1.100000023841858 0.07500000298023224 -0.02350641041994095 -1.100000023841858 + 0.07500000298023224 -0.02350641041994095 -1.0194686651229858 0.07500000298023224 0.11716372519731522 -0.9593946933746338 + 0.07500000298023224 0.11716372519731522 -0.9601408243179321 0.07500000298023224 0.1257457286119461 -0.9601408243179321 + 0.07500000298023224 -0.04706026241183281 -1.019095540046692 0.07500000298023224 -0.06343135982751846 -1.019095540046692 + 0.07500000298023224 -0.07500000298023224 -1.0194686651229858 0.07500000298023224 -0.07500000298023224 -0.9761855602264404 + 0.07500000298023224 -0.03870970383286476 -1.0181405544281006 0.07500000298023224 -0.04234897717833519 -1.0188359022140503 + 0.07500000298023224 -0.030186116695404053 -0.9921354055404663 0.07500000298023224 -0.03290598466992378 -0.9835965633392334 + 0.07500000298023224 -0.0318390354514122 -0.9904229640960693 0.07500000298023224 -0.03450962156057358 -0.985462486743927 + 0.07500000298023224 -0.03399766609072685 -0.9887790083885193 0.07500000298023224 -0.03663593530654907 -0.9872861504554749 + 0.07500000298023224 -0.028822921216487885 -0.9941446185112 0.07500000298023224 -0.02350641041994095 -0.9761855602264404 + 0.07500000298023224 -0.02784656547009945 -0.9962823390960693 0.07500000298023224 -0.030595887452363968 -0.976068913936615 + 0.07500000298023224 -0.03076987713575363 -0.978350818157196 0.07500000298023224 -0.031230833381414413 -0.9802628755569458 + 0.07500000298023224 -0.03195717930793762 -0.982035219669342 0.07500000298023224 -0.027131732553243637 -1.0053248405456543 + 0.07500000298023224 -0.027746953070163727 -1.0076913833618164 0.07500000298023224 -0.027188872918486595 -0.9986551403999329 + 0.07500000298023224 -0.0268715713173151 -1.0017646551132202 0.07500000298023224 -0.026864582672715187 -1.002246379852295 + 0.07500000298023224 -0.028730973601341248 -1.0099544525146484 0.07500000298023224 -0.03022422082722187 -1.012319803237915 + 0.07500000298023224 -0.032116346061229706 -1.014439344406128 0.07500000298023224 -0.033995870500802994 -1.0159586668014526 + 0.07500000298023224 -0.03625013679265976 -1.017247200012207 0.07500000298023224 -0.048134174197912216 -0.961067259311676 + 0.07500000298023224 -0.04326896741986275 -0.961672842502594 0.07500000298023224 -0.02350641041994095 -0.9601408243179321 + 0.07500000298023224 -0.033885546028614044 -0.9669565558433533 0.07500000298023224 -0.03546816110610962 -0.96536785364151 + 0.07500000298023224 -0.03737149387598038 -0.963961124420166 0.07500000298023224 -0.0324726402759552 -0.9689295887947083 + 0.07500000298023224 -0.03157554939389229 -0.9707229137420654 0.07500000298023224 -0.02350641041994095 -0.9743198752403259 + 0.07500000298023224 -0.030949758365750313 -0.9727745652198792 0.07500000298023224 -0.030633622780442238 -0.974927544593811 + 0.07500000298023224 -0.04223288968205452 -0.9619249701499939 0.07500000298023224 -0.039630092680454254 -0.9628069400787354 + 0.07500000298023224 -0.06343135982751846 -0.9743198752403259 0.07500000298023224 -0.06343135982751846 -0.9608871936798096 + 0.07500000298023224 -0.07500000298023224 -0.9601408243179321 0.07500000298023224 -0.054103098809719086 -0.9608871936798096 + 0.07500000298023224 -0.07500000298023224 -0.9743198752403259 0.07500000298023224 -0.06343135982751846 -0.9761855602264404 + 0.07500000298023224 0.052985310554504395 -1.0194686651229858 0.07500000298023224 0.052985310554504395 -0.9765586853027344 + 0.07500000298023224 0.04850774630904198 -0.9761855602264404 0.07500000298023224 0.0634329617023468 -0.9765586853027344 + 0.07500000298023224 0.06865974515676498 -0.9776683449745178 0.07500000298023224 0.06604959815740585 -0.9791972637176514 + 0.07500000298023224 0.0634329617023468 -0.9813510775566101 0.07500000298023224 0.07925854623317719 -1.0196820497512817 + 0.07500000298023224 0.07663244754076004 -1.0198417901992798 0.07500000298023224 0.09925347566604614 -1.100000023841858 + 0.07500000298023224 0.0736122652888298 -1.0196105241775513 0.07500000298023224 0.0634329617023468 -1.0347670316696167 + 0.07500000298023224 0.052985310554504395 -1.0347670316696167 0.07500000298023224 0.04850774630904198 -1.100000023841858 + 0.07500000298023224 0.0634329617023468 -1.0194686651229858 0.07500000298023224 0.07098688930273056 -1.0190008878707886 + 0.07500000298023224 0.06859349459409714 -1.0180126428604126 0.07500000298023224 0.06585437804460526 -1.0163238048553467 + 0.07500000298023224 0.0634329617023468 -1.014291524887085 0.07500000298023224 0.08619612455368042 -0.9781150221824646 + 0.07500000298023224 0.0887070819735527 -0.9797661900520325 0.07500000298023224 0.09925347566604614 -0.9761855602264404 + 0.07500000298023224 0.09101212024688721 -0.9818593859672546 0.07500000298023224 0.0959499180316925 -1.0052114725112915 + 0.07500000298023224 0.09455258399248123 -1.0085887908935547 0.07500000298023224 0.09925347566604614 -1.0194686651229858 + 0.07500000298023224 0.0926508978009224 -1.0115944147109985 0.07500000298023224 0.09026649594306946 -1.0142476558685303 + 0.07500000298023224 0.08739786595106125 -1.0165891647338867 0.07500000298023224 0.08470483124256134 -1.0181121826171875 + 0.07500000298023224 0.08209125697612762 -1.0190876722335815 0.07500000298023224 0.09331677109003067 -0.9846907258033752 + 0.07500000298023224 0.0949987918138504 -0.987728476524353 0.07500000298023224 0.09616263955831528 -0.991030216217041 + 0.07500000298023224 0.09681280702352524 -0.994392454624176 0.07500000298023224 0.09701468795537949 -0.9979087114334106 + 0.07500000298023224 0.09673352539539337 -1.0018399953842163 0.07500000298023224 0.07467537373304367 -0.9759325981140137 + 0.07500000298023224 0.07694727182388306 -0.9758124351501465 0.07500000298023224 0.04850774630904198 -0.9743198752403259 + 0.07500000298023224 0.09925347566604614 -0.9743198752403259 0.07500000298023224 0.0804985985159874 -0.9761070609092712 + 0.07500000298023224 0.08333615958690643 -0.9768400192260742 0.07500000298023224 0.1257457286119461 -0.9761855602264404 + 0.07500000298023224 0.11716372519731522 -0.9761855602264404 0.07500000298023224 0.12388007342815399 -0.9765586853027344 + 0.07500000298023224 0.11716372519731522 -0.9765586853027344 0.07500000298023224 0.1067160815000534 -1.019095540046692 + 0.07500000298023224 0.11716372519731522 -1.019095540046692 0.07500000298023224 0.1257457286119461 -1.0194686651229858 + 0.07500000298023224 0.11716372519731522 -0.9855138063430786 0.07500000298023224 0.12388007342815399 -0.9855138063430786 + 0.07500000298023224 0.1014922559261322 -0.9765586853027344 0.07500000298023224 0.1014922559261322 -0.9855138063430786 + 0.07500000298023224 0.1067160815000534 -0.9855138063430786 0.07500000298023224 -0.07500000298023224 -1.090000033378601 + 0.07500000298023224 -0.06673648208379745 -1.0998480319976807 0.07500000298023224 -0.07439692318439484 -1.093420147895813 + 0.07500000298023224 -0.07366025447845459 -1.0950000286102295 0.07500000298023224 -0.06842020153999329 -1.0993969440460205 + 0.07500000298023224 -0.07484807819128036 -1.0917364358901978 0.07500000298023224 -0.07266044616699219 -1.0964279174804688 + 0.07500000298023224 -0.07142787426710129 -1.0976604223251343 0.07500000298023224 -0.07000000029802322 -1.0986602306365967 + 0.07500000298023224 -0.02350641041994095 -0.9590215682983398 0.07500000298023224 -0.02350641041994095 -0.8999999761581421 + 0.07500000298023224 -0.07500000298023224 -0.9100000262260437 0.07500000298023224 -0.06499999761581421 -0.8999999761581421 + 0.07500000298023224 -0.06673648208379745 -0.9001519083976746 0.07500000298023224 -0.06842020153999329 -0.9006030559539795 + 0.07500000298023224 -0.07000000029802322 -0.9013397693634033 0.07500000298023224 -0.07142787426710129 -0.9023395776748657 + 0.07500000298023224 -0.07266044616699219 -0.903572142124176 0.07500000298023224 -0.07366025447845459 -0.9049999713897705 + 0.07500000298023224 -0.07484807819128036 -0.9082635045051575 0.07500000298023224 -0.07439692318439484 -0.9065797924995422 + 0.07500000298023224 0.22499999403953552 -0.9590215682983398 0.07500000298023224 0.22499999403953552 -0.9100000262260437 + 0.07500000298023224 0.2199999988079071 -0.9013397693634033 0.07500000298023224 0.22484807670116425 -0.9082635045051575 + 0.07500000298023224 0.22439692914485931 -0.9065797924995422 0.07500000298023224 0.22366026043891907 -0.9049999713897705 + 0.07500000298023224 0.22266043722629547 -0.903572142124176 0.07500000298023224 0.22142787277698517 -0.9023395776748657 + 0.07500000298023224 0.2199999988079071 -1.0986602306365967 0.07500000298023224 0.22439692914485931 -1.093420147895813 + 0.07500000298023224 0.22484807670116425 -1.0917364358901978 0.07500000298023224 0.22142787277698517 -1.0976604223251343 + 0.07500000298023224 0.22266043722629547 -1.0964279174804688 0.07500000298023224 0.22366026043891907 -1.0950000286102295 + 0.07500000298023224 0.22499999403953552 -1.090000033378601 0.07500000298023224 0.21996194124221802 -1.0194686651229858 + 0.07500000298023224 0.21842020750045776 -1.0993969440460205 0.07500000298023224 0.21673648059368134 -1.0998480319976807 + 0.07500000298023224 0.11716372519731522 -0.9743198752403259 0.07500000298023224 0.1257457286119461 -0.9743198752403259 + 0.07500000298023224 0.12761138379573822 -0.965621292591095 0.07500000298023224 0.12774047255516052 -0.967072069644928 + 0.07500000298023224 0.1283576339483261 -0.9743198752403259 0.07500000298023224 0.12845222651958466 -0.969139814376831 + 0.07500000298023224 0.12799488008022308 -0.9680725932121277 0.07500000298023224 0.13235771656036377 -0.9725229740142822 + 0.07500000298023224 0.13136447966098785 -0.9720999598503113 0.07500000298023224 0.13045263290405273 -0.9715167284011841 + 0.07500000298023224 0.13966256380081177 -0.9700708985328674 0.07500000298023224 0.13883516192436218 -0.9710021018981934 + 0.07500000298023224 0.1402978152036667 -0.9743198752403259 0.07500000298023224 0.12968666851520538 -0.9708265066146851 + 0.07500000298023224 0.12904216349124908 -0.97007155418396 0.07500000298023224 0.1378469467163086 -0.971801221370697 + 0.07500000298023224 0.13701365888118744 -0.9722750782966614 0.07500000298023224 0.13620339334011078 -0.9725804924964905 + 0.07500000298023224 0.13530565798282623 -0.9727584719657898 0.07500000298023224 0.13438603281974792 -0.9728273749351501 + 0.07500000298023224 0.13317404687404633 -0.9727237224578857 0.07500000298023224 0.14514850080013275 -0.9743198752403259 + 0.07500000298023224 0.14067213237285614 -0.9681544303894043 0.07500000298023224 0.14025525748729706 -0.9691329598426819 + 0.07500000298023224 0.1400979608297348 -0.9621101021766663 0.07500000298023224 0.14514850080013275 -0.9601408243179321 + 0.07500000298023224 0.14054858684539795 -0.9630182981491089 0.07500000298023224 0.14083871245384216 -0.9639540314674377 + 0.07500000298023224 0.1410098820924759 -0.9652026295661926 0.07500000298023224 0.14104406535625458 -0.9657728672027588 + 0.07500000298023224 0.14093248546123505 -0.9670795798301697 0.07500000298023224 0.13905371725559235 -0.9607270359992981 + 0.07500000298023224 0.1393578201532364 -0.961067795753479 0.07500000298023224 0.1402978152036667 -0.8999999761581421 + 0.07500000298023224 0.13430440425872803 -0.9586484432220459 0.07500000298023224 0.13551214337348938 -0.9587531089782715 + 0.07500000298023224 0.13319511711597443 -0.9587403535842896 0.07500000298023224 0.1283576339483261 -0.8999999761581421 + 0.07500000298023224 0.13233943283557892 -0.9589366912841797 0.07500000298023224 0.13051149249076843 -0.9598599672317505 + 0.07500000298023224 0.13136500120162964 -0.9593374729156494 0.07500000298023224 0.1283576339483261 -0.9590215682983398 + 0.07500000298023224 0.12889714539051056 -0.9615017771720886 0.07500000298023224 0.12970666587352753 -0.960549533367157 + 0.07500000298023224 0.1283576339483261 -0.9601408243179321 0.07500000298023224 0.12772603332996368 -0.9643186330795288 + 0.07500000298023224 0.1279521882534027 -0.9633541703224182 0.07500000298023224 0.12835372984409332 -0.9623872637748718 + 0.07500000298023224 0.2044762223958969 -1.019095540046692 0.07500000298023224 0.14514850080013275 -1.0194686651229858 + 0.07500000298023224 0.187312051653862 -0.9998319149017334 0.07500000298023224 0.18731223046779633 -1.00010085105896 + 0.07500000298023224 0.2044762223958969 -0.9977338314056396 0.07500000298023224 0.205280601978302 -0.9765248894691467 + 0.07500000298023224 0.20727497339248657 -0.9773083925247192 0.07500000298023224 0.21996194124221802 -0.9761855602264404 + 0.07500000298023224 0.21392078697681427 -0.9848097562789917 0.07500000298023224 0.21455524861812592 -0.9879276752471924 + 0.07500000298023224 0.20920543372631073 -0.9784379601478577 0.07500000298023224 0.21074841916561127 -0.979682207107544 + 0.07500000298023224 0.21214178204536438 -0.9812469482421875 0.07500000298023224 0.2122722715139389 -0.9814254641532898 + 0.07500000298023224 0.2132447510957718 -0.9830569624900818 0.07500000298023224 0.2043185830116272 -0.9939865469932556 + 0.07500000298023224 0.18886959552764893 -0.9903623461723328 0.07500000298023224 0.18882402777671814 -0.9904488921165466 + 0.07500000298023224 0.18731223046779633 -1.019095540046692 0.07500000298023224 0.17686457931995392 -1.019095540046692 + 0.07500000298023224 0.15970058739185333 -1.019095540046692 0.07500000298023224 0.21492120623588562 -0.9939595460891724 + 0.07500000298023224 0.21492387354373932 -0.9943523406982422 0.07500000298023224 0.21492387354373932 -1.019095540046692 + 0.07500000298023224 0.18818031251430511 -0.9920133352279663 0.07500000298023224 0.18770472705364227 -0.9940816760063171 + 0.07500000298023224 0.15970058739185333 -1.0003690719604492 0.07500000298023224 0.17686457931995392 -0.9987016320228577 + 0.07500000298023224 0.15998739004135132 -0.9950563907623291 0.07500000298023224 0.17673788964748383 -0.994933545589447 + 0.07500000298023224 0.17643998563289642 -0.9923321604728699 0.07500000298023224 0.17141956090927124 -0.9858068823814392 + 0.07500000298023224 0.17036880552768707 -0.9855967164039612 0.07500000298023224 0.16916877031326294 -0.9855138063430786 + 0.07500000298023224 0.14925293624401093 -1.019095540046692 0.07500000298023224 0.14925293624401093 -0.9765586853027344 + 0.07500000298023224 0.14514850080013275 -0.9761855602264404 0.07500000298023224 0.15970058739185333 -0.9765586853027344 + 0.07500000298023224 0.16435062885284424 -0.9779912829399109 0.07500000298023224 0.162018820643425 -0.9795268774032593 + 0.07500000298023224 0.15970058739185333 -0.9816426038742065 0.07500000298023224 0.2039327472448349 -0.9913639426231384 + 0.07500000298023224 0.2010383903980255 -0.9865895509719849 0.07500000298023224 0.20040078461170197 -0.9862175583839417 + 0.07500000298023224 0.19951152801513672 -0.9858794808387756 0.07500000298023224 0.19818858802318573 -0.9855872392654419 + 0.07500000298023224 0.19694365561008453 -0.9855138063430786 0.07500000298023224 0.1953527331352234 -0.9856348633766174 + 0.07500000298023224 0.19404861330986023 -0.9859556555747986 0.07500000298023224 0.19279229640960693 -0.9864806532859802 + 0.07500000298023224 0.19165471196174622 -0.9871660470962524 0.07500000298023224 0.1904878169298172 -0.9881461262702942 + 0.07500000298023224 0.18961428105831146 -0.9891654849052429 0.07500000298023224 0.17471501231193542 -0.9880504012107849 + 0.07500000298023224 0.17403900623321533 -0.9872962236404419 0.07500000298023224 0.20342206954956055 -0.9896246790885925 + 0.07500000298023224 0.20299197733402252 -0.9886852502822876 0.07500000298023224 0.20181600749492645 -0.987197756767273 + 0.07500000298023224 0.2024785280227661 -0.9879127144813538 0.07500000298023224 0.17598575353622437 -0.9905153512954712 + 0.07500000298023224 0.17531104385852814 -0.9889717102050781 0.07500000298023224 0.1732860505580902 -0.986685574054718 + 0.07500000298023224 0.17242588102817535 -0.9861927628517151 0.07500000298023224 0.1676650047302246 -0.9856323003768921 + 0.07500000298023224 0.16636233031749725 -0.9859707355499268 0.07500000298023224 0.160433828830719 -0.9926329851150513 + 0.07500000298023224 0.16510356962680817 -0.9865109920501709 0.07500000298023224 0.16391517221927643 -0.9872714877128601 + 0.07500000298023224 0.16282688081264496 -0.9882413744926453 0.07500000298023224 0.16188976168632507 -0.9894080758094788 + 0.07500000298023224 0.16101662814617157 -0.9909725785255432 0.07500000298023224 0.20297765731811523 -0.9759997129440308 + 0.07500000298023224 0.21996194124221802 -0.9743198752403259 0.07500000298023224 0.20029017329216003 -0.9758124351501465 + 0.07500000298023224 0.1693974882364273 -0.9761747717857361 0.07500000298023224 0.17242136597633362 -0.9758388996124268 + 0.07500000298023224 0.17326153814792633 -0.9758124351501465 0.07500000298023224 0.1777680516242981 -0.9764837622642517 + 0.07500000298023224 0.17983943223953247 -0.9773507714271545 0.07500000298023224 0.19707003235816956 -0.9760759472846985 + 0.07500000298023224 0.1818569153547287 -0.978629469871521 0.07500000298023224 0.19431035220623016 -0.9767953157424927 + 0.07500000298023224 0.19185638427734375 -0.977878749370575 0.07500000298023224 0.1857847273349762 -0.9833916425704956 + 0.07500000298023224 0.18769587576389313 -0.9810447096824646 0.07500000298023224 0.184733048081398 -0.9816730618476868 + 0.07500000298023224 0.18338342010974884 -0.9800153970718384 0.07500000298023224 0.18969440460205078 -0.9792667031288147 + 0.07500000298023224 0.011622263118624687 -1.0173884630203247 0.07500000298023224 -0.0033573717810213566 -1.0194686651229858 + 0.07500000298023224 0.014758086763322353 -1.018739104270935 0.07500000298023224 0.017914719879627228 -1.0195273160934448 + 0.07500000298023224 0.002276132581755519 -0.9878852963447571 0.07500000298023224 0.004034847486764193 -0.9850214719772339 + 0.07500000298023224 -0.0033573717810213566 -0.9761855602264404 0.07500000298023224 0.00881226547062397 -1.0155718326568604 + 0.07500000298023224 0.0063338796608150005 -1.013394832611084 0.07500000298023224 0.0038314261473715305 -1.01040780544281 + 0.07500000298023224 0.010197761468589306 -0.9792144894599915 0.07500000298023224 0.013179200701415539 -0.9775858521461487 + 0.07500000298023224 0.016140291467308998 -0.9765430092811584 0.07500000298023224 8.012820558178646e-7 -0.9978621006011963 + 0.07500000298023224 0.00029209189233370125 -0.9940674304962158 0.07500000298023224 0.0010579412337392569 -0.9908367991447449 + 0.07500000298023224 0.002135421149432659 -1.007535696029663 0.07500000298023224 0.0008666550274938345 -1.004235863685608 + 0.07500000298023224 0.00018641891074366868 -1.0009055137634277 0.07500000298023224 0.006282172165811062 -0.9824248552322388 + 0.07500000298023224 0.007218541111797094 -0.9815143346786499 0.07500000298023224 0.02180560491979122 -1.0198417901992798 + 0.07500000298023224 -0.0033573717810213566 -1.100000023841858 0.07500000298023224 0.024940114468336105 -1.0196378231048584 + 0.07500000298023224 0.04850774630904198 -1.0194686651229858 0.07500000298023224 0.03479970246553421 -1.015817403793335 + 0.07500000298023224 0.03179759532213211 -1.0175867080688477 0.07500000298023224 0.028466785326600075 -1.018900752067566 + 0.07500000298023224 0.03546332195401192 -0.9804299473762512 0.07500000298023224 0.03786811605095863 -0.9825392365455627 + 0.07500000298023224 0.04003216326236725 -0.9851570725440979 0.07500000298023224 0.04184260591864586 -0.9882307648658752 + 0.07500000298023224 0.043087687343358994 -0.9913726449012756 0.07500000298023224 0.043835218995809555 -0.9948347806930542 + 0.07500000298023224 0.04403018206357956 -0.99779212474823 0.07500000298023224 0.04368852451443672 -1.001706600189209 + 0.07500000298023224 0.042822517454624176 -1.0050601959228516 0.07500000298023224 0.04136586934328079 -1.0083625316619873 + 0.07500000298023224 0.02571118250489235 -0.9761573076248169 0.07500000298023224 0.029025893658399582 -0.977008044719696 + 0.07500000298023224 0.03223368525505066 -0.9783909916877747 0.07500000298023224 0.039572037756443024 -1.0111843347549438 + 0.07500000298023224 0.03756442666053772 -1.0135047435760498 0.07500000298023224 0.02175896428525448 -0.9758124351501465 + 0.07500000298023224 -0.0033573717810213566 -0.9743198752403259 0.07500000298023224 0.019344331696629524 -0.9759432673454285 + 0.07500000298023224 0.07166442275047302 -0.9765299558639526 0.07500000298023224 -0.015401891432702541 -0.9725229740142822 + 0.07500000298023224 -0.01639512926340103 -0.9720999598503113 0.07500000298023224 -0.017306983470916748 -0.9715167284011841 + 0.07500000298023224 -0.008097046054899693 -0.9700708985328674 0.07500000298023224 -0.008924460969865322 -0.9710021018981934 + 0.07500000298023224 -0.007461805362254381 -0.9743198752403259 0.07500000298023224 -0.0200335793197155 -0.9643186330795288 + 0.07500000298023224 -0.01980743370950222 -0.9633541703224182 0.07500000298023224 -0.019405890256166458 -0.9623872637748718 + 0.07500000298023224 -0.018862470984458923 -0.9615017771720886 0.07500000298023224 -0.00991266779601574 -0.971801221370697 + 0.07500000298023224 -0.010745950974524021 -0.9722750782966614 0.07500000298023224 -0.011556214652955532 -0.9725804924964905 + 0.07500000298023224 -0.019307393580675125 -0.969139814376831 0.07500000298023224 -0.019764738157391548 -0.9680725932121277 + 0.07500000298023224 -0.02001914195716381 -0.967072069644928 0.07500000298023224 -0.02014823630452156 -0.965621292591095 + 0.07500000298023224 -0.012453963980078697 -0.9727584719657898 0.07500000298023224 -0.013373589143157005 -0.9728273749351501 + 0.07500000298023224 -0.014585573226213455 -0.9727237224578857 0.07500000298023224 -0.018072940409183502 -0.9708265066146851 + 0.07500000298023224 -0.018717452883720398 -0.97007155418396 0.07500000298023224 -0.0033573717810213566 -0.9601408243179321 + 0.07500000298023224 -0.007661657407879829 -0.9621101021766663 0.07500000298023224 -0.00671554496511817 -0.9657728672027588 + 0.07500000298023224 -0.006827129982411861 -0.9670795798301697 0.07500000298023224 -0.007087483536452055 -0.9681544303894043 + 0.07500000298023224 -0.007504359353333712 -0.9691329598426819 0.07500000298023224 -0.007211021613329649 -0.9630182981491089 + 0.07500000298023224 -0.006920898798853159 -0.9639540314674377 0.07500000298023224 -0.006749726366251707 -0.9652026295661926 + 0.07500000298023224 -0.00870590377599001 -0.9607270359992981 0.07500000298023224 -0.00840179156512022 -0.961067795753479 + 0.07500000298023224 -0.018052956089377403 -0.960549533367157 0.07500000298023224 -0.0172481220215559 -0.9598599672317505 + 0.07500000298023224 -0.016394607722759247 -0.9593374729156494 0.07500000298023224 -0.015420176088809967 -0.9589366912841797 + 0.07500000298023224 -0.014564498327672482 -0.9587403535842896 0.07500000298023224 -0.007461805362254381 -0.8999999761581421 + 0.07500000298023224 -0.013455212116241455 -0.9586484432220459 0.07500000298023224 -0.012247473001480103 -0.9587531089782715 + 0.07500000298023224 -0.007461805362254381 -1.100000023841858 0.07500000298023224 -0.007461805362254381 -1.0194686651229858 + 0.07500000298023224 0.1257457286119461 -1.100000023841858 0.07500000298023224 0.1283576339483261 -1.0194686651229858 + 0.07500000298023224 0.1283576339483261 -1.100000023841858 0.07500000298023224 0.1402978152036667 -1.0194686651229858 + 0.07500000298023224 0.1402978152036667 -1.100000023841858 0.07500000298023224 0.14514850080013275 -1.100000023841858 + 0.07500000298023224 0.2150000035762787 -1.100000023841858 0.07500000298023224 -0.00820806622505188 -0.9765586853027344 + 0.07500000298023224 -0.00820806622505188 -1.019095540046692 0.07500000298023224 -0.018655715510249138 -1.019095540046692 + 0.07500000298023224 -0.018655715510249138 -0.9765586853027344 0.07500000298023224 -0.007461805362254381 -0.9761855602264404 + 0.07500000298023224 0.1283576339483261 -0.9761855602264404 0.07500000298023224 0.1395515501499176 -0.9765586853027344 + 0.07500000298023224 0.1395515501499176 -1.019095540046692 0.07500000298023224 0.1291038990020752 -1.019095540046692 + 0.07500000298023224 0.1291038990020752 -0.9765586853027344 0.07500000298023224 0.1402978152036667 -0.9761855602264404 + 0.07500000298023224 0.1667497307062149 -0.9769090414047241 0.07500000298023224 0.09925347566604614 -0.9601408243179321 + 0.07500000298023224 0.04850774630904198 -0.9601408243179321 0.07500000298023224 -0.07500000298023224 -0.9590215682983398 + 0.07500000298023224 -0.011364990845322609 -0.958979606628418 0.07500000298023224 -0.007461805362254381 -0.9590215682983398 + 0.07500000298023224 -0.0033573717810213566 -0.9590215682983398 0.07500000298023224 0.04850774630904198 -0.9590215682983398 + 0.07500000298023224 0.09925347566604614 -0.9590215682983398 0.07500000298023224 0.1067160815000534 -0.9601408243179321 + 0.07500000298023224 0.1067160815000534 -0.9743198752403259 0.07500000298023224 0.1067160815000534 -0.9761855602264404 + 0.07500000298023224 0.1067160815000534 -0.9765586853027344 0.07500000298023224 0.1257457286119461 -0.9590215682983398 + 0.07500000298023224 0.1067160815000534 -0.9593946933746338 0.07500000298023224 0.14514850080013275 -0.9590215682983398 + 0.07500000298023224 0.1402978152036667 -0.9590215682983398 0.07500000298023224 0.13639461994171143 -0.958979606628418 + 0.07500000298023224 0.17571692168712616 -0.9759947657585144 0.07500000298023224 0.21996194124221802 -0.9601408243179321 + 0.07500000298023224 0.21996194124221802 -0.9590215682983398 0.07500000298023224 0.22499999403953552 -1.0194686651229858 + 0.07500000298023224 0.22499999403953552 -0.9761855602264404 0.07500000298023224 0.22499999403953552 -0.9743198752403259 + 0.07500000298023224 0.22499999403953552 -0.9601408243179321 0.07500000298023224 0.21842020750045776 -0.9006030559539795 + 0.07500000298023224 0.1257457286119461 -0.8999999761581421 0.07500000298023224 0.09925347566604614 -0.8999999761581421 + 0.07500000298023224 0.04850774630904198 -0.8999999761581421 0.07500000298023224 -0.0033573717810213566 -0.8999999761581421 + 0.07500000298023224 0.21673648059368134 -0.9001519083976746 0.07500000298023224 0.2150000035762787 -0.8999999761581421 + 0.07500000298023224 0.14514850080013275 -0.8999999761581421 -0.07500000298023224 0.22499999403953552 -0.9100000262260437 + -0.07500000298023224 0.22499999403953552 -1.090000033378601 -0.07500000298023224 0.2150000035762787 -0.8999999761581421 + -0.07500000298023224 -0.06499999761581421 -0.8999999761581421 -0.07500000298023224 -0.07500000298023224 -1.090000033378601 + -0.07500000298023224 -0.07500000298023224 -0.9100000262260437 -0.07500000298023224 0.2150000035762787 -1.100000023841858 + -0.07500000298023224 -0.06499999761581421 -1.100000023841858 -0.07500000298023224 -0.06673648208379745 -0.9001519083976746 + -0.07500000298023224 0.22484807670116425 -0.9082635045051575 -0.07500000298023224 0.21673648059368134 -0.9001519083976746 + -0.07500000298023224 0.21842020750045776 -1.0993969440460205 -0.07500000298023224 0.21673648059368134 -1.0998480319976807 + -0.07500000298023224 -0.07266044616699219 -0.903572142124176 -0.07500000298023224 -0.07142787426710129 -0.9023395776748657 + -0.07500000298023224 0.22484807670116425 -1.0917364358901978 -0.07500000298023224 0.22439692914485931 -1.093420147895813 + -0.07500000298023224 0.22366026043891907 -1.0950000286102295 -0.07500000298023224 0.22266043722629547 -1.0964279174804688 + -0.07500000298023224 0.22142787277698517 -1.0976604223251343 -0.07500000298023224 0.2199999988079071 -1.0986602306365967 + -0.07500000298023224 -0.06673648208379745 -1.0998480319976807 -0.07500000298023224 -0.06842020153999329 -1.0993969440460205 + -0.07500000298023224 -0.07000000029802322 -0.9013397693634033 -0.07500000298023224 -0.06842020153999329 -0.9006030559539795 + -0.07500000298023224 0.21842020750045776 -0.9006030559539795 -0.07500000298023224 0.2199999988079071 -0.9013397693634033 + -0.07500000298023224 0.22142787277698517 -0.9023395776748657 -0.07500000298023224 0.22266043722629547 -0.903572142124176 + -0.07500000298023224 0.22366026043891907 -0.9049999713897705 -0.07500000298023224 0.22439692914485931 -0.9065797924995422 + -0.07500000298023224 -0.07366025447845459 -1.0950000286102295 -0.07500000298023224 -0.07439692318439484 -1.093420147895813 + -0.07500000298023224 -0.07484807819128036 -1.0917364358901978 -0.07500000298023224 -0.07366025447845459 -0.9049999713897705 + -0.07500000298023224 -0.07484807819128036 -0.9082635045051575 -0.07500000298023224 -0.07439692318439484 -0.9065797924995422 + -0.07500000298023224 -0.07000000029802322 -1.0986602306365967 -0.07500000298023224 -0.07142787426710129 -1.0976604223251343 + -0.07500000298023224 -0.07266044616699219 -1.0964279174804688 0.06499999761581421 0.1067160815000534 -0.9765586853027344 + 0.06499999761581421 0.1067160815000534 -0.9593946933746338 0.06499999761581421 0.11716372519731522 -0.9593946933746338 + 0.06499999761581421 0.11716372519731522 -0.9765586853027344 0.06499999761581421 0.12388007342815399 -0.9765586853027344 + 0.06499999761581421 0.12388007342815399 -0.9855138063430786 0.06499999761581421 0.11716372519731522 -0.9855138063430786 + 0.06499999761581421 0.11716372519731522 -1.019095540046692 0.06499999761581421 0.1067160815000534 -1.019095540046692 + 0.06499999761581421 0.1067160815000534 -0.9855138063430786 0.06499999761581421 0.1014922559261322 -0.9855138063430786 + 0.06499999761581421 0.1014922559261322 -0.9765586853027344 0.06499999761581421 0.13430440425872803 -0.9586484432220459 + 0.06499999761581421 0.13319511711597443 -0.9587403535842896 0.06499999761581421 0.13233943283557892 -0.9589366912841797 + 0.06499999761581421 0.13136500120162964 -0.9593374729156494 0.06499999761581421 0.13051149249076843 -0.9598599672317505 + 0.06499999761581421 0.12970666587352753 -0.960549533367157 0.06499999761581421 0.12889714539051056 -0.9615017771720886 + 0.06499999761581421 0.12835372984409332 -0.9623872637748718 0.06499999761581421 0.1279521882534027 -0.9633541703224182 + 0.06499999761581421 0.12772603332996368 -0.9643186330795288 0.06499999761581421 0.12761138379573822 -0.965621292591095 + 0.06499999761581421 0.14104406535625458 -0.9657728672027588 0.06499999761581421 0.1410098820924759 -0.9652026295661926 + 0.06499999761581421 0.14083871245384216 -0.9639540314674377 0.06499999761581421 0.14054858684539795 -0.9630182981491089 + 0.06499999761581421 0.1400979608297348 -0.9621101021766663 0.06499999761581421 0.1393578201532364 -0.961067795753479 + 0.06499999761581421 0.13905371725559235 -0.9607270359992981 0.06499999761581421 0.13824771344661713 -0.9599928855895996 + 0.06499999761581421 0.1373596489429474 -0.9594099521636963 0.06499999761581421 0.13639461994171143 -0.958979606628418 + 0.06499999761581421 0.13551214337348938 -0.9587531089782715 0.06499999761581421 0.13438603281974792 -0.9728273749351501 + 0.06499999761581421 0.13530565798282623 -0.9727584719657898 0.06499999761581421 0.13620339334011078 -0.9725804924964905 + 0.06499999761581421 0.13701365888118744 -0.9722750782966614 0.06499999761581421 0.1378469467163086 -0.971801221370697 + 0.06499999761581421 0.13883516192436218 -0.9710021018981934 0.06499999761581421 0.13966256380081177 -0.9700708985328674 + 0.06499999761581421 0.14025525748729706 -0.9691329598426819 0.06499999761581421 0.14067213237285614 -0.9681544303894043 + 0.06499999761581421 0.14093248546123505 -0.9670795798301697 0.06499999761581421 0.12774047255516052 -0.967072069644928 + 0.06499999761581421 0.12799488008022308 -0.9680725932121277 0.06499999761581421 0.12845222651958466 -0.969139814376831 + 0.06499999761581421 0.12904216349124908 -0.97007155418396 0.06499999761581421 0.12968666851520538 -0.9708265066146851 + 0.06499999761581421 0.13045263290405273 -0.9715167284011841 0.06499999761581421 0.13136447966098785 -0.9720999598503113 + 0.06499999761581421 0.13235771656036377 -0.9725229740142822 0.06499999761581421 0.13317404687404633 -0.9727237224578857 + 0.06499999761581421 0.1291038990020752 -1.019095540046692 0.06499999761581421 0.1291038990020752 -0.9765586853027344 + 0.06499999761581421 0.1395515501499176 -0.9765586853027344 0.06499999761581421 0.1395515501499176 -1.019095540046692 + 0.06499999761581421 0.14925293624401093 -1.019095540046692 0.06499999761581421 0.14925293624401093 -0.9765586853027344 + 0.06499999761581421 0.15970058739185333 -0.9765586853027344 0.06499999761581421 0.15970058739185333 -0.9816426038742065 + 0.06499999761581421 0.17326153814792633 -0.9758124351501465 0.06499999761581421 0.17242136597633362 -0.9758388996124268 + 0.06499999761581421 0.1693974882364273 -0.9761747717857361 0.06499999761581421 0.1667497307062149 -0.9769090414047241 + 0.06499999761581421 0.16435062885284424 -0.9779912829399109 0.06499999761581421 0.162018820643425 -0.9795268774032593 + 0.06499999761581421 0.1857847273349762 -0.9833916425704956 0.06499999761581421 0.184733048081398 -0.9816730618476868 + 0.06499999761581421 0.18338342010974884 -0.9800153970718384 0.06499999761581421 0.1818569153547287 -0.978629469871521 + 0.06499999761581421 0.17983943223953247 -0.9773507714271545 0.06499999761581421 0.1777680516242981 -0.9764837622642517 + 0.06499999761581421 0.17571692168712616 -0.9759947657585144 0.06499999761581421 0.20029017329216003 -0.9758124351501465 + 0.06499999761581421 0.19707003235816956 -0.9760759472846985 0.06499999761581421 0.19431035220623016 -0.9767953157424927 + 0.06499999761581421 0.19185638427734375 -0.977878749370575 0.06499999761581421 0.18969440460205078 -0.9792667031288147 + 0.06499999761581421 0.18769587576389313 -0.9810447096824646 0.06499999761581421 0.21492387354373932 -0.9943523406982422 + 0.06499999761581421 0.21492120623588562 -0.9939595460891724 0.06499999761581421 0.21455524861812592 -0.9879276752471924 + 0.06499999761581421 0.21392078697681427 -0.9848097562789917 0.06499999761581421 0.2132447510957718 -0.9830569624900818 + 0.06499999761581421 0.2122722715139389 -0.9814254641532898 0.06499999761581421 0.21214178204536438 -0.9812469482421875 + 0.06499999761581421 0.21074841916561127 -0.979682207107544 0.06499999761581421 0.20920543372631073 -0.9784379601478577 + 0.06499999761581421 0.20727497339248657 -0.9773083925247192 0.06499999761581421 0.205280601978302 -0.9765248894691467 + 0.06499999761581421 0.20297765731811523 -0.9759997129440308 0.06499999761581421 0.21492387354373932 -1.019095540046692 + 0.06499999761581421 0.2044762223958969 -1.019095540046692 0.06499999761581421 0.2044762223958969 -0.9977338314056396 + 0.06499999761581421 0.19694365561008453 -0.9855138063430786 0.06499999761581421 0.19818858802318573 -0.9855872392654419 + 0.06499999761581421 0.19951152801513672 -0.9858794808387756 0.06499999761581421 0.20040078461170197 -0.9862175583839417 + 0.06499999761581421 0.2010383903980255 -0.9865895509719849 0.06499999761581421 0.20181600749492645 -0.987197756767273 + 0.06499999761581421 0.2024785280227661 -0.9879127144813538 0.06499999761581421 0.20299197733402252 -0.9886852502822876 + 0.06499999761581421 0.20342206954956055 -0.9896246790885925 0.06499999761581421 0.2039327472448349 -0.9913639426231384 + 0.06499999761581421 0.2043185830116272 -0.9939865469932556 0.06499999761581421 0.18731223046779633 -1.00010085105896 + 0.06499999761581421 0.187312051653862 -0.9998319149017334 0.06499999761581421 0.18770472705364227 -0.9940816760063171 + 0.06499999761581421 0.18818031251430511 -0.9920133352279663 0.06499999761581421 0.18882402777671814 -0.9904488921165466 + 0.06499999761581421 0.18886959552764893 -0.9903623461723328 0.06499999761581421 0.18961428105831146 -0.9891654849052429 + 0.06499999761581421 0.1904878169298172 -0.9881461262702942 0.06499999761581421 0.19165471196174622 -0.9871660470962524 + 0.06499999761581421 0.19279229640960693 -0.9864806532859802 0.06499999761581421 0.19404861330986023 -0.9859556555747986 + 0.06499999761581421 0.1953527331352234 -0.9856348633766174 0.06499999761581421 0.18731223046779633 -1.019095540046692 + 0.06499999761581421 0.17686457931995392 -1.019095540046692 0.06499999761581421 0.17686457931995392 -0.9987016320228577 + 0.06499999761581421 0.16916877031326294 -0.9855138063430786 0.06499999761581421 0.17036880552768707 -0.9855967164039612 + 0.06499999761581421 0.17141956090927124 -0.9858068823814392 0.06499999761581421 0.17242588102817535 -0.9861927628517151 + 0.06499999761581421 0.1732860505580902 -0.986685574054718 0.06499999761581421 0.17403900623321533 -0.9872962236404419 + 0.06499999761581421 0.17471501231193542 -0.9880504012107849 0.06499999761581421 0.17531104385852814 -0.9889717102050781 + 0.06499999761581421 0.17598575353622437 -0.9905153512954712 0.06499999761581421 0.17643998563289642 -0.9923321604728699 + 0.06499999761581421 0.17673788964748383 -0.994933545589447 0.06499999761581421 0.15970058739185333 -1.0003690719604492 + 0.06499999761581421 0.15998739004135132 -0.9950563907623291 0.06499999761581421 0.160433828830719 -0.9926329851150513 + 0.06499999761581421 0.16101662814617157 -0.9909725785255432 0.06499999761581421 0.16188976168632507 -0.9894080758094788 + 0.06499999761581421 0.16282688081264496 -0.9882413744926453 0.06499999761581421 0.16391517221927643 -0.9872714877128601 + 0.06499999761581421 0.16510356962680817 -0.9865109920501709 0.06499999761581421 0.16636233031749725 -0.9859707355499268 + 0.06499999761581421 0.1676650047302246 -0.9856323003768921 0.06499999761581421 0.15970058739185333 -1.019095540046692 + 0.06499999761581421 0.052985310554504395 -0.9765586853027344 0.06499999761581421 0.0634329617023468 -0.9765586853027344 + 0.06499999761581421 0.0634329617023468 -0.9813510775566101 0.06499999761581421 0.07694727182388306 -0.9758124351501465 + 0.06499999761581421 0.07467537373304367 -0.9759325981140137 0.06499999761581421 0.07166442275047302 -0.9765299558639526 + 0.06499999761581421 0.06865974515676498 -0.9776683449745178 0.06499999761581421 0.06604959815740585 -0.9791972637176514 + 0.06499999761581421 0.09701468795537949 -0.9979087114334106 0.06499999761581421 0.09681280702352524 -0.994392454624176 + 0.06499999761581421 0.09616263955831528 -0.991030216217041 0.06499999761581421 0.0949987918138504 -0.987728476524353 + 0.06499999761581421 0.09331677109003067 -0.9846907258033752 0.06499999761581421 0.09101212024688721 -0.9818593859672546 + 0.06499999761581421 0.0887070819735527 -0.9797661900520325 0.06499999761581421 0.08619612455368042 -0.9781150221824646 + 0.06499999761581421 0.08333615958690643 -0.9768400192260742 0.06499999761581421 0.0804985985159874 -0.9761070609092712 + 0.06499999761581421 0.07663244754076004 -1.0198417901992798 0.06499999761581421 0.07925854623317719 -1.0196820497512817 + 0.06499999761581421 0.08209125697612762 -1.0190876722335815 0.06499999761581421 0.08470483124256134 -1.0181121826171875 + 0.06499999761581421 0.08739786595106125 -1.0165891647338867 0.06499999761581421 0.09026649594306946 -1.0142476558685303 + 0.06499999761581421 0.0926508978009224 -1.0115944147109985 0.06499999761581421 0.09455258399248123 -1.0085887908935547 + 0.06499999761581421 0.0959499180316925 -1.0052114725112915 0.06499999761581421 0.09673352539539337 -1.0018399953842163 + 0.06499999761581421 0.0634329617023468 -1.014291524887085 0.06499999761581421 0.06585437804460526 -1.0163238048553467 + 0.06499999761581421 0.06859349459409714 -1.0180126428604126 0.06499999761581421 0.07098688930273056 -1.0190008878707886 + 0.06499999761581421 0.0736122652888298 -1.0196105241775513 0.06499999761581421 0.0634329617023468 -1.0347670316696167 + 0.06499999761581421 0.052985310554504395 -1.0347670316696167 0.06499999761581421 0.06765947490930557 -1.0080426931381226 + 0.06499999761581421 0.0660998597741127 -1.006720781326294 0.06499999761581421 0.06488552689552307 -1.005275011062622 + 0.06499999761581421 0.06403030455112457 -1.0038608312606812 0.06499999761581421 0.06325816363096237 -1.0019088983535767 + 0.06499999761581421 0.06906680017709732 -1.0088828802108765 0.06499999761581421 0.0710308775305748 -1.0096575021743774 + 0.06499999761581421 0.07276282459497452 -1.010015606880188 0.06499999761581421 0.07468517124652863 -1.0101404190063477 + 0.06499999761581421 0.06283891946077347 -0.9999765157699585 0.06499999761581421 0.06353507936000824 -0.9927855134010315 + 0.06499999761581421 0.06433182954788208 -0.9911431074142456 0.06499999761581421 0.06542394310235977 -0.9896196126937866 + 0.06499999761581421 0.07680076360702515 -1.009971261024475 0.06499999761581421 0.07850658893585205 -1.0095611810684204 + 0.06499999761581421 0.08025021106004715 -1.0088177919387817 0.06499999761581421 0.08163058757781982 -1.0079588890075684 + 0.06499999761581421 0.08314066380262375 -1.0066403150558472 0.06499999761581421 0.08365068584680557 -1.0060830116271973 + 0.06499999761581421 0.08478207886219025 -1.0045524835586548 0.06499999761581421 0.06268669664859772 -0.9977105259895325 + 0.06499999761581421 0.06273321062326431 -0.9965543150901794 0.06499999761581421 0.06300875544548035 -0.9945511817932129 + 0.06499999761581421 0.06621847301721573 -0.9887712597846985 0.06499999761581421 0.06763077527284622 -0.9876059889793396 + 0.06499999761581421 0.06915167719125748 -0.98670494556427 0.06499999761581421 0.07072903960943222 -0.9860849976539612 + 0.06499999761581421 0.07251861691474915 -0.9856716394424438 0.06499999761581421 0.07468517124652863 -0.9855138063430786 + 0.06499999761581421 0.07620196789503098 -0.985594630241394 0.06499999761581421 0.07814452052116394 -0.9859507083892822 + 0.06499999761581421 0.07971804589033127 -0.9865167737007141 0.06499999761581421 0.0811692476272583 -0.9872946739196777 + 0.06499999761581421 0.08263646811246872 -0.9884205460548401 0.06499999761581421 0.08348027616739273 -0.9892491698265076 + 0.06499999761581421 0.08455318957567215 -0.9906109571456909 0.06499999761581421 0.08541049808263779 -0.9921236038208008 + 0.06499999761581421 0.08601222187280655 -0.993716835975647 0.06499999761581421 0.08641370385885239 -0.9955393671989441 + 0.06499999761581421 0.08656704425811768 -0.9977454543113708 0.06499999761581421 0.08649596571922302 -0.9992251396179199 + 0.06499999761581421 0.08615612238645554 -1.0012850761413574 0.06499999761581421 0.0855809822678566 -1.0029852390289307 + 0.07500000298023224 0.07468517124652863 -0.9855138063430786 0.07500000298023224 0.07620196789503098 -0.985594630241394 + 0.07500000298023224 0.07814452052116394 -0.9859507083892822 0.07500000298023224 0.07971804589033127 -0.9865167737007141 + 0.07500000298023224 0.0811692476272583 -0.9872946739196777 0.07500000298023224 0.08263646811246872 -0.9884205460548401 + 0.07500000298023224 0.08348027616739273 -0.9892491698265076 0.07500000298023224 0.08455318957567215 -0.9906109571456909 + 0.07500000298023224 0.08541049808263779 -0.9921236038208008 0.07500000298023224 0.08601222187280655 -0.993716835975647 + 0.07500000298023224 0.08641370385885239 -0.9955393671989441 0.07500000298023224 0.08656704425811768 -0.9977454543113708 + 0.07500000298023224 0.08649596571922302 -0.9992251396179199 0.07500000298023224 0.08615612238645554 -1.0012850761413574 + 0.07500000298023224 0.0855809822678566 -1.0029852390289307 0.07500000298023224 0.08478207886219025 -1.0045524835586548 + 0.07500000298023224 0.08365068584680557 -1.0060830116271973 0.07500000298023224 0.08314066380262375 -1.0066403150558472 + 0.07500000298023224 0.08163058757781982 -1.0079588890075684 0.07500000298023224 0.08025021106004715 -1.0088177919387817 + 0.07500000298023224 0.07850658893585205 -1.0095611810684204 0.07500000298023224 0.07680076360702515 -1.009971261024475 + 0.07500000298023224 0.07468517124652863 -1.0101404190063477 0.07500000298023224 0.07276282459497452 -1.010015606880188 + 0.07500000298023224 0.0710308775305748 -1.0096575021743774 0.07500000298023224 0.06906680017709732 -1.0088828802108765 + 0.07500000298023224 0.06765947490930557 -1.0080426931381226 0.07500000298023224 0.0660998597741127 -1.006720781326294 + 0.07500000298023224 0.06488552689552307 -1.005275011062622 0.07500000298023224 0.06403030455112457 -1.0038608312606812 + 0.07500000298023224 0.06325816363096237 -1.0019088983535767 0.07500000298023224 0.06283891946077347 -0.9999765157699585 + 0.07500000298023224 0.06268669664859772 -0.9977105259895325 0.07500000298023224 0.06273321062326431 -0.9965543150901794 + 0.07500000298023224 0.06300875544548035 -0.9945511817932129 0.07500000298023224 0.06353507936000824 -0.9927855134010315 + 0.07500000298023224 0.06433182954788208 -0.9911431074142456 0.07500000298023224 0.06542394310235977 -0.9896196126937866 + 0.07500000298023224 0.06621847301721573 -0.9887712597846985 0.07500000298023224 0.06763077527284622 -0.9876059889793396 + 0.07500000298023224 0.06915167719125748 -0.98670494556427 0.07500000298023224 0.07072903960943222 -0.9860849976539612 + 0.07500000298023224 0.07251861691474915 -0.9856716394424438 0.06499999761581421 0.02175896428525448 -0.9758124351501465 + 0.06499999761581421 0.019344331696629524 -0.9759432673454285 0.06499999761581421 0.016140291467308998 -0.9765430092811584 + 0.06499999761581421 0.013179200701415539 -0.9775858521461487 0.06499999761581421 0.010197761468589306 -0.9792144894599915 + 0.06499999761581421 0.007218541111797094 -0.9815143346786499 0.06499999761581421 0.04403018206357956 -0.99779212474823 + 0.06499999761581421 0.043835218995809555 -0.9948347806930542 0.06499999761581421 0.043087687343358994 -0.9913726449012756 + 0.06499999761581421 0.04184260591864586 -0.9882307648658752 0.06499999761581421 0.04003216326236725 -0.9851570725440979 + 0.06499999761581421 0.03786811605095863 -0.9825392365455627 0.06499999761581421 0.03546332195401192 -0.9804299473762512 + 0.06499999761581421 0.03223368525505066 -0.9783909916877747 0.06499999761581421 0.029025893658399582 -0.977008044719696 + 0.06499999761581421 0.02571118250489235 -0.9761573076248169 0.06499999761581421 0.02180560491979122 -1.0198417901992798 + 0.06499999761581421 0.024940114468336105 -1.0196378231048584 0.06499999761581421 0.028466785326600075 -1.018900752067566 + 0.06499999761581421 0.03179759532213211 -1.0175867080688477 0.06499999761581421 0.03479970246553421 -1.015817403793335 + 0.06499999761581421 0.03756442666053772 -1.0135047435760498 0.06499999761581421 0.039572037756443024 -1.0111843347549438 + 0.06499999761581421 0.04136586934328079 -1.0083625316619873 0.06499999761581421 0.042822517454624176 -1.0050601959228516 + 0.06499999761581421 0.04368852451443672 -1.001706600189209 0.06499999761581421 8.012820558178646e-7 -0.9978621006011963 + 0.06499999761581421 0.00018641891074366868 -1.0009055137634277 0.06499999761581421 0.0008666550274938345 -1.004235863685608 + 0.06499999761581421 0.002135421149432659 -1.007535696029663 0.06499999761581421 0.0038314261473715305 -1.01040780544281 + 0.06499999761581421 0.0063338796608150005 -1.013394832611084 0.06499999761581421 0.00881226547062397 -1.0155718326568604 + 0.06499999761581421 0.011622263118624687 -1.0173884630203247 0.06499999761581421 0.014758086763322353 -1.018739104270935 + 0.06499999761581421 0.017914719879627228 -1.0195273160934448 0.06499999761581421 0.006282172165811062 -0.9824248552322388 + 0.06499999761581421 0.004034847486764193 -0.9850214719772339 0.06499999761581421 0.002276132581755519 -0.9878852963447571 + 0.06499999761581421 0.0010579412337392569 -0.9908367991447449 0.06499999761581421 0.00029209189233370125 -0.9940674304962158 + 0.06499999761581421 0.01047085877507925 -0.9968671202659607 0.06499999761581421 0.010742684826254845 -0.9947537779808044 + 0.06499999761581421 0.011332796886563301 -0.9927322864532471 0.06499999761581421 0.012058605439960957 -0.9912068843841553 + 0.06499999761581421 0.013067510910332203 -0.9897238612174988 0.06499999761581421 0.013772326521575451 -0.988928496837616 + 0.06499999761581421 0.015333861112594604 -0.9875580072402954 0.06499999761581421 0.01667037419974804 -0.9867452383041382 + 0.06499999761581421 0.018299462273716927 -0.9860681295394897 0.06499999761581421 0.01992102898657322 -0.985670268535614 + 0.06499999761581421 0.021992171183228493 -0.9855138063430786 0.06499999761581421 0.02395494654774666 -0.9856496453285217 + 0.06499999761581421 0.02569981850683689 -0.9860409498214722 0.06499999761581421 0.027253534644842148 -0.9866531491279602 + 0.06499999761581421 0.028631621971726418 -0.9874619245529175 0.06499999761581421 0.030098071321845055 -0.9886963963508606 + 0.06499999761581421 0.03134456276893616 -0.9901459813117981 0.06499999761581421 0.03222443908452988 -0.9915875792503357 + 0.06499999761581421 0.03301246091723442 -0.9935639500617981 0.06499999761581421 0.033443283289670944 -0.9955559372901917 + 0.06499999761581421 0.03358253091573715 -0.9977688193321228 0.06499999761581421 0.03338003158569336 -1.0003259181976318 + 0.06499999761581421 0.032921288162469864 -1.002234697341919 0.06499999761581421 0.03222968056797981 -1.0039148330688477 + 0.06499999761581421 0.031324516981840134 -1.0054038763046265 0.06499999761581421 0.03005211614072323 -1.006890892982483 + 0.06499999761581421 0.028652183711528778 -1.0080852508544922 0.06499999761581421 0.027222901582717896 -1.0089572668075562 + 0.06499999761581421 0.025748401880264282 -1.0095640420913696 0.06499999761581421 0.024020515382289886 -1.0099766254425049 + 0.06499999761581421 0.021957190707325935 -1.0101404190063477 0.06499999761581421 0.019720470532774925 -1.0099577903747559 + 0.06499999761581421 0.018060004338622093 -1.0095360279083252 0.06499999761581421 0.0165505800396204 -1.0088945627212524 + 0.06499999761581421 0.015083740465342999 -1.007961392402649 0.06499999761581421 0.013824086636304855 -1.0068520307540894 + 0.06499999761581421 0.012586751021444798 -1.005350947380066 0.06499999761581421 0.011726206168532372 -1.003869652748108 + 0.06499999761581421 0.011029752902686596 -1.0020662546157837 0.06499999761581421 0.010588997043669224 -1.000023365020752 + 0.06499999761581421 0.010448451153934002 -0.9977688193321228 0.07500000298023224 0.021992171183228493 -0.9855138063430786 + 0.07500000298023224 0.02395494654774666 -0.9856496453285217 0.07500000298023224 0.02569981850683689 -0.9860409498214722 + 0.07500000298023224 0.027253534644842148 -0.9866531491279602 0.07500000298023224 0.028631621971726418 -0.9874619245529175 + 0.07500000298023224 0.030098071321845055 -0.9886963963508606 0.07500000298023224 0.03134456276893616 -0.9901459813117981 + 0.07500000298023224 0.03222443908452988 -0.9915875792503357 0.07500000298023224 0.03301246091723442 -0.9935639500617981 + 0.07500000298023224 0.033443283289670944 -0.9955559372901917 0.07500000298023224 0.03358253091573715 -0.9977688193321228 + 0.07500000298023224 0.03338003158569336 -1.0003259181976318 0.07500000298023224 0.032921288162469864 -1.002234697341919 + 0.07500000298023224 0.03222968056797981 -1.0039148330688477 0.07500000298023224 0.031324516981840134 -1.0054038763046265 + 0.07500000298023224 0.03005211614072323 -1.006890892982483 0.07500000298023224 0.028652183711528778 -1.0080852508544922 + 0.07500000298023224 0.027222901582717896 -1.0089572668075562 0.07500000298023224 0.025748401880264282 -1.0095640420913696 + 0.07500000298023224 0.024020515382289886 -1.0099766254425049 0.07500000298023224 0.021957190707325935 -1.0101404190063477 + 0.07500000298023224 0.019720470532774925 -1.0099577903747559 0.07500000298023224 0.018060004338622093 -1.0095360279083252 + 0.07500000298023224 0.0165505800396204 -1.0088945627212524 0.07500000298023224 0.015083740465342999 -1.007961392402649 + 0.07500000298023224 0.013824086636304855 -1.0068520307540894 0.07500000298023224 0.012586751021444798 -1.005350947380066 + 0.07500000298023224 0.011726206168532372 -1.003869652748108 0.07500000298023224 0.011029752902686596 -1.0020662546157837 + 0.07500000298023224 0.010588997043669224 -1.000023365020752 0.07500000298023224 0.010448451153934002 -0.9977688193321228 + 0.07500000298023224 0.01047085877507925 -0.9968671202659607 0.07500000298023224 0.010742684826254845 -0.9947537779808044 + 0.07500000298023224 0.011332796886563301 -0.9927322864532471 0.07500000298023224 0.012058605439960957 -0.9912068843841553 + 0.07500000298023224 0.013067510910332203 -0.9897238612174988 0.07500000298023224 0.013772326521575451 -0.988928496837616 + 0.07500000298023224 0.015333861112594604 -0.9875580072402954 0.07500000298023224 0.01667037419974804 -0.9867452383041382 + 0.07500000298023224 0.018299462273716927 -0.9860681295394897 0.07500000298023224 0.01992102898657322 -0.985670268535614 + 0.06499999761581421 -0.018655715510249138 -1.019095540046692 0.06499999761581421 -0.018655715510249138 -0.9765586853027344 + 0.06499999761581421 -0.00820806622505188 -0.9765586853027344 0.06499999761581421 -0.00820806622505188 -1.019095540046692 + 0.06499999761581421 -0.013455212116241455 -0.9586484432220459 0.06499999761581421 -0.014564498327672482 -0.9587403535842896 + 0.06499999761581421 -0.015420176088809967 -0.9589366912841797 0.06499999761581421 -0.016394607722759247 -0.9593374729156494 + 0.06499999761581421 -0.0172481220215559 -0.9598599672317505 0.06499999761581421 -0.018052956089377403 -0.960549533367157 + 0.06499999761581421 -0.018862470984458923 -0.9615017771720886 0.06499999761581421 -0.019405890256166458 -0.9623872637748718 + 0.06499999761581421 -0.01980743370950222 -0.9633541703224182 0.06499999761581421 -0.0200335793197155 -0.9643186330795288 + 0.06499999761581421 -0.02014823630452156 -0.965621292591095 0.06499999761581421 -0.00671554496511817 -0.9657728672027588 + 0.06499999761581421 -0.006749726366251707 -0.9652026295661926 0.06499999761581421 -0.006920898798853159 -0.9639540314674377 + 0.06499999761581421 -0.007211021613329649 -0.9630182981491089 0.06499999761581421 -0.007661657407879829 -0.9621101021766663 + 0.06499999761581421 -0.00840179156512022 -0.961067795753479 0.06499999761581421 -0.00870590377599001 -0.9607270359992981 + 0.06499999761581421 -0.009511898271739483 -0.9599928855895996 0.06499999761581421 -0.01039996836334467 -0.9594099521636963 + 0.06499999761581421 -0.011364990845322609 -0.958979606628418 0.06499999761581421 -0.012247473001480103 -0.9587531089782715 + 0.06499999761581421 -0.013373589143157005 -0.9728273749351501 0.06499999761581421 -0.012453963980078697 -0.9727584719657898 + 0.06499999761581421 -0.011556214652955532 -0.9725804924964905 0.06499999761581421 -0.010745950974524021 -0.9722750782966614 + 0.06499999761581421 -0.00991266779601574 -0.971801221370697 0.06499999761581421 -0.008924460969865322 -0.9710021018981934 + 0.06499999761581421 -0.008097046054899693 -0.9700708985328674 0.06499999761581421 -0.007504359353333712 -0.9691329598426819 + 0.06499999761581421 -0.007087483536452055 -0.9681544303894043 0.06499999761581421 -0.006827129982411861 -0.9670795798301697 + 0.06499999761581421 -0.02001914195716381 -0.967072069644928 0.06499999761581421 -0.019764738157391548 -0.9680725932121277 + 0.06499999761581421 -0.019307393580675125 -0.969139814376831 0.06499999761581421 -0.018717452883720398 -0.97007155418396 + 0.06499999761581421 -0.018072940409183502 -0.9708265066146851 0.06499999761581421 -0.017306983470916748 -0.9715167284011841 + 0.06499999761581421 -0.01639512926340103 -0.9720999598503113 0.06499999761581421 -0.015401891432702541 -0.9725229740142822 + 0.06499999761581421 -0.014585573226213455 -0.9727237224578857 0.06499999761581421 -0.04706026241183281 -1.019095540046692 + 0.06499999761581421 -0.06343135982751846 -1.019095540046692 0.06499999761581421 -0.06343135982751846 -0.9608871936798096 + 0.06499999761581421 -0.054103098809719086 -0.9608871936798096 0.06499999761581421 -0.04223288968205452 -0.9619249701499939 + 0.06499999761581421 -0.04326896741986275 -0.961672842502594 0.06499999761581421 -0.048134174197912216 -0.961067259311676 + 0.06499999761581421 -0.030595887452363968 -0.976068913936615 0.06499999761581421 -0.030633622780442238 -0.974927544593811 + 0.06499999761581421 -0.030949758365750313 -0.9727745652198792 0.06499999761581421 -0.03157554939389229 -0.9707229137420654 + 0.06499999761581421 -0.0324726402759552 -0.9689295887947083 0.06499999761581421 -0.033885546028614044 -0.9669565558433533 + 0.06499999761581421 -0.03546816110610962 -0.96536785364151 0.06499999761581421 -0.03737149387598038 -0.963961124420166 + 0.06499999761581421 -0.039630092680454254 -0.9628069400787354 0.06499999761581421 -0.03663593530654907 -0.9872861504554749 + 0.06499999761581421 -0.03450962156057358 -0.985462486743927 0.06499999761581421 -0.03290598466992378 -0.9835965633392334 + 0.06499999761581421 -0.03195717930793762 -0.982035219669342 0.06499999761581421 -0.031230833381414413 -0.9802628755569458 + 0.06499999761581421 -0.03076987713575363 -0.978350818157196 0.06499999761581421 -0.026864582672715187 -1.002246379852295 + 0.06499999761581421 -0.0268715713173151 -1.0017646551132202 0.06499999761581421 -0.027188872918486595 -0.9986551403999329 + 0.06499999761581421 -0.02784656547009945 -0.9962823390960693 0.06499999761581421 -0.028822921216487885 -0.9941446185112 + 0.06499999761581421 -0.030186116695404053 -0.9921354055404663 0.06499999761581421 -0.0318390354514122 -0.9904229640960693 + 0.06499999761581421 -0.03399766609072685 -0.9887790083885193 0.06499999761581421 -0.04234897717833519 -1.0188359022140503 + 0.06499999761581421 -0.03870970383286476 -1.0181405544281006 0.06499999761581421 -0.03625013679265976 -1.017247200012207 + 0.06499999761581421 -0.033995870500802994 -1.0159586668014526 0.06499999761581421 -0.032116346061229706 -1.014439344406128 + 0.06499999761581421 -0.03022422082722187 -1.012319803237915 0.06499999761581421 -0.028730973601341248 -1.0099544525146484 + 0.06499999761581421 -0.027746953070163727 -1.0076913833618164 0.06499999761581421 -0.027131732553243637 -1.0053248405456543 + 0.06499999761581421 -0.052983708679676056 -0.9840213060379028 0.06499999761581421 -0.052983708679676056 -0.9713348746299744 + 0.06499999761581421 -0.052983708679676056 -0.993722677230835 0.06499999761581421 -0.05048839747905731 -0.993722677230835 + 0.06499999761581421 -0.05001472681760788 -0.9937278628349304 0.06499999761581421 -0.04548679292201996 -0.9940654039382935 + 0.06499999761581421 -0.043110769242048264 -0.9730507731437683 0.06499999761581421 -0.04249894991517067 -0.9736016392707825 + 0.06499999761581421 -0.04200227931141853 -0.9742101430892944 0.06499999761581421 -0.04155704379081726 -0.9749857783317566 + 0.06499999761581421 -0.041274797171354294 -0.9757168889045715 0.06499999761581421 -0.0411188006401062 -0.9764469265937805 + 0.06499999761581421 -0.04104353487491608 -0.9774681925773621 0.06499999761581421 -0.04288654774427414 -0.9946749806404114 + 0.06499999761581421 -0.04135880991816521 -0.9953039288520813 0.06499999761581421 -0.04028426855802536 -0.9959632158279419 + 0.06499999761581421 -0.03917029872536659 -0.9969378709793091 0.06499999761581421 -0.038529470562934875 -0.9977173805236816 + 0.06499999761581421 -0.0380563959479332 -0.9984955787658691 0.06499999761581421 -0.03765043243765831 -0.9995115995407104 + 0.06499999761581421 -0.03739528730511665 -1.0006089210510254 0.06499999761581421 -0.037312231957912445 -1.001838207244873 + 0.06499999761581421 -0.03734537959098816 -1.0026243925094604 0.06499999761581421 -0.037533488124608994 -1.0036462545394897 + 0.06499999761581421 -0.03778056055307388 -1.0043798685073853 0.06499999761581421 -0.03823684900999069 -1.0052446126937866 + 0.06499999761581421 -0.038683537393808365 -1.0058473348617554 0.06499999761581421 -0.03931666910648346 -1.006453037261963 + 0.06499999761581421 -0.04013765603303909 -1.0070537328720093 0.06499999761581421 -0.04104992747306824 -1.0074968338012695 + 0.06499999761581421 -0.042618557810783386 -1.0079891681671143 0.06499999761581421 -0.04556696489453316 -1.0084571838378906 + 0.06499999761581421 -0.04997534304857254 -1.0086479187011719 0.06499999761581421 -0.052983708679676056 -1.0086479187011719 + 0.06499999761581421 -0.04109788313508034 -0.9782865047454834 0.06499999761581421 -0.04123848304152489 -0.9791560769081116 + 0.06499999761581421 -0.04152004048228264 -0.9800007939338684 0.06499999761581421 -0.041957590728998184 -0.9808172583580017 + 0.06499999761581421 -0.04249223321676254 -0.9815109372138977 0.06499999761581421 -0.04318244010210037 -0.9821633100509644 + 0.06499999761581421 -0.04403479024767876 -0.9827485084533691 0.06499999761581421 -0.04505336284637451 -0.9832310676574707 + 0.06499999761581421 -0.04639799892902374 -0.9836391806602478 0.06499999761581421 -0.048191361129283905 -0.9839336276054382 + 0.06499999761581421 -0.04970715567469597 -0.9713348746299744 0.06499999761581421 -0.0489557646214962 -0.971346378326416 + 0.06499999761581421 -0.046371813863515854 -0.9716344475746155 0.06499999761581421 -0.04511429741978645 -0.9719715118408203 + 0.06499999761581421 -0.04390178248286247 -0.9725240468978882 0.06499999761581421 -0.043894652277231216 -0.9725280404090881 + 0.06499999761581421 -0.050208549946546555 -0.9840213060379028 0.07500000298023224 -0.04970715567469597 -0.9713348746299744 + 0.07500000298023224 -0.052983708679676056 -0.9713348746299744 0.07500000298023224 -0.0489557646214962 -0.971346378326416 + 0.07500000298023224 -0.046371813863515854 -0.9716344475746155 0.07500000298023224 -0.04511429741978645 -0.9719715118408203 + 0.07500000298023224 -0.04390178248286247 -0.9725240468978882 0.07500000298023224 -0.043894652277231216 -0.9725280404090881 + 0.07500000298023224 -0.043110769242048264 -0.9730507731437683 0.07500000298023224 -0.04249894991517067 -0.9736016392707825 + 0.07500000298023224 -0.04200227931141853 -0.9742101430892944 0.07500000298023224 -0.04155704379081726 -0.9749857783317566 + 0.07500000298023224 -0.041274797171354294 -0.9757168889045715 0.07500000298023224 -0.0411188006401062 -0.9764469265937805 + 0.07500000298023224 -0.04104353487491608 -0.9774681925773621 0.07500000298023224 -0.04109788313508034 -0.9782865047454834 + 0.07500000298023224 -0.04123848304152489 -0.9791560769081116 0.07500000298023224 -0.04152004048228264 -0.9800007939338684 + 0.07500000298023224 -0.041957590728998184 -0.9808172583580017 0.07500000298023224 -0.04249223321676254 -0.9815109372138977 + 0.07500000298023224 -0.04318244010210037 -0.9821633100509644 0.07500000298023224 -0.04403479024767876 -0.9827485084533691 + 0.07500000298023224 -0.04505336284637451 -0.9832310676574707 0.07500000298023224 -0.04639799892902374 -0.9836391806602478 + 0.07500000298023224 -0.048191361129283905 -0.9839336276054382 0.07500000298023224 -0.050208549946546555 -0.9840213060379028 + 0.07500000298023224 -0.052983708679676056 -0.9840213060379028 0.07500000298023224 -0.05048839747905731 -0.993722677230835 + 0.07500000298023224 -0.052983708679676056 -0.993722677230835 0.07500000298023224 -0.05001472681760788 -0.9937278628349304 + 0.07500000298023224 -0.04548679292201996 -0.9940654039382935 0.07500000298023224 -0.04288654774427414 -0.9946749806404114 + 0.07500000298023224 -0.04135880991816521 -0.9953039288520813 0.07500000298023224 -0.04028426855802536 -0.9959632158279419 + 0.07500000298023224 -0.03917029872536659 -0.9969378709793091 0.07500000298023224 -0.038529470562934875 -0.9977173805236816 + 0.07500000298023224 -0.0380563959479332 -0.9984955787658691 0.07500000298023224 -0.03765043243765831 -0.9995115995407104 + 0.07500000298023224 -0.03739528730511665 -1.0006089210510254 0.07500000298023224 -0.037312231957912445 -1.001838207244873 + 0.07500000298023224 -0.03734537959098816 -1.0026243925094604 0.07500000298023224 -0.037533488124608994 -1.0036462545394897 + 0.07500000298023224 -0.03778056055307388 -1.0043798685073853 0.07500000298023224 -0.03823684900999069 -1.0052446126937866 + 0.07500000298023224 -0.038683537393808365 -1.0058473348617554 0.07500000298023224 -0.03931666910648346 -1.006453037261963 + 0.07500000298023224 -0.04013765603303909 -1.0070537328720093 0.07500000298023224 -0.04104992747306824 -1.0074968338012695 + 0.07500000298023224 -0.042618557810783386 -1.0079891681671143 0.07500000298023224 -0.04556696489453316 -1.0084571838378906 + 0.07500000298023224 -0.04997534304857254 -1.0086479187011719 0.07500000298023224 -0.052983708679676056 -1.0086479187011719 + + + 0.021213202961 + + + 1.1235058504 + + + + + + + + + + + + + + + + + + + + + + + + + 0 1 2 2 1 3 + 4 0 5 5 0 2 + 6 4 7 7 4 5 + 1 6 3 3 6 7 + 4 6 0 0 6 1 + 8 9 10 10 9 11 + 12 13 14 15 16 17 + 18 19 20 21 22 23 + 24 25 26 26 25 27 + 20 28 29 30 31 32 + 32 31 33 32 33 34 + 34 33 35 30 36 37 + 37 36 38 39 40 37 + 37 40 41 37 41 30 + 30 41 42 30 42 31 + 20 43 44 38 45 37 + 37 45 46 37 46 20 + 20 46 47 20 47 43 + 44 48 20 20 48 49 + 20 49 50 50 51 20 + 20 51 52 20 52 28 + 53 54 55 56 55 57 + 57 55 58 56 59 55 + 55 59 60 55 60 61 + 61 60 62 61 62 63 + 54 64 55 55 64 65 + 55 65 58 66 67 68 + 68 67 69 68 70 66 + 66 70 27 66 27 71 + 71 27 25 72 73 74 + 74 73 75 76 75 77 + 77 75 78 79 80 81 + 81 80 82 83 84 85 + 85 81 83 83 81 82 + 83 82 86 86 82 87 + 87 88 86 86 88 89 + 86 89 90 91 92 93 + 93 92 94 95 96 97 + 97 96 98 97 98 99 + 99 100 97 97 100 101 + 97 101 102 94 103 93 + 93 103 104 93 104 105 + 105 106 93 93 106 107 + 93 107 97 97 107 108 + 97 108 95 109 110 111 + 111 110 112 112 110 113 + 112 113 93 93 113 114 + 93 114 91 115 116 117 + 117 116 118 119 97 120 + 120 97 121 120 121 122 + 122 121 123 124 93 125 + 125 93 97 125 97 126 + 126 97 119 29 24 20 + 20 24 26 20 26 18 + 18 26 127 18 127 128 + 129 130 131 128 127 131 + 131 127 132 131 132 129 + 130 133 131 131 133 134 + 131 134 135 136 137 138 + 138 137 139 138 139 140 + 140 141 138 138 141 142 + 138 142 143 143 144 138 + 138 144 145 138 145 146 + 146 145 147 148 149 150 + 150 149 151 150 151 152 + 153 154 152 152 154 155 + 152 155 150 156 157 158 + 156 159 157 157 159 160 + 157 160 161 158 162 156 + 156 162 163 156 163 164 + 164 163 165 22 166 23 + 23 166 167 23 167 168 + 168 167 169 170 171 167 + 167 171 172 167 172 169 + 173 174 170 170 174 175 + 176 177 178 175 179 170 + 170 179 180 170 180 171 + 177 181 178 178 181 182 + 178 182 183 183 184 178 + 178 184 185 178 185 170 + 170 185 186 170 186 173 + 187 188 178 178 188 189 + 178 189 176 17 190 191 + 191 190 192 191 192 193 + 193 194 191 191 194 195 + 191 195 187 187 195 196 + 187 196 188 16 197 17 + 17 197 198 17 198 190 + 199 200 201 200 199 202 + 202 199 203 202 203 204 + 205 206 207 208 209 210 + 168 211 23 23 211 212 + 23 212 210 210 212 213 + 210 213 208 214 215 163 + 216 217 218 219 220 221 + 221 222 223 220 224 221 + 221 224 225 221 225 226 + 226 227 221 221 227 228 + 221 228 222 229 230 218 + 218 230 231 218 217 214 + 214 217 232 214 232 215 + 215 232 233 215 233 234 + 223 235 221 221 235 236 + 221 236 163 163 236 237 + 163 237 214 231 238 218 + 218 238 239 218 239 216 + 234 233 240 240 233 241 + 240 241 242 242 241 243 + 242 243 244 245 246 242 + 242 246 247 248 249 250 + 250 249 251 252 251 253 + 253 251 254 255 256 229 + 229 256 257 229 257 258 + 258 259 229 229 259 260 + 229 260 261 261 262 229 + 229 262 263 229 263 264 + 264 265 229 229 265 266 + 229 266 230 242 267 268 + 255 269 256 256 269 270 + 256 270 271 271 270 272 + 244 273 242 242 273 274 + 242 274 267 268 275 242 + 242 275 276 242 276 245 + 247 277 242 242 277 278 + 242 278 279 279 278 280 + 279 280 281 281 282 279 + 279 282 283 279 283 284 + 219 221 285 285 221 286 + 285 286 287 288 289 187 + 187 289 290 291 292 293 + 293 292 294 293 294 295 + 295 294 296 297 298 299 + 299 298 300 300 298 294 + 294 298 301 294 301 296 + 302 303 304 304 303 305 + 306 307 308 302 309 303 + 303 309 310 303 310 311 + 312 313 308 308 313 314 + 315 316 308 308 316 317 + 308 317 306 311 318 303 + 303 318 319 303 319 320 + 307 321 308 308 321 322 + 308 322 312 323 324 325 + 325 324 85 325 85 326 + 326 85 84 327 328 326 + 326 328 329 326 329 325 + 330 331 74 74 331 332 + 332 333 74 74 333 334 + 74 334 335 84 72 326 + 326 72 74 326 74 336 + 336 74 335 336 337 326 + 326 337 338 326 338 339 + 340 341 74 74 341 342 + 74 342 330 339 343 326 + 326 343 344 326 344 327 + 345 111 346 345 346 347 + 76 348 75 75 348 109 + 75 109 74 74 109 111 + 74 111 340 340 111 345 + 349 350 61 61 350 351 + 352 353 354 355 356 55 + 55 356 357 55 357 358 + 353 359 354 354 359 360 + 354 360 361 362 363 61 + 61 363 364 61 364 55 + 55 364 365 55 365 355 + 361 366 354 354 366 367 + 354 367 61 61 367 368 + 61 368 349 351 369 61 + 61 369 370 61 370 362 + 371 14 372 373 374 346 + 346 374 375 346 375 354 + 354 375 376 354 376 352 + 372 377 371 371 377 378 + 371 378 379 13 380 14 + 14 380 381 14 381 372 + 358 382 55 55 382 383 + 55 383 136 383 384 136 + 136 384 385 136 385 137 + 137 385 386 137 386 387 + 387 386 388 387 388 389 + 323 305 324 324 305 303 + 324 303 390 390 303 391 + 390 391 19 102 79 97 + 97 79 81 97 81 121 + 121 81 392 121 392 393 + 393 392 394 393 394 395 + 395 394 396 395 396 215 + 215 396 397 215 397 163 + 163 397 398 163 398 165 + 399 400 391 391 400 401 + 19 391 20 20 391 401 + 20 401 37 37 401 402 + 37 402 403 320 315 303 + 303 315 308 303 308 391 + 391 308 403 391 403 399 + 399 403 402 393 404 121 + 121 404 115 121 115 123 + 123 115 117 405 406 395 + 395 406 393 393 406 407 + 393 407 404 404 407 408 + 404 408 409 234 248 215 + 215 248 250 215 250 395 + 395 250 409 395 409 405 + 405 409 408 314 347 308 + 308 347 346 308 346 403 + 403 346 354 403 354 37 + 37 354 61 37 61 39 + 39 61 63 252 410 251 + 251 410 288 251 288 250 + 250 288 187 250 187 409 + 409 187 178 409 178 404 + 404 178 170 404 170 115 + 115 170 167 115 167 116 + 116 167 166 112 411 111 + 111 411 412 111 412 346 + 346 412 371 346 371 373 + 373 371 379 138 413 136 + 136 413 68 136 68 55 + 55 68 69 55 69 53 + 414 12 415 415 12 14 + 415 14 416 416 14 371 + 416 371 417 417 371 412 + 417 412 418 418 412 411 + 418 411 419 419 411 112 + 419 112 420 420 112 93 + 420 93 421 421 93 124 + 421 124 422 209 205 210 + 210 205 207 210 207 23 + 23 207 423 23 423 21 + 21 423 418 21 418 424 + 424 418 419 191 425 17 + 17 425 426 17 426 15 + 15 426 427 291 293 428 + 428 293 287 428 287 290 + 290 287 286 290 286 187 + 187 286 429 187 429 191 + 191 429 430 191 430 425 + 162 431 163 163 431 432 + 163 432 221 221 432 433 + 221 433 286 286 433 434 + 286 434 429 429 434 148 + 429 148 430 430 148 150 + 430 150 435 206 204 207 + 207 204 203 207 203 423 + 423 203 436 423 436 418 + 418 436 437 418 437 417 + 417 437 438 417 438 416 + 416 438 439 416 439 415 + 415 439 387 415 387 414 + 414 387 389 435 440 430 + 430 440 441 430 441 425 + 425 441 442 425 442 426 + 426 442 199 426 199 427 + 427 199 201 149 148 443 + 443 148 434 443 434 433 + 162 444 431 431 444 443 + 431 443 432 432 443 433 + 436 203 445 139 137 446 + 446 137 387 203 199 445 + 445 199 442 445 442 441 + 387 439 446 446 439 438 + 446 438 445 445 438 437 + 445 437 436 447 127 26 + 447 26 448 448 26 27 + 448 27 70 70 68 448 + 448 68 413 448 413 138 + 398 397 449 449 397 396 + 449 396 394 394 392 449 + 449 392 81 449 81 450 + 450 81 85 450 85 324 + 324 390 450 450 390 19 + 450 19 18 451 446 448 + 452 443 453 448 446 447 + 454 455 444 444 455 449 + 444 449 443 456 457 448 + 444 458 454 454 458 459 + 454 459 460 460 461 454 + 454 461 462 454 462 463 + 453 443 445 445 443 449 + 445 449 446 446 449 450 + 446 450 447 447 450 464 + 447 464 465 457 466 448 + 448 466 467 448 467 451 + 468 469 453 453 469 470 + 453 470 471 471 472 453 + 453 472 473 453 473 452 + 474 475 465 465 475 476 + 465 476 447 456 448 477 + 477 448 478 477 478 479 + 480 481 465 465 481 482 + 465 482 474 421 422 483 + 484 424 419 484 419 483 + 483 419 420 483 420 421 + 484 485 424 424 485 21 + 486 118 116 21 485 22 + 22 485 486 22 486 166 + 166 486 116 486 487 118 + 118 487 117 487 488 117 + 117 488 123 488 489 123 + 123 489 122 489 490 122 + 122 490 120 490 491 120 + 120 491 119 491 492 119 + 119 492 126 492 493 126 + 126 493 125 493 494 125 + 125 494 124 494 483 124 + 124 483 422 488 487 489 + 489 487 486 494 493 483 + 483 493 492 491 490 492 + 492 490 489 492 489 483 + 483 489 486 483 486 484 + 484 486 485 495 200 202 + 495 202 496 496 202 204 + 496 204 497 497 204 206 + 497 206 498 498 206 205 + 498 205 499 499 205 209 + 499 209 500 500 209 208 + 500 208 501 501 208 213 + 501 213 502 502 213 212 + 502 212 503 503 212 211 + 503 211 504 504 211 168 + 504 168 505 506 195 194 + 506 194 507 507 194 193 + 507 193 508 508 193 192 + 508 192 509 509 192 190 + 509 190 510 510 190 198 + 510 198 511 511 198 197 + 511 197 512 512 197 16 + 512 16 513 513 16 15 + 513 15 514 514 15 427 + 514 427 515 515 427 201 + 515 201 516 516 201 200 + 516 200 495 517 185 184 + 517 184 518 518 184 183 + 518 183 519 519 183 182 + 519 182 520 520 182 181 + 520 181 521 521 181 177 + 521 177 522 522 177 176 + 522 176 523 523 176 189 + 523 189 524 524 189 188 + 524 188 525 525 188 196 + 525 196 526 526 196 195 + 526 195 506 505 168 169 + 505 169 527 527 169 172 + 527 172 528 528 172 171 + 528 171 529 529 171 180 + 529 180 530 530 180 179 + 530 179 531 531 179 175 + 531 175 532 532 175 174 + 532 174 533 533 174 173 + 533 173 534 534 173 186 + 534 186 535 535 186 185 + 535 185 517 509 510 527 + 527 510 511 527 511 512 + 526 506 518 518 506 507 + 518 507 517 517 507 535 + 513 504 512 512 504 505 + 512 505 527 507 528 529 + 529 530 507 507 530 531 + 507 531 532 528 507 527 + 527 507 508 527 508 509 + 500 501 496 496 501 502 + 532 533 507 507 533 534 + 507 534 535 518 519 526 + 526 519 520 526 520 525 + 525 520 524 524 520 523 + 523 520 521 523 521 522 + 513 514 504 504 514 515 + 504 515 516 502 503 496 + 496 503 504 496 504 495 + 495 504 516 497 498 496 + 496 498 499 496 499 500 + 536 537 407 407 537 408 + 537 538 408 408 538 405 + 538 539 405 405 539 406 + 539 536 406 406 536 407 + 539 538 536 536 538 537 + 540 541 248 248 541 249 + 541 542 249 249 542 251 + 542 543 251 251 543 254 + 544 290 289 544 289 545 + 545 289 288 545 288 546 + 546 288 410 546 410 547 + 547 410 252 547 252 548 + 548 252 253 548 253 549 + 549 253 254 549 254 543 + 550 297 299 550 299 551 + 551 299 300 551 300 552 + 552 300 294 552 294 553 + 553 294 292 553 292 554 + 554 292 291 554 291 555 + 555 291 428 555 428 556 + 556 428 290 556 290 544 + 557 287 293 557 293 558 + 558 293 295 558 295 559 + 559 295 296 559 296 560 + 560 296 301 560 301 561 + 561 301 298 561 298 562 + 562 298 297 562 297 550 + 563 236 235 563 235 564 + 564 235 223 564 223 565 + 565 223 222 565 222 566 + 566 222 228 566 228 567 + 567 228 227 567 227 568 + 568 227 226 568 226 569 + 569 226 225 569 225 570 + 570 225 224 570 224 571 + 571 224 220 571 220 572 + 572 220 219 572 219 573 + 573 219 285 573 285 574 + 574 285 287 574 287 557 + 563 575 236 236 575 237 + 575 576 237 237 576 214 + 576 577 214 214 577 218 + 578 260 259 578 259 579 + 579 259 258 579 258 580 + 580 258 257 580 257 581 + 581 257 256 581 256 582 + 582 256 271 582 271 583 + 583 271 272 583 272 584 + 584 272 270 584 270 585 + 585 270 269 585 269 586 + 586 269 255 586 255 587 + 587 255 229 587 229 588 + 588 229 218 588 218 577 + 589 217 216 589 216 590 + 590 216 239 590 239 591 + 591 239 238 591 238 592 + 592 238 231 592 231 593 + 593 231 230 593 230 594 + 594 230 266 594 266 595 + 595 266 265 595 265 596 + 596 265 264 596 264 597 + 597 264 263 597 263 598 + 598 263 262 598 262 599 + 599 262 261 599 261 600 + 600 261 260 600 260 578 + 589 601 217 217 601 232 + 601 602 232 232 602 233 + 602 603 233 233 603 241 + 604 247 246 604 246 605 + 605 246 245 605 245 606 + 606 245 276 606 276 607 + 607 276 275 607 275 608 + 608 275 268 608 268 609 + 609 268 267 609 267 610 + 610 267 274 610 274 611 + 611 274 273 611 273 612 + 612 273 244 612 244 613 + 613 244 243 613 243 614 + 614 243 241 614 241 603 + 615 240 242 615 242 616 + 616 242 279 616 279 617 + 617 279 284 617 284 618 + 618 284 283 618 283 619 + 619 283 282 619 282 620 + 620 282 281 620 281 621 + 621 281 280 621 280 622 + 622 280 278 622 278 623 + 623 278 277 623 277 624 + 624 277 247 624 247 604 + 615 625 240 240 625 234 + 625 540 234 234 540 248 + 542 541 543 543 541 540 + 543 618 619 610 611 550 + 550 611 612 550 612 613 + 601 589 550 550 589 590 + 550 590 591 568 584 585 + 625 615 540 540 615 616 + 540 616 543 543 616 617 + 543 617 618 591 592 550 + 550 592 593 550 593 594 + 568 569 584 584 569 570 + 584 570 583 583 570 571 + 583 571 582 582 571 572 + 582 572 581 581 572 573 + 581 573 580 580 573 574 + 580 574 579 579 574 557 + 579 557 578 578 557 558 + 578 558 600 600 558 559 + 600 559 599 599 559 560 + 599 560 598 598 560 561 + 598 561 597 597 561 562 + 597 562 596 596 562 550 + 596 550 595 595 550 594 + 602 601 603 603 601 550 + 603 550 614 614 550 613 + 619 620 543 543 620 621 + 543 621 549 549 621 622 + 549 622 548 548 622 623 + 548 623 547 547 623 624 + 547 624 546 546 624 604 + 546 604 545 545 604 605 + 545 605 544 544 605 606 + 544 606 556 556 606 607 + 576 575 577 577 575 563 + 577 563 588 588 563 564 + 588 564 587 587 564 565 + 587 565 586 586 565 566 + 586 566 585 585 566 567 + 585 567 568 550 551 610 + 610 551 552 610 552 609 + 609 552 553 609 553 608 + 608 553 554 608 554 607 + 607 554 555 607 555 556 + 626 627 73 73 627 75 + 627 628 75 75 628 78 + 629 110 109 629 109 630 + 630 109 348 630 348 631 + 631 348 76 631 76 632 + 632 76 77 632 77 633 + 633 77 78 633 78 628 + 634 107 106 634 106 635 + 635 106 105 635 105 636 + 636 105 104 636 104 637 + 637 104 103 637 103 638 + 638 103 94 638 94 639 + 639 94 92 639 92 640 + 640 92 91 640 91 641 + 641 91 114 641 114 642 + 642 114 113 642 113 643 + 643 113 110 643 110 629 + 644 80 79 644 79 645 + 645 79 102 645 102 646 + 646 102 101 646 101 647 + 647 101 100 647 100 648 + 648 100 99 648 99 649 + 649 99 98 649 98 650 + 650 98 96 650 96 651 + 651 96 95 651 95 652 + 652 95 108 652 108 653 + 653 108 107 653 107 634 + 654 90 89 654 89 655 + 655 89 88 655 88 656 + 656 88 87 656 87 657 + 657 87 82 657 82 658 + 658 82 80 658 80 644 + 90 654 86 86 654 659 + 86 659 83 659 660 83 + 83 660 84 626 73 660 + 660 73 72 660 72 84 + 628 627 626 660 659 654 + 661 662 654 662 663 654 + 654 663 664 654 664 665 + 661 654 666 666 654 655 + 666 655 667 667 655 656 + 667 656 668 668 656 657 + 668 657 669 665 670 654 + 654 670 626 654 626 660 + 671 672 628 628 672 673 + 657 658 669 669 658 644 + 669 644 674 674 644 645 + 674 645 675 675 645 646 + 675 646 676 676 646 647 + 676 647 677 677 647 648 + 677 648 678 678 648 649 + 678 649 679 679 649 650 + 679 650 680 680 650 651 + 670 681 626 626 681 682 + 626 682 628 628 682 683 + 628 683 671 673 684 628 + 628 684 685 628 685 633 + 633 685 686 633 686 632 + 632 686 687 632 687 631 + 631 687 688 631 688 630 + 630 688 689 630 689 629 + 629 689 690 629 690 643 + 643 690 691 643 691 642 + 642 691 692 642 692 641 + 641 692 693 641 693 640 + 640 693 694 640 694 639 + 639 694 695 639 695 638 + 638 695 696 638 696 637 + 637 696 697 637 697 636 + 636 697 698 636 698 635 + 635 698 699 635 699 634 + 634 699 700 634 700 653 + 653 700 701 653 701 652 + 652 701 702 652 702 651 + 651 702 703 651 703 680 + 689 704 705 689 705 690 + 690 705 706 690 706 691 + 691 706 707 691 707 692 + 692 707 708 692 708 693 + 693 708 709 693 709 694 + 694 709 710 694 710 695 + 695 710 711 695 711 696 + 696 711 712 696 712 697 + 697 712 713 697 713 698 + 698 713 714 698 714 699 + 699 714 715 699 715 700 + 700 715 716 700 716 701 + 701 716 717 701 717 702 + 702 717 718 702 718 703 + 703 718 719 703 719 680 + 680 719 720 680 720 679 + 679 720 721 679 721 678 + 678 721 722 678 722 677 + 677 722 723 677 723 676 + 676 723 724 676 724 675 + 675 724 725 675 725 674 + 674 725 726 674 726 669 + 669 726 727 669 727 668 + 668 727 728 668 728 667 + 667 728 729 667 729 666 + 666 729 730 666 730 661 + 661 730 731 661 731 662 + 662 731 732 662 732 663 + 663 732 733 663 733 664 + 664 733 734 664 734 665 + 665 734 735 665 735 670 + 670 735 736 670 736 681 + 681 736 737 681 737 682 + 682 737 738 682 738 683 + 683 738 739 683 739 671 + 671 739 740 671 740 672 + 672 740 741 672 741 673 + 673 741 742 673 742 684 + 684 742 743 684 743 685 + 685 743 744 685 744 686 + 686 744 745 686 745 687 + 687 745 746 687 746 688 + 688 746 704 688 704 689 + 747 345 347 747 347 748 + 748 347 314 748 314 749 + 749 314 313 749 313 750 + 750 313 312 750 312 751 + 751 312 322 751 322 752 + 753 336 335 753 335 754 + 754 335 334 754 334 755 + 755 334 333 755 333 756 + 756 333 332 756 332 757 + 757 332 331 757 331 758 + 758 331 330 758 330 759 + 759 330 342 759 342 760 + 760 342 341 760 341 761 + 761 341 340 761 340 762 + 762 340 345 762 345 747 + 763 323 325 763 325 764 + 764 325 329 764 329 765 + 765 329 328 765 328 766 + 766 328 327 766 327 767 + 767 327 344 767 344 768 + 768 344 343 768 343 769 + 769 343 339 769 339 770 + 770 339 338 770 338 771 + 771 338 337 771 337 772 + 772 337 336 772 336 753 + 773 315 320 773 320 774 + 774 320 319 774 319 775 + 775 319 318 775 318 776 + 776 318 311 776 311 777 + 777 311 310 777 310 778 + 778 310 309 778 309 779 + 779 309 302 779 302 780 + 780 302 304 780 304 781 + 781 304 305 781 305 782 + 782 305 323 782 323 763 + 752 322 321 752 321 783 + 783 321 307 783 307 784 + 784 307 306 784 306 785 + 785 306 317 785 317 786 + 786 317 316 786 316 787 + 787 316 315 787 315 773 + 773 788 787 787 788 789 + 787 789 786 786 789 790 + 786 790 785 785 790 784 + 784 790 791 784 791 783 + 783 791 792 783 792 752 + 752 792 793 752 793 751 + 751 793 794 751 794 750 + 750 794 795 750 795 749 + 749 795 796 749 796 748 + 748 796 797 748 797 747 + 747 797 798 747 798 762 + 762 798 799 762 799 761 + 761 799 800 761 800 760 + 760 800 801 760 801 759 + 759 801 802 759 802 758 + 758 802 803 758 803 757 + 757 803 804 757 804 756 + 756 804 805 756 805 755 + 755 805 806 755 806 754 + 754 806 807 754 807 753 + 753 807 808 753 808 772 + 772 808 809 772 809 771 + 771 809 810 771 810 770 + 770 810 811 770 811 769 + 769 811 812 769 812 768 + 768 812 813 768 813 767 + 767 813 814 767 814 766 + 766 814 815 766 815 765 + 765 815 816 765 816 764 + 764 816 817 764 817 763 + 763 817 818 763 818 782 + 782 818 819 782 819 781 + 781 819 820 781 820 780 + 780 820 821 780 821 779 + 779 821 822 779 822 778 + 778 822 823 778 823 777 + 777 823 824 777 824 776 + 776 824 825 776 825 775 + 775 825 826 775 826 774 + 774 826 827 774 827 773 + 773 827 828 773 828 788 + 798 829 830 798 830 799 + 799 830 831 799 831 800 + 800 831 832 800 832 801 + 801 832 833 801 833 802 + 802 833 834 802 834 803 + 803 834 835 803 835 804 + 804 835 836 804 836 805 + 805 836 837 805 837 806 + 806 837 838 806 838 807 + 807 838 839 807 839 808 + 808 839 840 808 840 809 + 809 840 841 809 841 810 + 810 841 842 810 842 811 + 811 842 843 811 843 812 + 812 843 844 812 844 813 + 813 844 845 813 845 814 + 814 845 846 814 846 815 + 815 846 847 815 847 816 + 816 847 848 816 848 817 + 817 848 849 817 849 818 + 818 849 850 818 850 819 + 819 850 851 819 851 820 + 820 851 852 820 852 821 + 821 852 853 821 853 822 + 822 853 854 822 854 823 + 823 854 855 823 855 824 + 824 855 856 824 856 825 + 825 856 857 825 857 826 + 826 857 858 826 858 827 + 827 858 859 827 859 828 + 828 859 860 828 860 788 + 788 860 861 788 861 789 + 789 861 862 789 862 790 + 790 862 863 790 863 791 + 791 863 864 791 864 792 + 792 864 865 792 865 793 + 793 865 866 793 866 794 + 794 866 867 794 867 795 + 795 867 868 795 868 796 + 796 868 869 796 869 797 + 797 869 829 797 829 798 + 870 871 401 401 871 402 + 871 872 402 402 872 399 + 872 873 399 399 873 400 + 873 870 400 400 870 401 + 873 872 870 870 872 871 + 874 388 386 874 386 875 + 875 386 385 875 385 876 + 876 385 384 876 384 877 + 877 384 383 877 383 878 + 878 383 382 878 382 879 + 879 382 358 879 358 880 + 880 358 357 880 357 881 + 881 357 356 881 356 882 + 882 356 355 882 355 883 + 883 355 365 883 365 884 + 885 373 379 885 379 886 + 886 379 378 886 378 887 + 887 378 377 887 377 888 + 888 377 372 888 372 889 + 889 372 381 889 381 890 + 890 381 380 890 380 891 + 891 380 13 891 13 892 + 892 13 12 892 12 893 + 893 12 414 893 414 894 + 894 414 389 894 389 895 + 895 389 388 895 388 874 + 896 367 366 896 366 897 + 897 366 361 897 361 898 + 898 361 360 898 360 899 + 899 360 359 899 359 900 + 900 359 353 900 353 901 + 901 353 352 901 352 902 + 902 352 376 902 376 903 + 903 376 375 903 375 904 + 904 375 374 904 374 905 + 905 374 373 905 373 885 + 884 365 364 884 364 906 + 906 364 363 906 363 907 + 907 363 362 907 362 908 + 908 362 370 908 370 909 + 909 370 369 909 369 910 + 910 369 351 910 351 911 + 911 351 350 911 350 912 + 912 350 349 912 349 913 + 913 349 368 913 368 914 + 914 368 367 914 367 896 + 888 889 906 906 889 890 + 906 890 891 905 885 897 + 897 885 886 897 886 896 + 896 886 914 892 883 891 + 891 883 884 891 884 906 + 886 907 908 908 909 886 + 886 909 910 886 910 911 + 907 886 906 906 886 887 + 906 887 888 879 880 875 + 875 880 881 911 912 886 + 886 912 913 886 913 914 + 897 898 905 905 898 899 + 905 899 904 904 899 903 + 903 899 902 902 899 900 + 902 900 901 892 893 883 + 883 893 894 883 894 895 + 881 882 875 875 882 883 + 875 883 874 874 883 895 + 876 877 875 875 877 878 + 875 878 879 915 916 24 + 24 916 25 25 916 71 + 71 916 917 71 917 66 + 66 917 67 917 918 67 + 67 918 69 919 64 54 + 919 54 920 920 54 53 + 920 53 921 921 53 69 + 921 69 918 922 39 63 + 922 63 923 923 63 62 + 923 62 924 924 62 60 + 924 60 925 925 60 59 + 925 59 926 926 59 56 + 926 56 927 927 56 57 + 927 57 928 928 57 58 + 928 58 929 929 58 65 + 929 65 930 930 65 64 + 930 64 919 931 35 33 + 931 33 932 932 33 31 + 932 31 933 933 31 42 + 933 42 934 934 42 41 + 934 41 935 935 41 40 + 935 40 936 936 40 39 + 936 39 922 937 47 46 + 937 46 938 938 46 45 + 938 45 939 939 45 38 + 939 38 940 940 38 36 + 940 36 941 941 36 30 + 941 30 942 942 30 32 + 942 32 943 943 32 34 + 943 34 944 944 34 35 + 944 35 931 915 24 29 + 915 29 945 945 29 28 + 945 28 946 946 28 52 + 946 52 947 947 52 51 + 947 51 948 948 51 50 + 948 50 949 949 50 49 + 949 49 950 950 49 48 + 950 48 951 951 48 44 + 951 44 952 952 44 43 + 952 43 953 953 43 47 + 953 47 937 954 955 917 + 956 957 931 931 957 958 + 931 958 959 929 960 928 + 928 960 961 928 961 927 + 927 961 962 927 962 926 + 926 962 925 925 962 963 + 925 963 924 924 963 964 + 924 964 923 923 964 965 + 923 965 922 922 965 966 + 922 966 936 959 967 931 + 931 967 968 931 968 944 + 944 968 969 944 969 943 + 943 969 970 943 970 942 + 942 970 971 942 971 941 + 941 971 972 941 972 940 + 940 972 973 940 973 939 + 939 973 974 939 974 938 + 938 974 975 938 975 937 + 937 975 976 937 976 953 + 953 976 977 953 977 952 + 952 977 978 952 978 951 + 951 978 979 951 979 950 + 950 979 980 950 980 949 + 949 980 981 949 981 948 + 948 981 982 948 982 947 + 947 982 983 947 983 946 + 946 983 984 946 984 945 + 945 984 985 945 985 915 + 915 985 986 915 986 916 + 916 986 987 916 987 956 + 936 966 935 935 966 988 + 935 988 934 934 988 989 + 934 989 933 933 989 990 + 933 990 932 932 990 991 + 932 991 931 931 991 992 + 931 992 993 993 994 931 + 931 994 995 931 995 956 + 956 995 996 956 996 997 + 917 955 918 918 955 998 + 918 998 921 921 998 999 + 921 999 920 920 999 1000 + 920 1000 919 919 1000 1001 + 919 1001 930 930 1001 1002 + 930 1002 929 929 1002 1003 + 929 1003 960 917 916 954 + 954 916 956 954 956 1004 + 1004 956 997 998 955 1005 + 1005 955 1006 998 1005 1007 + 998 1007 999 999 1007 1008 + 999 1008 1000 1000 1008 1009 + 1000 1009 1001 1001 1009 1010 + 1001 1010 1002 1002 1010 1011 + 1002 1011 1003 1003 1011 1012 + 1003 1012 960 960 1012 1013 + 960 1013 961 961 1013 1014 + 961 1014 962 962 1014 1015 + 962 1015 963 963 1015 1016 + 963 1016 964 964 1016 1017 + 964 1017 965 965 1017 1018 + 965 1018 966 966 1018 1019 + 966 1019 988 988 1019 1020 + 988 1020 989 989 1020 1021 + 989 1021 990 990 1021 1022 + 990 1022 991 991 1022 1023 + 991 1023 992 992 1023 1024 + 992 1024 993 993 1024 1025 + 993 1025 994 994 1025 1026 + 994 1026 995 995 1026 1027 + 995 1027 996 996 1027 1028 + 996 1028 997 997 1028 1029 + 997 1029 1004 954 1004 1030 + 1030 1004 1029 955 954 1006 + 1006 954 1030 957 956 1031 + 1031 956 1032 957 1031 1033 + 957 1033 958 958 1033 1034 + 958 1034 959 959 1034 1035 + 959 1035 967 967 1035 1036 + 967 1036 968 968 1036 1037 + 968 1037 969 969 1037 1038 + 969 1038 970 970 1038 1039 + 970 1039 971 971 1039 1040 + 971 1040 972 972 1040 1041 + 972 1041 973 973 1041 1042 + 973 1042 974 974 1042 1043 + 974 1043 975 975 1043 1044 + 975 1044 976 976 1044 1045 + 976 1045 977 977 1045 1046 + 977 1046 978 978 1046 1047 + 978 1047 979 979 1047 1048 + 979 1048 980 980 1048 1049 + 980 1049 981 981 1049 1050 + 981 1050 982 982 1050 1051 + 982 1051 983 983 1051 1052 + 983 1052 984 984 1052 1053 + 984 1053 985 985 1053 1054 + 985 1054 986 987 986 1055 + 1055 986 1054 956 987 1032 + 1032 987 1055 1006 1030 1005 + 1005 1030 1029 1005 1029 1007 + 1012 1011 1029 1029 1011 1010 + 1028 1019 1029 1029 1019 1018 + 1010 1009 1029 1029 1009 1008 + 1029 1008 1007 1018 1017 1029 + 1029 1017 1016 1029 1016 1015 + 1028 1027 1019 1019 1027 1026 + 1019 1026 1025 1015 1014 1029 + 1029 1014 1013 1029 1013 1012 + 1025 1024 1019 1019 1024 1023 + 1019 1023 1020 1020 1023 1022 + 1020 1022 1021 722 721 736 + 736 721 720 736 720 737 + 720 719 737 737 719 718 + 737 718 717 717 716 737 + 737 716 715 737 715 714 + 737 742 741 714 713 737 + 737 713 712 737 712 711 + 711 710 737 737 710 709 + 737 709 708 708 707 737 + 737 707 706 737 706 705 + 705 704 737 737 704 746 + 737 746 745 745 744 737 + 737 744 743 737 743 742 + 740 739 741 741 739 738 + 741 738 737 727 735 734 + 735 727 736 736 727 726 + 736 726 725 729 732 730 + 730 732 731 734 733 727 + 727 733 732 727 732 728 + 728 732 729 725 724 736 + 736 724 723 736 723 722 + 860 859 839 868 867 839 + 839 864 863 851 839 852 + 852 839 853 867 866 839 + 839 866 865 839 865 864 + 859 858 839 839 858 857 + 839 857 856 831 830 838 + 838 830 829 838 829 839 + 839 829 869 839 869 868 + 863 862 839 839 862 861 + 839 861 860 850 841 851 + 851 841 840 851 840 839 + 856 855 839 839 855 854 + 839 854 853 845 844 846 + 846 844 847 850 849 841 + 841 849 848 841 848 842 + 842 848 847 842 847 843 + 843 847 844 834 833 838 + 838 833 832 838 832 831 + 834 838 835 835 838 837 + 835 837 836 1032 1055 1031 + 1031 1055 1054 1035 1034 1054 + 1054 1034 1033 1054 1033 1031 + 1041 1054 1042 1042 1054 1043 + 1054 1053 1043 1043 1053 1052 + 1043 1052 1051 1041 1040 1054 + 1054 1040 1039 1054 1039 1038 + 1051 1050 1043 1043 1050 1049 + 1043 1049 1044 1049 1048 1047 + 1038 1037 1054 1054 1037 1036 + 1054 1036 1035 1047 1046 1049 + 1049 1046 1045 1049 1045 1044 + 398 449 455 398 455 165 + 165 455 454 165 454 164 + 164 454 463 164 463 156 + 156 463 462 156 462 159 + 159 462 461 159 461 160 + 160 461 460 160 460 161 + 161 460 459 161 459 157 + 157 459 458 157 458 158 + 158 458 444 158 444 162 + 127 447 476 127 476 132 + 132 476 475 132 475 129 + 129 475 474 129 474 130 + 130 474 482 130 482 133 + 133 482 481 133 481 134 + 134 481 480 134 480 135 + 135 480 465 135 465 131 + 131 465 464 131 464 128 + 128 464 450 128 450 18 + 139 446 451 139 451 140 + 140 451 467 140 467 141 + 141 467 466 141 466 142 + 142 466 457 142 457 143 + 143 457 456 143 456 144 + 144 456 477 144 477 145 + 145 477 479 145 479 147 + 147 479 478 147 478 146 + 146 478 448 146 448 138 + 149 443 452 149 452 151 + 151 452 473 151 473 152 + 152 473 472 152 472 153 + 153 472 471 153 471 154 + 154 471 470 154 470 155 + 155 470 469 155 469 150 + 150 469 468 150 468 435 + 435 468 453 435 453 440 + 440 453 445 440 445 441 + + + 3 6 9 12 15 18 + 21 24 27 30 33 36 + 39 42 45 48 51 54 + 57 60 63 66 69 72 + 75 78 81 84 87 90 + 93 96 99 102 105 108 + 111 114 117 120 123 126 + 129 132 135 138 141 144 + 147 150 153 156 159 162 + 165 168 171 174 177 180 + 183 186 189 192 195 198 + 201 204 207 210 213 216 + 219 222 225 228 231 234 + 237 240 243 246 249 252 + 255 258 261 264 267 270 + 273 276 279 282 285 288 + 291 294 297 300 303 306 + 309 312 315 318 321 324 + 327 330 333 336 339 342 + 345 348 351 354 357 360 + 363 366 369 372 375 378 + 381 384 387 390 393 396 + 399 402 405 408 411 414 + 417 420 423 426 429 432 + 435 438 441 444 447 450 + 453 456 459 462 465 468 + 471 474 477 480 483 486 + 489 492 495 498 501 504 + 507 510 513 516 519 522 + 525 528 531 534 537 540 + 543 546 549 552 555 558 + 561 564 567 570 573 576 + 579 582 585 588 591 594 + 597 600 603 606 609 612 + 615 618 621 624 627 630 + 633 636 639 642 645 648 + 651 654 657 660 663 666 + 669 672 675 678 681 684 + 687 690 693 696 699 702 + 705 708 711 714 717 720 + 723 726 729 732 735 738 + 741 744 747 750 753 756 + 759 762 765 768 771 774 + 777 780 783 786 789 792 + 795 798 801 804 807 810 + 813 816 819 822 825 828 + 831 834 837 840 843 846 + 849 852 855 858 861 864 + 867 870 873 876 879 882 + 885 888 891 894 897 900 + 903 906 909 912 915 918 + 921 924 927 930 933 936 + 939 942 945 948 951 954 + 957 960 963 966 969 972 + 975 978 981 984 987 990 + 993 996 999 1002 1005 1008 + 1011 1014 1017 1020 1023 1026 + 1029 1032 1035 1038 1041 1044 + 1047 1050 1053 1056 1059 1062 + 1065 1068 1071 1074 1077 1080 + 1083 1086 1089 1092 1095 1098 + 1101 1104 1107 1110 1113 1116 + 1119 1122 1125 1128 1131 1134 + 1137 1140 1143 1146 1149 1152 + 1155 1158 1161 1164 1167 1170 + 1173 1176 1179 1182 1185 1188 + 1191 1194 1197 1200 1203 1206 + 1209 1212 1215 1218 1221 1224 + 1227 1230 1233 1236 1239 1242 + 1245 1248 1251 1254 1257 1260 + 1263 1266 1269 1272 1275 1278 + 1281 1284 1287 1290 1293 1296 + 1299 1302 1305 1308 1311 1314 + 1317 1320 1323 1326 1329 1332 + 1335 1338 1341 1344 1347 1350 + 1353 1356 1359 1362 1365 1368 + 1371 1374 1377 1380 1383 1386 + 1389 1392 1395 1398 1401 1404 + 1407 1410 1413 1416 1419 1422 + 1425 1428 1431 1434 1437 1440 + 1443 1446 1449 1452 1455 1458 + 1461 1464 1467 1470 1473 1476 + 1479 1482 1485 1488 1491 1494 + 1497 1500 1503 1506 1509 1512 + 1515 1518 1521 1524 1527 1530 + 1533 1536 1539 1542 1545 1548 + 1551 1554 1557 1560 1563 1566 + 1569 1572 1575 1578 1581 1584 + 1587 1590 1593 1596 1599 1602 + 1605 1608 1611 1614 1617 1620 + 1623 1626 1629 1632 1635 1638 + 1641 1644 1647 1650 1653 1656 + 1659 1662 1665 1668 1671 1674 + 1677 1680 1683 1686 1689 1692 + 1695 1698 1701 1704 1707 1710 + 1713 1716 1719 1722 1725 1728 + 1731 1734 1737 1740 1743 1746 + 1749 1752 1755 1758 1761 1764 + 1767 1770 1773 1776 1779 1782 + 1785 1788 1791 1794 1797 1800 + 1803 1806 1809 1812 1815 1818 + 1821 1824 1827 1830 1833 1836 + 1839 1842 1845 1848 1851 1854 + 1857 1860 1863 1866 1869 1872 + 1875 1878 1881 1884 1887 1890 + 1893 1896 1899 1902 1905 1908 + 1911 1914 1917 1920 1923 1926 + 1929 1932 1935 1938 1941 1944 + 1947 1950 1953 1956 1959 1962 + 1965 1968 1971 1974 1977 1980 + 1983 1986 1989 1992 1995 1998 + 2001 2004 2007 2010 2013 2016 + 2019 2022 2025 2028 2031 2034 + 2037 2040 2043 2046 2049 2052 + 2055 2058 2061 2064 2067 2070 + 2073 2076 2079 2082 2085 2088 + 2091 2094 2097 2100 2103 2106 + 2109 2112 2115 2118 2121 2124 + 2127 2130 2133 2136 2139 2142 + 2145 2148 2151 2154 2157 2160 + 2163 2166 2169 2172 2175 2178 + 2181 2184 2187 2190 2193 2196 + 2199 2202 2205 2208 2211 2214 + 2217 2220 2223 2226 2229 2232 + 2235 2238 2241 2244 2247 2250 + 2253 2256 2259 2262 2265 2268 + 2271 2274 2277 2280 2283 2286 + 2289 2292 2295 2298 2301 2304 + 2307 2310 2313 2316 2319 2322 + 2325 2328 2331 2334 2337 2340 + 2343 2346 2349 2352 2355 2358 + 2361 2364 2367 2370 2373 2376 + 2379 2382 2385 2388 2391 2394 + 2397 2400 2403 2406 2409 2412 + 2415 2418 2421 2424 2427 2430 + 2433 2436 2439 2442 2445 2448 + 2451 2454 2457 2460 2463 2466 + 2469 2472 2475 2478 2481 2484 + 2487 2490 2493 2496 2499 2502 + 2505 2508 2511 2514 2517 2520 + 2523 2526 2529 2532 2535 2538 + 2541 2544 2547 2550 2553 2556 + 2559 2562 2565 2568 2571 2574 + 2577 2580 2583 2586 2589 2592 + 2595 2598 2601 2604 2607 2610 + 2613 2616 2619 2622 2625 2628 + 2631 2634 2637 2640 2643 2646 + 2649 2652 2655 2658 2661 2664 + 2667 2670 2673 2676 2679 2682 + 2685 2688 2691 2694 2697 2700 + 2703 2706 2709 2712 2715 2718 + 2721 2724 2727 2730 2733 2736 + 2739 2742 2745 2748 2751 2754 + 2757 2760 2763 2766 2769 2772 + 2775 2778 2781 2784 2787 2790 + 2793 2796 2799 2802 2805 2808 + 2811 2814 2817 2820 2823 2826 + 2829 2832 2835 2838 2841 2844 + 2847 2850 2853 2856 2859 2862 + 2865 2868 2871 2874 2877 2880 + 2883 2886 2889 2892 2895 2898 + 2901 2904 2907 2910 2913 2916 + 2919 2922 2925 2928 2931 2934 + 2937 2940 2943 2946 2949 2952 + 2955 2958 2961 2964 2967 2970 + 2973 2976 2979 2982 2985 2988 + 2991 2994 2997 3000 3003 3006 + 3009 3012 3015 3018 3021 3024 + 3027 3030 3033 3036 3039 3042 + 3045 3048 3051 3054 3057 3060 + 3063 3066 3069 3072 3075 3078 + 3081 3084 3087 3090 3093 3096 + 3099 3102 3105 3108 3111 3114 + 3117 3120 3123 3126 3129 3132 + 3135 3138 3141 3144 3147 3150 + 3153 3156 3159 3162 3165 3168 + 3171 3174 3177 3180 3183 3186 + 3189 3192 3195 3198 3201 3204 + 3207 3210 3213 3216 3219 3222 + 3225 3228 3231 3234 3237 3240 + 3243 3246 3249 3252 3255 3258 + 3261 3264 3267 3270 3273 3276 + 3279 3282 3285 3288 3291 3294 + 3297 3300 3303 3306 3309 3312 + 3315 3318 3321 3324 3327 3330 + 3333 3336 3339 3342 3345 3348 + 3351 3354 3357 3360 3363 3366 + 3369 3372 3375 3378 3381 3384 + 3387 3390 3393 3396 3399 3402 + 3405 3408 3411 3414 3417 3420 + 3423 3426 3429 3432 3435 3438 + 3441 3444 3447 3450 3453 3456 + 3459 3462 3465 3468 3471 3474 + 3477 3480 3483 3486 3489 3492 + 3495 3498 3501 3504 3507 3510 + 3513 3516 3519 3522 3525 3528 + 3531 3534 3537 3540 3543 3546 + 3549 3552 3555 3558 3561 3564 + 3567 3570 3573 3576 3579 3582 + 3585 3588 3591 3594 3597 3600 + 3603 3606 3609 3612 3615 3618 + 3621 3624 3627 3630 3633 3636 + 3639 3642 3645 3648 3651 3654 + 3657 3660 3663 3666 3669 3672 + 3675 3678 3681 3684 3687 3690 + 3693 3696 3699 3702 3705 3708 + 3711 3714 3717 3720 3723 3726 + 3729 3732 3735 3738 3741 3744 + 3747 3750 3753 3756 3759 3762 + 3765 3768 3771 3774 3777 3780 + 3783 3786 3789 3792 3795 3798 + 3801 3804 3807 3810 3813 3816 + 3819 3822 3825 3828 3831 3834 + 3837 3840 3843 3846 3849 3852 + 3855 3858 3861 3864 3867 3870 + 3873 3876 3879 3882 3885 3888 + 3891 3894 3897 3900 3903 3906 + 3909 3912 3915 3918 3921 3924 + 3927 3930 3933 3936 3939 3942 + 3945 3948 3951 3954 3957 3960 + 3963 3966 3969 3972 3975 3978 + 3981 3984 3987 3990 3993 3996 + 3999 4002 4005 4008 4011 4014 + 4017 4020 4023 4026 4029 4032 + 4035 4038 4041 4044 4047 4050 + 4053 4056 4059 4062 4065 4068 + 4071 4074 4077 4080 4083 4086 + 4089 4092 4095 4098 4101 4104 + 4107 4110 4113 4116 4119 4122 + 4125 4128 4131 4134 4137 4140 + 4143 4146 4149 4152 4155 4158 + 4161 4164 4167 4170 4173 4176 + 4179 4182 4185 4188 4191 4194 + 4197 4200 4203 4206 4209 4212 + 4215 4218 4221 4224 4227 4230 + 4233 4236 4239 4242 4245 4248 + 4251 4254 4257 4260 4263 4266 + 4269 4272 4275 4278 4281 4284 + 4287 4290 4293 4296 4299 4302 + 4305 4308 4311 4314 4317 4320 + 4323 4326 4329 4332 4335 4338 + 4341 4344 4347 4350 4353 4356 + 4359 4362 4365 4368 4371 4374 + 4377 4380 4383 4386 4389 4392 + 4395 4398 4401 4404 4407 4410 + 4413 4416 4419 4422 4425 4428 + 4431 4434 4437 4440 4443 4446 + 4449 4452 4455 4458 4461 4464 + 4467 4470 4473 4476 4479 4482 + 4485 4488 4491 4494 4497 4500 + 4503 4506 4509 4512 4515 4518 + 4521 4524 4527 4530 4533 4536 + 4539 4542 4545 4548 4551 4554 + 4557 4560 4563 4566 4569 4572 + 4575 4578 4581 4584 4587 4590 + 4593 4596 4599 4602 4605 4608 + 4611 4614 4617 4620 4623 4626 + 4629 4632 4635 4638 4641 4644 + 4647 4650 4653 4656 4659 4662 + 4665 4668 4671 4674 4677 4680 + 4683 4686 4689 4692 4695 4698 + 4701 4704 4707 4710 4713 4716 + 4719 4722 4725 4728 4731 4734 + 4737 4740 4743 4746 4749 4752 + 4755 4758 4761 4764 4767 4770 + 4773 4776 4779 4782 4785 4788 + 4791 4794 4797 4800 4803 4806 + 4809 4812 4815 4818 4821 4824 + 4827 4830 4833 4836 4839 4842 + 4845 4848 4851 4854 4857 4860 + 4863 4866 4869 4872 4875 4878 + 4881 4884 4887 4890 4893 4896 + 4899 4902 4905 4908 4911 4914 + 4917 4920 4923 4926 4929 4932 + 4935 4938 4941 4944 4947 4950 + 4953 4956 4959 4962 4965 4968 + 4971 4974 4977 4980 4983 4986 + 4989 4992 4995 4998 5001 5004 + 5007 5010 5013 5016 5019 5022 + 5025 5028 5031 5034 5037 5040 + 5043 5046 5049 5052 5055 5058 + 5061 5064 5067 5070 5073 5076 + 5079 5082 5085 5088 5091 5094 + 5097 5100 5103 5106 5109 5112 + 5115 5118 5121 5124 5127 5130 + 5133 5136 5139 5142 5145 5148 + 5151 5154 5157 5160 5163 5166 + 5169 5172 5175 5178 5181 5184 + 5187 5190 5193 5196 5199 5202 + 5205 5208 5211 5214 5217 5220 + 5223 5226 5229 5232 5235 5238 + 5241 5244 5247 5250 5253 5256 + 5259 5262 5265 5268 5271 5274 + 5277 5280 5283 5286 5289 5292 + 5295 5298 5301 5304 5307 5310 + 5313 5316 5319 5322 5325 5328 + 5331 5334 5337 5340 5343 5346 + 5349 5352 5355 5358 5361 5364 + 5367 5370 5373 5376 5379 5382 + 5385 5388 5391 5394 5397 5400 + 5403 5406 5409 5412 5415 5418 + 5421 5424 5427 5430 5433 5436 + 5439 5442 5445 5448 5451 5454 + 5457 5460 5463 5466 5469 5472 + 5475 5478 5481 5484 5487 5490 + 5493 5496 5499 5502 5505 5508 + 5511 5514 5517 5520 5523 5526 + 5529 5532 5535 5538 5541 5544 + 5547 5550 5553 5556 5559 5562 + 5565 5568 5571 5574 5577 5580 + 5583 5586 5589 5592 5595 5598 + 5601 5604 5607 5610 5613 5616 + 5619 5622 5625 5628 5631 5634 + 5637 5640 5643 5646 5649 5652 + 5655 5658 5661 5664 5667 5670 + 5673 5676 5679 5682 5685 5688 + 5691 5694 5697 5700 5703 5706 + 5709 5712 5715 5718 5721 5724 + 5727 5730 5733 5736 5739 5742 + 5745 5748 5751 5754 5757 5760 + 5763 5766 5769 5772 5775 5778 + 5781 5784 5787 5790 5793 5796 + 5799 5802 5805 5808 5811 5814 + 5817 5820 5823 5826 5829 5832 + 5835 5838 5841 5844 5847 5850 + 5853 5856 5859 5862 5865 5868 + 5871 5874 5877 5880 5883 5886 + 5889 5892 5895 5898 5901 5904 + 5907 5910 5913 5916 5919 5922 + 5925 5928 5931 5934 5937 5940 + 5943 5946 5949 5952 5955 5958 + 5961 5964 5967 5970 5973 5976 + 5979 5982 5985 5988 5991 5994 + 5997 6000 6003 6006 6009 6012 + 6015 6018 6021 6024 6027 6030 + 6033 6036 6039 6042 6045 6048 + 6051 6054 6057 6060 6063 6066 + 6069 6072 6075 6078 6081 6084 + 6087 6090 6093 6096 6099 6102 + 6105 6108 6111 6114 6117 6120 + 6123 6126 6129 6132 6135 6138 + 6141 6144 6147 6150 6153 6156 + 6159 6162 6165 6168 6171 6174 + 6177 6180 6183 6186 6189 6192 + 6195 6198 6201 6204 6207 6210 + 6213 6216 6219 6222 6225 6228 + 6231 6234 6237 6240 6243 6246 + 6249 6252 6255 6258 6261 6264 + 6267 6270 6273 6276 6279 6282 + 6285 6288 + + + + + From 55cbe6e740efccfaafff51e00a6782d844fc06e9 Mon Sep 17 00:00:00 2001 From: Mac-eve Date: Tue, 11 Jul 2023 13:46:38 +0200 Subject: [PATCH 05/54] model --- bioptim/interfaces/biomodel.py | 5 +++++ bioptim/interfaces/biorbd_model.py | 27 +++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/bioptim/interfaces/biomodel.py b/bioptim/interfaces/biomodel.py index 27a068bb3..d4950b62c 100644 --- a/bioptim/interfaces/biomodel.py +++ b/bioptim/interfaces/biomodel.py @@ -6,6 +6,11 @@ class BioModel(Protocol): + """ + This protocol defines the minimal set of attributes and methods a model should possess to access every feature of + bioptim. + As a reminder for developers: only necessary attributes and methods should appear here. + """ def copy(self): """copy the model by reloading one""" diff --git a/bioptim/interfaces/biorbd_model.py b/bioptim/interfaces/biorbd_model.py index 10680f88d..b15ecaf9e 100644 --- a/bioptim/interfaces/biorbd_model.py +++ b/bioptim/interfaces/biorbd_model.py @@ -194,6 +194,15 @@ def center_of_mass_acceleration(self, q, qdot, qddot) -> MX: qddot_biorbd = GeneralizedAcceleration(qddot) return self.model.CoMddot(q_biorbd, qdot_biorbd, qddot_biorbd, True).to_mx() + def mass_matrix(self, q) -> MX: + q_biorbd = GeneralizedCoordinates(q) + return self.model.massMatrix(q_biorbd).to_mx() + + def non_linear_effects(self, q, qdot) -> MX: + q_biorbd = GeneralizedCoordinates(q) + qdot_biorbd = GeneralizedVelocity(qdot) + return self.model.NonLinearEffect(q_biorbd, qdot_biorbd).to_mx() + def angular_momentum(self, q, qdot) -> MX: q_biorbd = GeneralizedCoordinates(q) qdot_biorbd = GeneralizedVelocity(qdot) @@ -398,6 +407,9 @@ def rigid_contact_acceleration(self, q, qdot, qddot, contact_index, contact_axis contact_axis ] + def markers_jacobian(self, q) -> list[MX]: + return [m.to_mx() for m in self.model.markersJacobian(GeneralizedCoordinates(q))] + @property def nb_dof(self) -> int: return self.model.nbDof() @@ -685,6 +697,21 @@ def center_of_mass_acceleration(self, q, qdot, qddot) -> MX: ) return out + def mass_matrix(self, q) -> list[MX]: + out = [] + for i, model in enumerate(self.models): + q_model = q[self.variable_index("q", i)] + out += [model.mass_matrix(q_model)] + return out + + def non_linear_effects(self, q, qdot) -> list[MX]: + out = [] + for i, model in enumerate(self.models): + q_model = q[self.variable_index("q", i)] + qdot_model = qdot[self.variable_index("qdot", i)] + out += [model.non_linear_effects(q_model, qdot_model)] + return out + def angular_momentum(self, q, qdot) -> MX: out = MX() for i, model in enumerate(self.models): From 5c07c92d99701049cf6cc3d84303a433de2768ae Mon Sep 17 00:00:00 2001 From: Mac-eve Date: Tue, 11 Jul 2023 13:53:13 +0200 Subject: [PATCH 06/54] interface + solver_options --- bioptim/interfaces/biorbd_model.py | 2 +- bioptim/interfaces/interface_utils.py | 22 +++++++++++++++++----- bioptim/interfaces/solver_options.py | 8 ++++++++ 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/bioptim/interfaces/biorbd_model.py b/bioptim/interfaces/biorbd_model.py index b15ecaf9e..efb953e13 100644 --- a/bioptim/interfaces/biorbd_model.py +++ b/bioptim/interfaces/biorbd_model.py @@ -711,7 +711,7 @@ def non_linear_effects(self, q, qdot) -> list[MX]: qdot_model = qdot[self.variable_index("qdot", i)] out += [model.non_linear_effects(q_model, qdot_model)] return out - + def angular_momentum(self, q, qdot) -> MX: out = MX() for i, model in enumerate(self.models): diff --git a/bioptim/interfaces/interface_utils.py b/bioptim/interfaces/interface_utils.py index 5cbafc794..28f497572 100644 --- a/bioptim/interfaces/interface_utils.py +++ b/bioptim/interfaces/interface_utils.py @@ -223,6 +223,7 @@ def get_control_modificator(index): # Make an exception to the fact that U is not available for the last node _x = ocp.cx() _u = ocp.cx() + _s = ocp.cx() for i in range(len(_penalty.nodes_phase)): nlp_i = ocp.nlp[_penalty.nodes_phase[i]] index_i = _penalty.multinode_idx[i] @@ -238,11 +239,13 @@ def get_control_modificator(index): if ocp.assume_phase_dynamics or index_i < len(nlp_i.U_scaled) else [] ) + _s_tp = nlp_i.S[index_i] # 0th column since this constraint can only be applied to a single point. This is to account for # the COLLOCATION which will have multiple column, but are not intended to be used here _x = vertcat(_x, _x_tp[:, 0]) _u = vertcat(_u, _u_tp) + _s = vertcat(_s, _s_tp) elif _penalty.integrate: if is_unscaled: @@ -251,6 +254,7 @@ def get_control_modificator(index): else: _x = nlp.X_scaled[_idx] _u = nlp.U_scaled[_idx][:, 0] if _idx < len(nlp.U_scaled) else [] + _s = nlp.S[_idx] else: if is_unscaled: _x = nlp.X[_idx][:, 0] @@ -261,6 +265,7 @@ def get_control_modificator(index): _u = [] else: _u = nlp.U_scaled[_idx][:, 0] if _idx < len(nlp.U_scaled) else [] + _s = nlp.S[_idx][:, 0] if _penalty.derivative or _penalty.explicit_derivative: if _idx < nlp.ns: @@ -270,9 +275,11 @@ def get_control_modificator(index): else: x = nlp.X_scaled[_idx + 1][:, 0] u = nlp.U_scaled[_idx + 1][:, 0] if _idx + 1 < len(nlp.U_scaled) else [] + s = nlp.S[_idx + 1][:, 0] _x = horzcat(_x, x) _u = horzcat(_u, u) + _s = horzcat(_s, s) if _penalty.integration_rule == QuadratureRule.APPROXIMATE_TRAPEZOIDAL: if is_unscaled: @@ -286,6 +293,8 @@ def get_control_modificator(index): else: u = nlp.U_scaled[_idx + 1][:, 0] if _idx + 1 < len(nlp.U_scaled) else [] _u = horzcat(_u, u) + s = nlp.S[_idx + 1][:, 0] + _s = horzcat(_s, s) if _penalty.integration_rule == QuadratureRule.TRAPEZOIDAL: if nlp.control_type == ControlType.LINEAR_CONTINUOUS: @@ -294,7 +303,7 @@ def get_control_modificator(index): else: u = nlp.U_scaled[_idx + 1][:, 0] if _idx + 1 < len(nlp.U_scaled) else [] _u = horzcat(_u, u) - return _x, _u + return _x, _u, _s param = interface.ocp.cx(interface.ocp.parameters.cx) out = interface.ocp.cx() @@ -309,17 +318,19 @@ def get_control_modificator(index): x = nlp.cx() u = nlp.cx() + s = nlp.cx() for idx in penalty.node_idx: - x_tp, u_tp = get_x_and_u_at_idx(penalty, idx, is_unscaled) + x_tp, u_tp, s_tp = get_x_and_u_at_idx(penalty, idx, is_unscaled) x = horzcat(x, x_tp) u = horzcat(u, u_tp) + s = horzcat(s, s_tp) if ( penalty.derivative or penalty.explicit_derivative or penalty.node[0] == Node.ALL ) and nlp.control_type == ControlType.CONSTANT: u = horzcat(u, u[:, -1]) # We can call penalty.weighted_function[0] since multi-thread declares all the node at [0] - p = reshape(penalty.weighted_function[0](x, u, param, penalty.weight, target, penalty.dt), -1, 1) + p = reshape(penalty.weighted_function[0](x, u, param, s, penalty.weight, target, penalty.dt), -1, 1) else: p = interface.ocp.cx() @@ -342,9 +353,10 @@ def get_control_modificator(index): if not nlp: x = [] u = [] + s = [] else: - x, u = get_x_and_u_at_idx(penalty, idx, is_unscaled) - p = vertcat(p, penalty.weighted_function[idx](x, u, param, penalty.weight, target, penalty.dt)) + x, u, s = get_x_and_u_at_idx(penalty, idx, is_unscaled) + p = vertcat(p, penalty.weighted_function[idx](x, u, param, s, penalty.weight, target, penalty.dt)) out = vertcat(out, sum2(p)) return out diff --git a/bioptim/interfaces/solver_options.py b/bioptim/interfaces/solver_options.py index 451530b20..584c7b180 100644 --- a/bioptim/interfaces/solver_options.py +++ b/bioptim/interfaces/solver_options.py @@ -159,6 +159,7 @@ class IPOPT(Generic): _bound_frac: float = 0.01 _print_level: int = 5 _c_compile: bool = False + _nlp_scaling_method: str = "gradient-based" @property def tol(self): @@ -252,6 +253,10 @@ def print_level(self): def c_compile(self): return self._c_compile + @property + def nlp_scaling_method(self): + return self._nlp_scaling_method + def set_tol(self, val: float): self._tol = val @@ -321,6 +326,9 @@ def set_print_level(self, num: int): def set_c_compile(self, val: bool): self._c_compile = val + def set_nlp_scaling_method(self, val: str): + self._nlp_scaling_method = val + def set_convergence_tolerance(self, val: float): self._tol = val self._compl_inf_tol = val From ba924c0a398a470bc13a7b2fb9124af0eaa10dbf Mon Sep 17 00:00:00 2001 From: Mac-eve Date: Tue, 11 Jul 2023 13:58:21 +0200 Subject: [PATCH 07/54] penalty functions --- bioptim/limits/constraints.py | 3 +- bioptim/limits/multinode_constraint.py | 1 + bioptim/limits/multinode_penalty.py | 42 +++++++++++++++++++++++ bioptim/limits/objective_functions.py | 2 ++ bioptim/limits/penalty.py | 47 +++++++++++++++++++++++++- 5 files changed, 93 insertions(+), 2 deletions(-) diff --git a/bioptim/limits/constraints.py b/bioptim/limits/constraints.py index ef2557df1..a80f8a18f 100644 --- a/bioptim/limits/constraints.py +++ b/bioptim/limits/constraints.py @@ -1,7 +1,7 @@ from typing import Callable, Any import numpy as np -from casadi import sum1, if_else, vertcat, lt, SX, MX +from casadi import sum1, if_else, vertcat, lt, SX, MX, jacobian, Function, MX_eye, DM, horzcat from .path_conditions import Bounds from .penalty import PenaltyFunctionAbstract, PenaltyOption, PenaltyController @@ -619,6 +619,7 @@ def get_type() -> Callable TIME_CONSTRAINT = (ConstraintFunction.Functions.time_constraint,) TRACK_VECTOR_ORIENTATIONS_FROM_MARKERS = (PenaltyFunctionAbstract.Functions.track_vector_orientations_from_markers,) TRACK_PARAMETER = (PenaltyFunctionAbstract.Functions.minimize_parameter,) + COVARIANCE_MATRIX_CONINUITY_IMPLICIT = (PenaltyFunctionAbstract.Functions.covariance_matrix_continuity_implicit,) @staticmethod def get_type(): diff --git a/bioptim/limits/multinode_constraint.py b/bioptim/limits/multinode_constraint.py index 5ca2ffa04..a1b1c3563 100644 --- a/bioptim/limits/multinode_constraint.py +++ b/bioptim/limits/multinode_constraint.py @@ -100,6 +100,7 @@ class MultinodeConstraintFcn(FcnEnum): COM_EQUALITY = (MultinodeConstraintFunctions.Functions.com_equality,) COM_VELOCITY_EQUALITY = (MultinodeConstraintFunctions.Functions.com_velocity_equality,) TIME_CONSTRAINT = (MultinodeConstraintFunctions.Functions.time_equality,) + M_EQUALS_INVERSE_OF_DG_DZ = (MultinodeConstraintFunctions.Functions.m_equals_inverse_of_dg_dz,) @staticmethod def get_type(): diff --git a/bioptim/limits/multinode_penalty.py b/bioptim/limits/multinode_penalty.py index 7ccdd0084..ffe4e91ff 100644 --- a/bioptim/limits/multinode_penalty.py +++ b/bioptim/limits/multinode_penalty.py @@ -1,4 +1,5 @@ from typing import Callable, Any +from casadi import DM, horzcat, MX_eye, jacobian, Function, MX from .constraints import PenaltyOption from .objective_functions import ObjectiveFunction @@ -303,6 +304,47 @@ def get_time_parameter_idx(controller: PenaltyController, i_phase): return out + @staticmethod + def m_equals_inverse_of_dg_dz(penalty, controllers: list[PenaltyController, PenaltyController], dynamics: Callable, wM_magnitude: DM, wS_magnitude: DM, **unused_param): + """ + ... + """ + if controllers[0].phase_idx != controllers[1].phase_idx: + raise RuntimeError("For this constraint to make sens, the two nodes must belong to the same phase.") + + dt = controllers[0].tf / controllers[0].ns + + wM = MX.sym("wM", wM_magnitude.shape[0], 1) + wS = MX.sym("wS", wS_magnitude.shape[0], 1) + + nx = controllers[0].states.cx.shape[0] + M_matrix = controllers[0].stochastic_variables["m"].reshape_to_matrix(controllers[0].stochastic_variables, nx, nx, Node.START, "m") + + dx = dynamics(controllers[0].states.cx_start, controllers[0].controls.cx_start, + controllers[0].parameters.cx_start, controllers[0].stochastic_variables.cx_start, + controllers[0].get_nlp, wM, wS, + with_gains=True) + + DdZ_DX_fun = Function("DdZ_DX_fun", [controllers[0].states.cx_start, + controllers[0].controls.cx_start, + controllers[0].parameters.cx_start, + controllers[0].stochastic_variables.cx_start, + wM, wS], + [jacobian(dx.dxdt, controllers[0].states.cx_start)]) + + DdZ_DX = DdZ_DX_fun(controllers[1].states.cx_start, + controllers[1].controls.cx_start, + controllers[1].parameters.cx_start, + controllers[1].stochastic_variables.cx_start, + wM_magnitude, wS_magnitude) + + DG_DZ = MX_eye(DdZ_DX.shape[0]) - DdZ_DX * dt / 2 + + val = M_matrix @ DG_DZ - MX_eye(nx) + + out_vector = controllers[0].stochastic_variables["m"].reshape_to_vector(val) + return out_vector + @staticmethod def custom(penalty, controllers: list[PenaltyController, PenaltyController], **extra_params): """ diff --git a/bioptim/limits/objective_functions.py b/bioptim/limits/objective_functions.py index d7169e866..0c0260c48 100644 --- a/bioptim/limits/objective_functions.py +++ b/bioptim/limits/objective_functions.py @@ -314,6 +314,7 @@ def get_type() -> Callable MINIMIZE_FATIGUE = (PenaltyFunctionAbstract.Functions.minimize_fatigue,) MINIMIZE_CONTROL = (PenaltyFunctionAbstract.Functions.minimize_controls,) TRACK_CONTROL = (PenaltyFunctionAbstract.Functions.minimize_controls,) + MINIMIZE_STOCHASTIC_VARIABLE = (PenaltyFunctionAbstract.Functions.minimize_stochastic_variables,) SUPERIMPOSE_MARKERS = (PenaltyFunctionAbstract.Functions.superimpose_markers,) MINIMIZE_MARKERS = (PenaltyFunctionAbstract.Functions.minimize_markers,) TRACK_MARKERS = (PenaltyFunctionAbstract.Functions.minimize_markers,) @@ -363,6 +364,7 @@ def get_type() -> Callable MINIMIZE_STATE = (PenaltyFunctionAbstract.Functions.minimize_states,) TRACK_STATE = (PenaltyFunctionAbstract.Functions.minimize_states,) MINIMIZE_FATIGUE = (PenaltyFunctionAbstract.Functions.minimize_fatigue,) + MINIMIZE_STOCHASTIC_VARIABLE = (PenaltyFunctionAbstract.Functions.minimize_stochastic_variables,) MINIMIZE_MARKERS = (PenaltyFunctionAbstract.Functions.minimize_markers,) TRACK_MARKERS = (PenaltyFunctionAbstract.Functions.minimize_markers,) MINIMIZE_MARKERS_VELOCITY = (PenaltyFunctionAbstract.Functions.minimize_markers_velocity,) diff --git a/bioptim/limits/penalty.py b/bioptim/limits/penalty.py index b792abc28..44e1bc06f 100644 --- a/bioptim/limits/penalty.py +++ b/bioptim/limits/penalty.py @@ -3,7 +3,7 @@ import inspect import biorbd_casadi as biorbd -from casadi import horzcat, vertcat, SX, Function, atan2, dot, cross, sqrt +from casadi import horzcat, vertcat, SX, Function, atan2, dot, cross, sqrt, MX_eye, MX, jacobian, DM from .penalty_option import PenaltyOption from .penalty_controller import PenaltyController @@ -101,6 +101,27 @@ def minimize_controls(penalty: PenaltyOption, controller: PenaltyController, key # TODO: We should scale the target here! return controller.controls[key].cx_start + @staticmethod + def minimize_stochastic_variables(penalty: PenaltyOption, controller: PenaltyController, key: str): + """ + Minimize a stochastic variable. + By default, this function is quadratic, meaning that it minimizes towards the target. + Targets (default=np.zeros()) and indices (default=all_idx) can be specified. + Parameters + ---------- + penalty: PenaltyOption + The actual penalty to declare + controller: PenaltyController + The penalty node elements + key: str + The name of the controls to minimize + """ + + penalty.quadratic = True if penalty.quadratic is None else penalty.quadratic + penalty.multi_thread = True if penalty.multi_thread is None else penalty.multi_thread + + return controller.stochastic_variables[key].cx_start + @staticmethod def minimize_fatigue(penalty: PenaltyOption, controller: PenaltyController, key: str): """ @@ -975,6 +996,30 @@ def continuity(penalty: PenaltyOption, controller: PenaltyController | list): return continuity + @staticmethod + def covariance_matrix_continuity_implicit(penalty: PenaltyOption, controller: PenaltyController, wM_magnitude: DM, wS_magnitude: DM): + + nx = controller.states.cx_start.shape[0] + P_matrix = controller.integrated_values["cov"].reshape_to_matrix(controller.stochastic_variables, nx, nx, Node.START, "cov") + A_matrix = controller.stochastic_variables["a"].reshape_to_matrix(controller.stochastic_variables, nx, nx, Node.START, "a") + C_matrix = controller.stochastic_variables["c"].reshape_to_matrix(controller.stochastic_variables, nx, nx, Node.START, "c") + M_matrix = controller.stochastic_variables["m"].reshape_to_matrix(controller.stochastic_variables, nx, nx, Node.START, "m") + + sigma_w = vertcat(wS_magnitude, wM_magnitude) + dt = 1 / controller.ns + dg_dw = - dt * C_matrix + dg_dx = - MX_eye(A_matrix.shape[0]) - dt / 2 * A_matrix + + p_next = M_matrix @ (dg_dx @ P_matrix @ dg_dx.T + dg_dw @ sigma_w @ dg_dw.T) @ M_matrix.T + p_implicit_deffect = p_next - P_matrix + + penalty.expand = controller.get_nlp.dynamics_type.expand + penalty.explicit_derivative = True + penalty.multi_thread = True + + out_vector = controller.integrated_values["cov"].reshape_to_vector(p_implicit_deffect) + return out_vector + @staticmethod def custom(penalty: PenaltyOption, controller: PenaltyController | list, **parameters: Any): """ From 2b42bfdc6e760cbddea5c70c732092087a41e909 Mon Sep 17 00:00:00 2001 From: Mac-eve Date: Tue, 11 Jul 2023 14:39:40 +0200 Subject: [PATCH 08/54] penalty controller + options --- bioptim/limits/penalty_controller.py | 28 ++++++++++++++++++++++++++- bioptim/limits/penalty_option.py | 29 ++++++++++++++++++++-------- 2 files changed, 48 insertions(+), 9 deletions(-) diff --git a/bioptim/limits/penalty_controller.py b/bioptim/limits/penalty_controller.py index b2ff09c72..c44575bd8 100644 --- a/bioptim/limits/penalty_controller.py +++ b/bioptim/limits/penalty_controller.py @@ -4,7 +4,7 @@ from ..optimization.non_linear_program import NonLinearProgram from ..optimization.optimization_variable import OptimizationVariableList -from ..misc.enums import ControlType +from ..misc.enums import ControlType, Node class PenaltyController: @@ -137,6 +137,32 @@ def states_dot(self) -> OptimizationVariableList: out.current_cx_to_get = self.cx_index_to_get return out + @property + def stochastic_variables(self) -> OptimizationVariableList: + """ + Return the stochastic_variables associated with the current node index + Returns + ------- + The stochastic_variables at node node_index + """ + self._nlp.stochastic_variables.node_index = self.node_index + out = self._nlp.stochastic_variables.unscaled + out.current_cx_to_get = self.cx_index_to_get + return out + + @property + def integrated_values(self) -> OptimizationVariableList: + """ + Return the values associated with the current node index + Returns + ------- + The integrated_values at node node_index + """ + self._nlp.integrated_values.node_index = self.node_index + out = self._nlp.integrated_values.unscaled + out.current_cx_to_get = self.cx_index_to_get + return out + @property def integrate(self): return self._nlp.dynamics[self.node_index] diff --git a/bioptim/limits/penalty_option.py b/bioptim/limits/penalty_option.py index 6fbff196c..d3a44e5cd 100644 --- a/bioptim/limits/penalty_option.py +++ b/bioptim/limits/penalty_option.py @@ -438,9 +438,11 @@ def get_u(u: MX | SX, dt: MX | SX): state_cx_scaled = ocp.cx() control_cx_scaled = ocp.cx() + stochastic_cx_scaled = ocp.cx() for ctrl in controllers: state_cx_scaled = vertcat(state_cx_scaled, ctrl.states_scaled.cx) control_cx_scaled = vertcat(control_cx_scaled, ctrl.controls_scaled.cx) + stochastic_cx_scaled = vertcat(stochastic_cx_scaled, ctrl.stochastic_variables.cx) else: ocp = controller.ocp @@ -453,11 +455,13 @@ def get_u(u: MX | SX, dt: MX | SX): else: state_cx_scaled = controller.states_scaled.cx_start control_cx_scaled = controller.controls_scaled.cx_start + stochastic_cx_scaled = controller.stochastic_variables.cx_start if self.explicit_derivative: if self.derivative: raise RuntimeError("derivative and explicit_derivative cannot be simultaneously true") state_cx_scaled = horzcat(state_cx_scaled, controller.states_scaled.cx_end) control_cx_scaled = horzcat(control_cx_scaled, controller.controls_scaled.cx_end) + stochastic_cx_scaled = horzcat(stochastic_cx_scaled, controller.stochastic_variables.cx_end) # Alias some variables node = controller.node_index @@ -474,7 +478,8 @@ def get_u(u: MX | SX, dt: MX | SX): # Do not use nlp.add_casadi_func because all functions must be registered sub_fcn = fcn[self.rows, self.cols] self.function[node] = controller.to_casadi_func( - name, sub_fcn, state_cx_scaled, control_cx_scaled, param_cx, expand=self.expand + name, sub_fcn, state_cx_scaled, control_cx_scaled, param_cx, stochastic_cx_scaled, + expand=self.expand ) self.function_non_threaded[node] = self.function[node] @@ -483,11 +488,12 @@ def get_u(u: MX | SX, dt: MX | SX): control_cx_scaled = horzcat(controller.controls_scaled.cx_end, controller.controls_scaled.cx_start) self.function[node] = biorbd.to_casadi_func( f"{name}", - self.function[node](controller.states_scaled.cx_end, controller.controls_scaled.cx_end, param_cx) - - self.function[node](controller.states_scaled.cx_start, controller.controls_scaled.cx_start, param_cx), + self.function[node](controller.states_scaled.cx_end, controller.controls_scaled.cx_end, param_cx, stochastic_cx_scaled.cx_end) + - self.function[node](controller.states_scaled.cx_start, controller.controls_scaled.cx_start, param_cx, stochastic_cx_scaled.cx_end), state_cx_scaled, control_cx_scaled, param_cx, + stochastic_cx_scaled, ) dt_cx = controller.cx.sym("dt", 1, 1) @@ -537,17 +543,24 @@ def get_u(u: MX | SX, dt: MX | SX): if self.integration_rule == QuadratureRule.APPROXIMATE_TRAPEZOIDAL else controller.integrate(x0=state_cx, p=control_cx_end, params=controller.parameters.cx)["xf"] ) + + stochastic_cx_scaled = ( + horzcat(controller.stochastic_variables.cx_start, controller.stochastic_variables.cx_end) + if self.integration_rule == QuadratureRule.TRAPEZOIDAL + else controller.stochastic_variables.cx_start + ) + modified_function = controller.to_casadi_func( f"{name}", ( ( self.function[node]( - controller.states_scaled.cx_start, controller.controls_scaled.cx_start, param_cx + controller.states_scaled.cx_start, controller.controls_scaled.cx_start, param_cx, controller.stochastic_variables.cx_start ) - target_cx[:, 0] ) ** exponent - + (self.function[node](state_cx_end_scaled, control_cx_end_scaled, param_cx) - target_cx[:, 1]) + + (self.function[node](state_cx_end_scaled, control_cx_end_scaled, param_cx, stochastic_cx_scaled) - target_cx[:, 1]) ** exponent ) / 2, @@ -557,16 +570,16 @@ def get_u(u: MX | SX, dt: MX | SX): target_cx, dt_cx, ) - modified_fcn = modified_function(state_cx_scaled, control_cx_scaled, param_cx, target_cx, dt_cx) + modified_fcn = modified_function(state_cx_scaled, control_cx_scaled, param_cx, stochastic_cx_scaled, target_cx, dt_cx) else: - modified_fcn = (self.function[node](state_cx_scaled, control_cx_scaled, param_cx) - target_cx) ** exponent + modified_fcn = (self.function[node](state_cx_scaled, control_cx_scaled, param_cx, stochastic_cx_scaled) - target_cx) ** exponent # for the future bioptim adventurer: here lies the reason that a constraint must have weight = 0. modified_fcn = weight_cx * modified_fcn * dt_cx if self.weight else modified_fcn * dt_cx # Do not use nlp.add_casadi_func because all of them must be registered self.weighted_function[node] = Function( - name, [state_cx_scaled, control_cx_scaled, param_cx, weight_cx, target_cx, dt_cx], [modified_fcn] + name, [state_cx_scaled, control_cx_scaled, param_cx, stochastic_cx_scaled, weight_cx, target_cx, dt_cx], [modified_fcn] ) self.weighted_function_non_threaded[node] = self.weighted_function[node] From a7dc6783e1b709a99ba5b00240b279b4cd7bfbce Mon Sep 17 00:00:00 2001 From: Mac-eve Date: Tue, 11 Jul 2023 14:50:23 +0200 Subject: [PATCH 09/54] nlp + ocp --- bioptim/optimization/non_linear_program.py | 8 ++- .../optimization/optimal_control_program.py | 49 ++++++++++++++++--- 2 files changed, 49 insertions(+), 8 deletions(-) diff --git a/bioptim/optimization/non_linear_program.py b/bioptim/optimization/non_linear_program.py index 9d2f4ea33..369d43c0a 100644 --- a/bioptim/optimization/non_linear_program.py +++ b/bioptim/optimization/non_linear_program.py @@ -1,12 +1,12 @@ from typing import Callable, Any import casadi -from casadi import SX, MX, Function, horzcat +from casadi import SX, MX, Function, horzcat, jacobian, MX_eye from .optimization_variable import OptimizationVariable, OptimizationVariableContainer from ..dynamics.ode_solver import OdeSolver from ..limits.path_conditions import InitialGuessList, BoundsList -from ..misc.enums import ControlType +from ..misc.enums import ControlType, Node from ..misc.options import OptionList from ..misc.mapping import NodeMapping from ..dynamics.dynamics_evaluation import DynamicsEvaluation @@ -158,6 +158,8 @@ def __init__(self, assume_phase_dynamics): self.states = OptimizationVariableContainer(assume_phase_dynamics) self.states_dot = OptimizationVariableContainer(assume_phase_dynamics) self.controls = OptimizationVariableContainer(assume_phase_dynamics) + self.stochastic_variables = OptimizationVariableContainer(assume_phase_dynamics) + self.integrated_values = OptimizationVariableContainer(assume_phase_dynamics) def initialize(self, cx: Callable = None): """ @@ -180,6 +182,8 @@ def initialize(self, cx: Callable = None): self.states.initialize_from_shooting(n_shooting=self.ns + 1, cx=self.cx) self.states_dot.initialize_from_shooting(n_shooting=self.ns + 1, cx=self.cx) self.controls.initialize_from_shooting(n_shooting=self.ns + 1, cx=self.cx) + self.stochastic_variables.initialize_from_shooting(n_shooting=self.ns + 1, cx=self.cx) + self.integrated_values.initialize_from_shooting(n_shooting=self.ns + 1, cx=self.cx) @staticmethod def add(ocp, param_name: str, param: Any, duplicate_singleton: bool, _type: Any = None, name: str = None): diff --git a/bioptim/optimization/optimal_control_program.py b/bioptim/optimization/optimal_control_program.py index 1bdf1f5fe..a2ac1c2d1 100644 --- a/bioptim/optimization/optimal_control_program.py +++ b/bioptim/optimization/optimal_control_program.py @@ -29,7 +29,7 @@ ParameterConstraint, ) from ..limits.phase_transition import PhaseTransitionList, PhaseTransitionFcn -from ..limits.multinode_constraint import MultinodeConstraintList +from ..limits.multinode_constraint import MultinodeConstraintList, MultinodeConstraint, MultinodeConstraintFcn from ..limits.multinode_objective import MultinodeObjectiveList from ..limits.objective_functions import ( ObjectiveFcn, @@ -147,8 +147,10 @@ def __init__( phase_time: int | float | list | tuple, x_bounds: BoundsList = None, u_bounds: BoundsList = None, + s_bounds: BoundsList = None, x_init: InitialGuessList | None = None, u_init: InitialGuessList | None = None, + s_init: InitialGuessList | None = None, objective_functions: Objective | ObjectiveList = None, constraints: Constraint | ConstraintList = None, parameters: ParameterList = None, @@ -174,6 +176,7 @@ def __init__( use_sx: bool = False, skip_continuity: bool = False, assume_phase_dynamics: bool = False, + integrated_value_functions: dict[Callable] = None, ): """ Parameters @@ -190,10 +193,14 @@ def __init__( The initial guesses for the states u_init: InitialGuess | InitialGuessList The initial guesses for the controls + s_init: InitialGuess | InitialGuessList + The initial guesses for the stochastic variables x_bounds: Bounds | BoundsList The bounds for the states u_bounds: Bounds | BoundsList The bounds for the controls + s_bounds: Bounds | BoundsList + The bounds for the stochastic variables x_scaling: VariableScalingList The scaling for the states at each phase, if only one is sent, then the scaling is copied over the phases xdot_scaling: VariableScalingList @@ -263,8 +270,10 @@ def __init__( "phase_time": phase_time, "x_init": x_init, "u_init": u_init, + "s_init": s_init, "x_bounds": x_bounds, "u_bounds": u_bounds, + "s_bounds": s_bounds, "x_scaling": x_scaling, "xdot_scaling": xdot_scaling, "u_scaling": u_scaling, @@ -289,6 +298,7 @@ def __init__( "n_threads": n_threads, "use_sx": use_sx, "assume_phase_dynamics": assume_phase_dynamics, + "integrated_value_functions": integrated_value_functions, } # Check integrity of arguments @@ -320,6 +330,11 @@ def __init__( elif not isinstance(u_bounds, BoundsList): raise RuntimeError("u_bounds should be built from a BoundsList") + if s_bounds is None: + s_bounds = BoundsList() + elif not isinstance(s_bounds, BoundsList): + raise RuntimeError("s_bounds should be built from a BoundsList") + if x_init is None: x_init = InitialGuessList() if not isinstance(x_init, InitialGuessList): @@ -330,15 +345,23 @@ def __init__( if not isinstance(u_init, InitialGuessList): raise RuntimeError("u_init should be built from a InitialGuessList") + if s_init is None: + s_init = InitialGuessList() + if not isinstance(s_init, InitialGuessList): + raise RuntimeError("s_init should be built from a InitialGuessList") + x_bounds = self._prepare_option_dict_for_phase("x_bounds", x_bounds, BoundsList) u_bounds = self._prepare_option_dict_for_phase("u_bounds", u_bounds, BoundsList) + s_bounds = self._prepare_option_dict_for_phase("s_bounds", s_bounds, BoundsList) x_init = self._prepare_option_dict_for_phase("x_init", x_init, InitialGuessList) u_init = self._prepare_option_dict_for_phase("u_init", u_init, InitialGuessList) + s_init = self._prepare_option_dict_for_phase("s_init", s_init, InitialGuessList) x_scaling = self._prepare_option_dict_for_phase("x_scaling", x_scaling, VariableScalingList) xdot_scaling = self._prepare_option_dict_for_phase("xdot_scaling", xdot_scaling, VariableScalingList) u_scaling = self._prepare_option_dict_for_phase("u_scaling", u_scaling, VariableScalingList) + # TODO: add scaling for s if objective_functions is None: objective_functions = ObjectiveList() @@ -499,6 +522,8 @@ def __init__( NLP.add(self, "xdot_scaling", xdot_scaling, True) NLP.add(self, "u_scaling", u_scaling, True) + NLP.add(self, "integrated_value_functions", integrated_value_functions, True) + # Prepare the node mappings if node_mappings is None: node_mappings = NodeMappingList() @@ -521,8 +546,8 @@ def __init__( self.parameter_bounds = BoundsList() self.parameter_init = InitialGuessList() - self.update_bounds(x_bounds, u_bounds, parameter_bounds) - self.update_initial_guess(x_init, u_init, parameter_init) + self.update_bounds(x_bounds, u_bounds, parameter_bounds, s_bounds) + self.update_initial_guess(x_init, u_init, parameter_init, s_init) # Define the actual NLP problem OptimizationVectorHelper.declare_ocp_shooting_points(self) @@ -530,8 +555,7 @@ def __init__( # Prepare phase transitions (Reminder, it is important that parameters are declared before, # otherwise they will erase the phase_transitions) self.phase_transitions = phase_transitions.prepare_phase_transitions(self, state_continuity_weight) - multinode_constraints.add_or_replace_to_penalty_pool(self) - multinode_objectives.add_or_replace_to_penalty_pool(self) + self._declare_multi_node_penalties(multinode_constraints, multinode_objectives) # Skipping creates an OCP without built-in continuity constraints, make sure you declared constraints elsewhere if not skip_continuity: @@ -738,6 +762,10 @@ def _declare_continuity(self, state_continuity_weight: float = None) -> None: pt.list_index = -1 pt.add_or_replace_to_penalty_pool(self, self.nlp[pt.nodes_phase[0]]) + def _declare_multi_node_penalties(self, multinode_constraints: ConstraintList, multinode_objectives: ObjectiveList): + multinode_constraints.add_or_replace_to_penalty_pool(self) + multinode_objectives.add_or_replace_to_penalty_pool(self) + def update_objectives(self, new_objective_function: Objective | ObjectiveList): """ The main user interface to add or modify objective functions in the ocp @@ -866,7 +894,7 @@ def _declare_parameters(self, new_parameters: ParameterList): offset += param.size def update_bounds( - self, x_bounds: BoundsList = None, u_bounds: BoundsList = None, parameter_bounds: BoundsList = None + self, x_bounds: BoundsList = None, u_bounds: BoundsList = None, parameter_bounds: BoundsList = None, s_bounds: BoundsList = None ): """ The main user interface to add bounds in the ocp @@ -879,6 +907,8 @@ def update_bounds( The control bounds to add parameter_bounds: BoundsList The parameters bounds to add + s_bounds: BoundsList + The stochastic variable bounds to add """ for i in range(self.n_phases): if x_bounds is not None: @@ -895,6 +925,13 @@ def update_bounds( origin_phase = 0 if len(u_bounds) == 1 else i self.nlp[i].u_bounds.add(key, u_bounds[origin_phase][key], phase=0) + if s_bounds is not None: + if not isinstance(s_bounds, BoundsList): + raise RuntimeError("s_bounds should be built from a BoundsList") + for key in s_bounds.keys(): + origin_phase = 0 if len(s_bounds) == 1 else i + self.nlp[i].s_bounds.add(key, s_bounds[origin_phase][key], phase=0) + if parameter_bounds is not None: if not isinstance(parameter_bounds, BoundsList): raise RuntimeError("parameter_bounds should be built from a BoundsList") From e30d3e008d8f4ab45b2ad337893260118c8883d6 Mon Sep 17 00:00:00 2001 From: Mac-eve Date: Tue, 11 Jul 2023 15:17:05 +0200 Subject: [PATCH 10/54] optimization vector (not sure of this merge) --- bioptim/optimization/optimization_variable.py | 66 +++++++++++++ bioptim/optimization/optimization_vector.py | 98 +++++++++++++++++-- 2 files changed, 158 insertions(+), 6 deletions(-) diff --git a/bioptim/optimization/optimization_variable.py b/bioptim/optimization/optimization_variable.py index 0c6bae535..5358e5005 100644 --- a/bioptim/optimization/optimization_variable.py +++ b/bioptim/optimization/optimization_variable.py @@ -4,6 +4,7 @@ from casadi import MX, SX, vertcat from ..misc.mapping import BiMapping +from ..misc.enums import Node class OptimizationVariable: @@ -136,6 +137,38 @@ def cx_end(self): return self.parent_list.cx_end[self.index, :] + def reshape_to_vector(self, matrix): + """ + Restore the vector form of the matrix + """ + shape_0 = matrix.shape[0] + shape_1 = matrix.shape[1] + vector = MX.zeros(shape_0 * shape_1) + for s0 in range(shape_0): + for s1 in range(shape_1): + vector[shape_0 * s0 + s1] = matrix[s0, s1] + return vector + + + def reshape_to_matrix(self, variable, shape_0, shape_1, node: Node, key: str): + """ + Restore the matrix form of the variables + """ + matrix = MX(shape_0, shape_1) + i = 0 + for s0 in range(shape_0): + for s1 in range(shape_1): + if node == Node.START: + matrix[s0, s1] = variable[key].cx_start[i] + elif node == Node.MID: + matrix[s0, s1] = variable[key].cx_mid[i] + elif node == Node.END: + matrix[s0, s1] = variable[key].cx_end[i] + else: + raise RuntimeError("Node must be a Node.START for cx_start, Node.MID for cx_mid, or Node.END for cx_end") + i += 1 + return matrix + class OptimizationVariableList: """ A list of OptimizationVariable @@ -641,3 +674,36 @@ def __next__(self): if self._iter_idx > len(self): raise StopIteration return self.unscaled[self._iter_idx - 1].name + + + def reshape_to_vector(self, matrix): + """ + Restore the vector form of the matrix + """ + shape_0 = matrix.shape[0] + shape_1 = matrix.shape[1] + vector = MX.zeros(shape_0 * shape_1) + for s0 in range(shape_0): + for s1 in range(shape_1): + vector[shape_0 * s0 + s1] = matrix[s0, s1] + return vector + + + def reshape_to_matrix(self, variable, shape_0, shape_1, node: Node, key: str): + """ + Restore the matrix form of the variables + """ + matrix = MX(shape_0, shape_1) + i = 0 + for s0 in range(shape_0): + for s1 in range(shape_1): + if node == Node.START: + matrix[s0, s1] = variable[key].cx_start[i] + elif node == Node.MID: + matrix[s0, s1] = variable[key].cx_mid[i] + elif node == Node.END: + matrix[s0, s1] = variable[key].cx_end[i] + else: + raise RuntimeError("Node must be a Node.START for cx_start, Node.MID for cx_mid, or Node.END for cx_end") + i += 1 + return matrix diff --git a/bioptim/optimization/optimization_vector.py b/bioptim/optimization/optimization_vector.py index 5fb70e4b5..5c9423f6e 100644 --- a/bioptim/optimization/optimization_vector.py +++ b/bioptim/optimization/optimization_vector.py @@ -9,11 +9,11 @@ class OptimizationVectorHelper: Methods ------- vector(self) - Format the x, u and p so they are in one nice (and useful) vector + Format the x, u, p and s so they are in one nice (and useful) vector bounds(self) - Format the x, u and p bounds so they are in one nice (and useful) vector + Format the x, u, p and s bounds so they are in one nice (and useful) vector init(self) - Format the x, u and p init so they are in one nice (and useful) vector + Format the x, u, p and s init so they are in one nice (and useful) vector extract_phase_time(self, data: np.ndarray | DM) -> list Get the phase time. If time is optimized, the MX/SX values are replaced by their actual optimized time to_dictionaries(self, data: np.ndarray | DM) -> tuple @@ -37,11 +37,13 @@ def declare_ocp_shooting_points(ocp): x_scaled = [] u = [] u_scaled = [] + s = [] for nlp in ocp.nlp: x.append([]) x_scaled.append([]) u.append([]) u_scaled.append([]) + s.append([]) if nlp.control_type not in (ControlType.CONSTANT, ControlType.LINEAR_CONTINUOUS, ControlType.NONE): raise NotImplementedError(f"Multiple shooting problem not implemented yet for {nlp.control_type}") @@ -84,6 +86,10 @@ def declare_ocp_shooting_points(ocp): u_scaled[nlp.phase_idx] = u_scaled[nlp.use_controls_from_phase_idx] u[nlp.phase_idx] = u[nlp.use_controls_from_phase_idx] + s[nlp.phase_idx].append( + nlp.cx.sym("S_" + str(nlp.phase_idx) + "_" + str(k), nlp.stochastic_variables.shape, 1) + ) + OptimizationVectorHelper._set_node_index(nlp, 0) nlp.X_scaled = x_scaled[nlp.phase_idx] @@ -92,10 +98,12 @@ def declare_ocp_shooting_points(ocp): nlp.U_scaled = u_scaled[nlp.phase_idx] nlp.U = u[nlp.phase_idx] + nlp.S = s[nlp.phase_idx] + @staticmethod def vector(ocp): """ - Format the x, u and p so they are in one nice (and useful) vector + Format the x, u, p and s so they are in one nice (and useful) vector Returns ------- @@ -104,14 +112,16 @@ def vector(ocp): x_scaled = [] u_scaled = [] + s = [] for nlp in ocp.nlp: if nlp.ode_solver.is_direct_collocation: x_scaled += [x.reshape((-1, 1)) for x in nlp.X_scaled] else: x_scaled += nlp.X_scaled u_scaled += nlp.U_scaled + s += nlp.S - return vertcat(*x_scaled, *u_scaled, ocp.parameters.cx) + return vertcat(*x_scaled, *u_scaled, ocp.parameters.cx, *s) @staticmethod def bounds_vectors(ocp) -> tuple[np.ndarray, np.ndarray]: @@ -199,6 +209,7 @@ def bounds_vectors(ocp) -> tuple[np.ndarray, np.ndarray]: v_bounds_min = np.concatenate((v_bounds_min, np.reshape(collapsed_values_min.T, (-1, 1)))) v_bounds_max = np.concatenate((v_bounds_max, np.reshape(collapsed_values_max.T, (-1, 1)))) + # For parameters collapsed_values_min = np.ones((ocp.parameters.shape, 1)) * -np.inf collapsed_values_max = np.ones((ocp.parameters.shape, 1)) * np.inf for key in ocp.parameters.keys(): @@ -211,6 +222,33 @@ def bounds_vectors(ocp) -> tuple[np.ndarray, np.ndarray]: v_bounds_min = np.concatenate((v_bounds_min, np.reshape(collapsed_values_min.T, (-1, 1)))) v_bounds_max = np.concatenate((v_bounds_max, np.reshape(collapsed_values_max.T, (-1, 1)))) + # For stochastic variables + for i_phase in range(ocp.n_phases): + nlp = ocp.nlp[i_phase] + OptimizationVectorHelper._set_node_index(nlp, 0) + for key in nlp.stochastic_states.keys(): + if key in nlp.s_bounds.keys(): + nlp.s_bounds[key].check_and_adjust_dimensions(nlp.stochastic_variables[key].cx.shape[0], nlp.ns) + + for k in range(nlp.ns + 1): + OptimizationVectorHelper._set_node_index(nlp, k) + collapsed_values_min = np.ndarray((nlp.stochastic_variables.shape, 1)) + collapsed_values_max = np.ndarray((nlp.stochastic_variables.shape, 1)) + for key in nlp.stochastic_variables.keys(): + if key in nlp.s_bounds.keys(): + value_min = nlp.s_bounds[key].min.evaluate_at(shooting_point=k) + value_max = nlp.s_bounds[key].max.evaluate_at(shooting_point=k) + else: + value_min = -np.inf + value_max = np.inf + + # Organize the stochastic variables according to the correct indices + collapsed_values_min[nlp.states[key].index, :] = value_min + collapsed_values_max[nlp.states[key].index, :] = value_max + + v_bounds_min = np.concatenate((v_bounds_min, np.reshape(collapsed_values_min.T, (-1, 1)))) + v_bounds_max = np.concatenate((v_bounds_max, np.reshape(collapsed_values_max.T, (-1, 1)))) + return v_bounds_min, v_bounds_max @staticmethod @@ -292,6 +330,7 @@ def init_vector(ocp): v_init = np.concatenate((v_init, np.reshape(collapsed_values.T, (-1, 1)))) + # For parameters collapsed_values = np.zeros((ocp.parameters.shape, 1)) for key in ocp.parameters.keys(): if key not in ocp.parameter_init.keys(): @@ -302,6 +341,29 @@ def init_vector(ocp): collapsed_values[ocp.parameters[key].index, :] = scaled_init.init v_init = np.concatenate((v_init, np.reshape(collapsed_values.T, (-1, 1)))) + # For stochastic variables + for i_phase in range(len(ocp.nlp)): + nlp = ocp.nlp[i_phase] + OptimizationVectorHelper._set_node_index(nlp, 0) + + for key in nlp.stochastoc_variables.keys(): + if key in nlp.s_init.keys(): + nlp.s_init[key].check_and_adjust_dimensions(nlp.stochastic_variables[key].cx.shape[0], nlp.ns) + + for k in range(nlp.ns+1): + OptimizationVectorHelper._set_node_index(nlp, k) + collapsed_values = np.ndarray((nlp.stochastic_variables.shape, 1)) + for key in nlp.stochastic_variables: + if key in nlp.s_init.keys(): + value = nlp.s_init[key].init.evaluate_at(shooting_point=k) + else: + value = 0 + + # Organize the stochastic variables according to the correct indices + collapsed_values[nlp.stochastic_variables[key].index, 0] = value + + v_init = np.concatenate((v_init, np.reshape(collapsed_values.T, (-1, 1)))) + return v_init @staticmethod @@ -356,6 +418,7 @@ def to_dictionaries(ocp, data: np.ndarray | DM) -> tuple: data_states = [] data_controls = [] + data_stochastic_variables = [] for p in range(ocp.n_phases): nlp = ocp.nlp[p] n_points = nlp.ns * (1 if nlp.ode_solver.is_direct_shooting else (nlp.ode_solver.polynomial_degree + 1)) + 1 @@ -371,8 +434,15 @@ def to_dictionaries(ocp, data: np.ndarray | DM) -> tuple: for key in ocp.nlp[p].controls } ) + data_stochastic_variables.append( + { + key: np.ndarray((nlp.controls[key].shape, nlp.ns + 1)) + for key in ocp.nlp[p].stochastic_variables + } + ) data_parameters = {key: np.ndarray((0, 1)) for key in ocp.parameters.keys()} + # For states offset = 0 p_idx = 0 for p in range(ocp.n_phases): @@ -389,6 +459,7 @@ def to_dictionaries(ocp, data: np.ndarray | DM) -> tuple: offset += nx p_idx += 1 + # For controls p_idx = 0 for p in range(ocp.n_phases): nlp = ocp.nlp[p] @@ -413,11 +484,25 @@ def to_dictionaries(ocp, data: np.ndarray | DM) -> tuple: offset += nu p_idx += 1 + # For parameters offset = v_array.shape[0] - ocp.parameters.shape for param in ocp.parameters: data_parameters[param.name] = v_array[[offset + i for i in param.index], np.newaxis] * param.scaling - return data_states, data_controls, data_parameters + # For stochastic variables + p_idx = 0 + for p in range(ocp.n_phases): + nlp = ocp.nlp[p] + nstochastic = nlp.stochastic_variables.shape + for k in range(nlp.ns + 1): + nlp.stochastic_variables.node_index = k + u_array = v_array[offset : offset + nstochastic].reshape((nlp.stochastic_variables.shape, -1), order="F") # @pariterre "F" seems like an interpolation? + for key in nlp.stochastic_variables: + data_stochastic_variables[p_idx][key][:, k : k + 1] = u_array[nlp.stochastic_variables[key].index, :] + offset += nstochastic + p_idx += 1 + + return data_states, data_controls, data_parameters, data_stochastic_variables @staticmethod def _nb_points(nlp, interpolation_type): @@ -437,3 +522,4 @@ def _set_node_index(nlp, node): nlp.states.node_index = node nlp.states_dot.node_index = node nlp.controls.node_index = node + nlp.stochastic_variables.node_index = node From fdae6d15583c12325cd98052e3980b931693870f Mon Sep 17 00:00:00 2001 From: Mac-eve Date: Tue, 11 Jul 2023 15:21:43 +0200 Subject: [PATCH 11/54] problem type --- bioptim/optimization/problem_type.py | 38 ++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 bioptim/optimization/problem_type.py diff --git a/bioptim/optimization/problem_type.py b/bioptim/optimization/problem_type.py new file mode 100644 index 000000000..26237f2f3 --- /dev/null +++ b/bioptim/optimization/problem_type.py @@ -0,0 +1,38 @@ +from casadi import DM + +class OcpType: + """ + Selection of the type of optimization problem to be solved. + """ + def __init__(self): + pass + + class SOCP_EXPLICIT: + """ + The class used to declare a stochastic problem with explicit stochastic dynamics + Attributes + ---------- + wM_magnitude: DM + The magnitude of the motor noise + wS_magnitude: DM + The magnitude of the sensory noise + """ + + def __init__(self, wM_magnitude: DM, wS_magnitude: DM): + self.wM_magnitude = wM_magnitude + self.wS_magnitude = wS_magnitude + + class SOCP_IMPLICIT: + """ + The class used to declare a stochastic problem with implicit stochastic dynamics + Attributes + ---------- + wM_magnitude: DM + The magnitude of the motor noise + wS_magnitude: DM + The magnitude of the sensory noise + """ + + def __init__(self, wM_magnitude: DM, wS_magnitude: DM): + self.wM_magnitude = wM_magnitude + self.wS_magnitude = wS_magnitude \ No newline at end of file From 01a74b59d54ba0fce0e253e3722d0df59466eb36 Mon Sep 17 00:00:00 2001 From: Mac-eve Date: Tue, 11 Jul 2023 15:35:24 +0200 Subject: [PATCH 12/54] solution (not sure of this merge) --- bioptim/optimization/solution.py | 94 +++++++++++++++++++++++++++++++- 1 file changed, 91 insertions(+), 3 deletions(-) diff --git a/bioptim/optimization/solution.py b/bioptim/optimization/solution.py index f19fa28be..d20f903d0 100644 --- a/bioptim/optimization/solution.py +++ b/bioptim/optimization/solution.py @@ -3,7 +3,7 @@ import numpy as np from scipy import interpolate as sci_interp -from casadi import vertcat, DM, Function +from casadi import vertcat, DM, Function, MX from matplotlib import pyplot as plt from ..limits.objective_functions import ObjectiveFcn @@ -70,6 +70,10 @@ class Solution: The data structure that holds the controls parameters: dict The data structure that holds the parameters + _stochastic_variables: list + The data structure that holds the stochastic variables + _integrated_values: list + The data structure that holds the update values phase_time: list The total time for each phases @@ -215,6 +219,8 @@ def __init__(self, nlp: NonLinearProgram): self.states = nlp.states self.states_dot = nlp.states_dot self.controls = nlp.controls + self.stochastic_variables = nlp.stochastic_variables + self.integrated_values = nlp.integrated_values self.dynamics = nlp.dynamics self.dynamics_func = nlp.dynamics_func self.ode_solver = nlp.ode_solver @@ -311,8 +317,45 @@ def __init__(self, ocp, sol: dict | list | tuple | np.ndarray | DM | None): self._states = {} self._controls = {} self.parameters = {} + self._stochastic_variables = {} + self._integrated_values = {} self.phase_time = [] + def get_integrated_values(states, controls, parameters, stochastic_variables): + integrated_values_num = [{} for _ in self.ocp.nlp] + for i_phase, nlp in enumerate(self.ocp.nlp): + for key in nlp.integrated_values: + states_cx = nlp.states.cx_start + controls_cx = nlp.controls.cx_start + stochastic_variables_cx = nlp.stochastic_variables.cx_start + integrated_values_cx = nlp.integrated_values[key].cx_start + states_num = states[i_phase]['all'][:, 0] + controls_num = controls[i_phase]['all'][:, 0] + stochastic_variables_num = stochastic_variables[i_phase]['all'][:, 0] + for i_node in range(1, nlp.ns): + nlp.states.node_index = i_node + nlp.controls.node_index = i_node + nlp.stochastic_variables.node_index = i_node + nlp.integrated_values.node_index = i_node + states_cx = vertcat(states_cx, nlp.states.cx_start) + controls_cx = vertcat(controls_cx, nlp.controls.cx_start) + stochastic_variables_cx = vertcat(stochastic_variables_cx, nlp.stochastic_variables.cx_start) + integrated_values_cx = vertcat(integrated_values_cx, nlp.integrated_values[key].cx_start) + states_num = vertcat(states_num, states[i_phase]['all'][:, i_node]) + controls_num = vertcat(controls_num, controls[i_phase]['all'][:, i_node]) + stochastic_variables_num = vertcat(stochastic_variables_num, stochastic_variables[i_phase]['all'][:, i_node]) + casadi_func = Function("integrate_values", [states_cx, + controls_cx, + nlp.parameters.cx_start, + stochastic_variables_cx], [integrated_values_cx]) + integrated_values_this_time = casadi_func(states_num, controls_num, parameters["all"], stochastic_variables_num) + nb_elements = nlp.integrated_values[key].cx_start.shape[0] + integrated_values_data = np.zeros((nb_elements, nlp.ns)) + for i_node in range(nlp.ns): + integrated_values_data[:, i_node] = np.reshape(integrated_values_this_time[i_node * nb_elements : (i_node + 1) * nb_elements], (nb_elements,)) + integrated_values_num[i_phase][key] = integrated_values_data + return integrated_values_num + def init_from_dict(_sol: dict): """ Initialize all the attributes from an Ipopt-like dictionary data structure @@ -344,6 +387,7 @@ def init_from_dict(_sol: dict): self._states["scaled"], self._controls["scaled"], self.parameters, + self._stochastic_variables, ) = OptimizationVectorHelper.to_dictionaries(self.ocp, self.vector) self._states["unscaled"], self._controls["unscaled"] = self._to_unscaled_values( self._states["scaled"], self._controls["scaled"] @@ -351,6 +395,7 @@ def init_from_dict(_sol: dict): self._complete_control() self.phase_time = OptimizationVectorHelper.extract_phase_time(self.ocp, self.vector) self._time_vector = self._generate_time() + self._integrated_values = get_integrated_values(self._states["unscaled"], self._controls["unscaled"], self.parameters, self._stochastic_variables) def init_from_initial_guess(_sol: list): """ @@ -387,7 +432,8 @@ def init_from_initial_guess(_sol: list): ) self.vector = np.ndarray((0, 1)) - sol_states, sol_controls = _sol[0], _sol[1] + sol_states, sol_controls, sol_stochastic_variables = _sol[0], _sol[1], _sol[3] + # For states for p, s in enumerate(sol_states): for key in s.keys(): ns = ( @@ -401,6 +447,7 @@ def init_from_initial_guess(_sol: list): for key in s.keys(): self.vector = np.concatenate((self.vector, s[key].init.evaluate_at(i)[:, np.newaxis])) + # For controls for p, s in enumerate(sol_controls): control_type = self.ocp.nlp[p].control_type if control_type == ControlType.CONSTANT: @@ -418,15 +465,27 @@ def init_from_initial_guess(_sol: list): for key in s.keys(): self.vector = np.concatenate((self.vector, s[key].init.evaluate_at(i)[:, np.newaxis])) + # For parameters if n_param: sol_params = _sol[2] for p, s in enumerate(sol_params): self.vector = np.concatenate((self.vector, np.repeat(s.init, self.ns[p] + 1)[:, np.newaxis])) + # For stochastic variables + for p, s in enumerate(sol_stochastic_variables): + for key in s.keys(): + self.ocp.nlp[p].stochastic_variables[key].node_index = 0 + s[key].init.check_and_adjust_dimensions(len(self.ocp.nlp[p].stochastic_variables[key]), self.ns[p], "stochastic_variables") + + for i in range(self.ns[p] + 1): + for key in s.keys(): + self.vector = np.concatenate((self.vector, s[key].init.evaluate_at(i)[:, np.newaxis])) + ( self._states["scaled"], self._controls["scaled"], self.parameters, + self._stochastic_variables, ) = OptimizationVectorHelper.to_dictionaries(self.ocp, self.vector) self._states["unscaled"], self._controls["unscaled"] = self._to_unscaled_values( self._states["scaled"], self._controls["scaled"] @@ -434,6 +493,7 @@ def init_from_initial_guess(_sol: list): self._complete_control() self.phase_time = OptimizationVectorHelper.extract_phase_time(self.ocp, self.vector) self._time_vector = self._generate_time() + self._integrated_values = get_integrated_values(self._states["unscaled"], self._controls["unscaled"], self.parameters, self._stochastic_variables) def init_from_vector(_sol: np.ndarray | DM): """ @@ -450,12 +510,14 @@ def init_from_vector(_sol: np.ndarray | DM): self._states["scaled"], self._controls["scaled"], self.parameters, + self._stochastic_variables, ) = OptimizationVectorHelper.to_dictionaries(self.ocp, self.vector) self._states["unscaled"], self._controls["unscaled"] = self._to_unscaled_values( self._states["scaled"], self._controls["scaled"] ) self._complete_control() self.phase_time = OptimizationVectorHelper.extract_phase_time(self.ocp, self.vector) + self._integrated_values = get_integrated_values(self._states["unscaled"], self._controls["unscaled"], self.parameters, self._stochastic_variables) if isinstance(sol, dict): init_from_dict(sol) @@ -544,13 +606,14 @@ def copy(self, skip_data: bool = False) -> Any: if skip_data: new._states["unscaled"], new._controls["unscaled"] = [], [] - new._states["scaled"], new._controls["scaled"], new.parameters = [], [], {} + new._states["scaled"], new._controls["scaled"], new.parameters, new._stochastic_variables = [], [], {}, [] else: new._states["scaled"] = deepcopy(self._states["scaled"]) new._controls["scaled"] = deepcopy(self._controls["scaled"]) new.parameters = deepcopy(self.parameters) new._states["unscaled"] = deepcopy(self._states["unscaled"]) new._controls["unscaled"] = deepcopy(self._controls["unscaled"]) + new._stochastic_variables = deepcopy(self._stochastic_variables) return new @@ -704,6 +767,28 @@ def controls_scaled(self) -> list | dict: return self._controls["scaled"] if len(self._controls["scaled"]) > 1 else self._controls["scaled"][0] + @property + def stochastic_variables(self) -> list | dict: + """ + Returns the stochastic variables in list if more than one phases, otherwise it returns the only dict + Returns + ------- + The stochastic variables data + """ + + return self._stochastic_variables if len(self._stochastic_variables) > 1 else self._stochastic_variables[0] + + @property + def integrated_values(self) -> list | dict: + """ + Returns the update values in list if more than one phases, otherwise it returns the only dict + Returns + ------- + The update values data + """ + + return self._integrated_values if len(self._integrated_values) > 1 else self._integrated_values[0] + @property def time(self) -> list | dict | np.ndarray: """ @@ -1065,12 +1150,14 @@ def __perform_integration( ] ) ) + s = self.ocp.nlp[p].stochastic_variables if integrator == SolutionIntegrator.OCP: integrated_sol = solve_ivp_bioptim_interface( dynamics_func=nlp.dynamics, keep_intermediate_points=keep_intermediate_points, x0=x0, u=u, + s=s, params=params, param_scaling=param_scaling, shooting_type=shooting_type, @@ -1083,6 +1170,7 @@ def __perform_integration( t_eval=t_eval[:-1] if shooting_type == Shooting.MULTIPLE else t_eval, x0=x0, u=u, + s=s, params=params, method=integrator.value, control_type=nlp.control_type, From 0a36930ac04f1f30f7dcff75b38a720dc645b678 Mon Sep 17 00:00:00 2001 From: Mac-eve Date: Tue, 11 Jul 2023 15:36:43 +0200 Subject: [PATCH 13/54] added test --- tests/test_global_stochastic.py | 92 +++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 tests/test_global_stochastic.py diff --git a/tests/test_global_stochastic.py b/tests/test_global_stochastic.py new file mode 100644 index 000000000..39622a6fb --- /dev/null +++ b/tests/test_global_stochastic.py @@ -0,0 +1,92 @@ + +import os +import pickle +import re +import sys +import shutil +import platform + +import pytest +import numpy as np +from casadi import sum1, sum2 +from bioptim import InterpolationType, OdeSolver, MultinodeConstraintList, MultinodeConstraintFcn, Node, Solver + +from .utils import TestUtils + + +def test_arm_reaching_muscle_driven(): + from bioptim.examples.stochastic_optimal_control import arm_reaching_muscle_driven as ocp_module + + bioptim_folder = os.path.dirname(ocp_module.__file__) + + final_time = 0.8 + n_shooting = 4 + ee_initial_position = np.array([0.0, 0.2742]) + ee_final_position = np.array([9.359873986980460e-12, 0.527332023564034]) + problem_type = "CIRCLE" + force_field_magnitude = 0 + + ocp = ocp_module.prepare_socp( + biorbd_model_path=bioptim_folder + "/models/LeuvenArmModel.bioMod", + final_time=final_time, + n_shooting=n_shooting, + ee_final_position=ee_final_position, + ee_initial_position=ee_initial_position, + problem_type=problem_type, + force_field_magnitude=force_field_magnitude + ) + + # ocp.print(to_console=True, to_graph=False) #TODO: check to adjust the print method + + # Solver parameters + solver = Solver.IPOPT(show_online_optim=False) + solver.set_maximum_iterations(4) + solver.set_nlp_scaling_method('none') + + sol = ocp.solve(solver) + + # TODO: adjust the values as sol, gets updated + # Check objective function value + f = np.array(sol.cost) + np.testing.assert_equal(f.shape, (1, 1)) + np.testing.assert_almost_equal(f[0, 0], 8.444016053093858) + + # detailed cost values + # sol.detailed_cost_values() + # np.testing.assert_almost_equal(sol.detailed_cost[2]["cost_value_weighted"], 41.57063948309302) + # np.testing.assert_almost_equal(sol.detailed_cost[3]["cost_value_weighted"], 41.57063948309302) + + # Check constraints + g = np.array(sol.constraints) + np.testing.assert_equal(g.shape, (426, 1)) + + # Check some of the results + states, controls = sol.states, sol.controls + q, qdot, mus_activations, mus_excitations = states["q"], states["qdot"], states["muscles"], controls["muscles"] + + # initial and final position + np.testing.assert_almost_equal(q[:, 0], np.array([0.34906585, 2.24586773])) + np.testing.assert_almost_equal(q[:, -2], np.array([0.95993109, 1.15939485])) + np.testing.assert_almost_equal(qdot[:, 0], np.array((0, 0))) + np.testing.assert_almost_equal(qdot[:, -2], np.array((0, 0))) + np.testing.assert_almost_equal(mus_activations[:, 0], np.array([0.03414132, 0.03292284, 0.0126227 , 0.01565839, 0.00676471, + 0.02404206])) + np.testing.assert_almost_equal(mus_activations[:, -2], np.array([0.04160946, 0.07306185, 0.01894845, 0.02188286, 0.00068182, + 0.0253038])) + np.testing.assert_almost_equal(mus_excitations[:, 0], np.array([0.02816048, 0.0712188 , 0.04627442, 0.0034365 , 0.00025384, + 0.03239987])) + np.testing.assert_almost_equal(mus_excitations[:, -2], np.array([0.01826304, 0.04932192, 0.02884916, 0.01225839, 0.00113569, + 0.00867345])) + + # TODO: test the stochastic variables + update values + + # simulate + # TestUtils.simulate(sol) # TODO: check to adjust the simulate method + + +#iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls +# 0 5.2443422e-01 2.05e+03 1.19e+00 -1.0 0.00e+00 - 0.00e+00 0.00e+00 0 +# 1 1.7949339e+00 1.99e+03 1.29e+03 -1.0 3.73e+01 2.0 1.08e-02 2.98e-02h 1 +# 2 1.9623501e+00 1.98e+03 1.29e+03 -1.0 4.68e+00 3.3 1.13e-01 4.06e-03h 1 +# 3 4.0176536e+00 1.88e+03 1.24e+03 -1.0 4.55e+00 2.9 3.66e-01 5.30e-02h 1 +# 4 8.4440161e+00 1.65e+03 1.78e+03 -1.0 3.35e+00 3.3 2.20e-01 1.19e-01h 1 \ No newline at end of file From c385e5885c6fc55a0b7fe1d7e954ae2092bef996 Mon Sep 17 00:00:00 2001 From: Mac-eve Date: Tue, 11 Jul 2023 15:43:34 +0200 Subject: [PATCH 14/54] solve ivp --- bioptim/interfaces/solve_ivp_interface.py | 31 +++++++++++++++-------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/bioptim/interfaces/solve_ivp_interface.py b/bioptim/interfaces/solve_ivp_interface.py index fdf19d04f..a5f908693 100644 --- a/bioptim/interfaces/solve_ivp_interface.py +++ b/bioptim/interfaces/solve_ivp_interface.py @@ -11,6 +11,7 @@ def solve_ivp_interface( x0: np.ndarray, u: np.ndarray, params: np.ndarray, + s: dict[str, np.ndarray], method: str | Any = "RK45", keep_intermediate_points: bool = False, control_type: ControlType = ControlType.CONSTANT, @@ -30,6 +31,8 @@ def solve_ivp_interface( arrays of controls u evaluated at t_eval params : np.ndarray array of parameters + s : np.ndarray + dictionary of arrays of stochastic variables method : str, optional method to use for the integration, by default "RK45" keep_intermediate_points : bool @@ -46,9 +49,9 @@ def solve_ivp_interface( if isinstance(t_eval[0], np.ndarray): # Direct multiple shooting y_final = np.array([], dtype=np.float64).reshape(x0.shape[0], 0) - for s, t_eval_step in enumerate(t_eval): - x0i = x0[:, s] - u_slice = slice(s, s + 1) if control_type == ControlType.CONSTANT else slice(s, s + 2) + for ss, t_eval_step in enumerate(t_eval): + x0i = x0[:, ss] + u_slice = slice(ss, ss + 1) if control_type == ControlType.CONSTANT else slice(ss, ss + 2) # resize u to match the size of t_eval according to the type of control if control_type == ControlType.CONSTANT: @@ -65,6 +68,7 @@ def solve_ivp_interface( t_eval=t_eval_step, x0=x0i, u=ui, + s=s, params=params, method=method, keep_intermediate_points=False, # error raise in direct multiple shooting so it's always False @@ -94,8 +98,8 @@ def solve_ivp_interface( x0i = x0 y = None - for s, t_eval_step in enumerate(t_eval): - u_slice = slice(s, s + 1) if control_type == ControlType.CONSTANT else slice(s, s + 2) + for ss, t_eval_step in enumerate(t_eval): + u_slice = slice(ss, ss + 1) if control_type == ControlType.CONSTANT else slice(ss, ss + 2) # resize u to match the size of t_eval according to the type of control if control_type == ControlType.CONSTANT: @@ -111,6 +115,7 @@ def solve_ivp_interface( t_eval=t_eval_step, x0=x0i, u=ui, + s=s, params=params, method=method, keep_intermediate_points=keep_intermediate_points, @@ -130,6 +135,7 @@ def run_solve_ivp( x0: np.ndarray, u: np.ndarray, params: np.ndarray, + s: dict[str, np.ndarray], method: str | Any = "RK45", keep_intermediate_points: bool = False, control_type: ControlType = ControlType.CONSTANT, @@ -149,6 +155,8 @@ def run_solve_ivp( arrays of controls u evaluated at t_eval params : np.ndarray array of parameters + s : dict[str, np.ndarray] + dictionary of arrays of the stochastic variables method : str, optional method to use for the integration, by default "RK45" keep_intermediate_points : bool @@ -168,7 +176,7 @@ def run_solve_ivp( t_span = [t_eval[0], t_eval[-1]] integrated_sol = solve_ivp( - lambda t, x: np.array(dynamics_func(x, control_function(t), params))[:, 0], + lambda t, x: np.array(dynamics_func(x, control_function(t), params, s))[:, 0], t_span=t_span, y0=x0, t_eval=np.array(t_eval, dtype=np.float64), # prevent error with dtype=object @@ -306,6 +314,7 @@ def solve_ivp_bioptim_interface( u: np.ndarray, params: np.ndarray, param_scaling: np.ndarray, + s: dict[str, np.ndarray], shooting_type: Shooting, control_type: ControlType, ): @@ -326,6 +335,8 @@ def solve_ivp_bioptim_interface( array of parameters param_scaling : np.ndarray array of scaling factors for the parameters + s : dict[str, np.ndarray] + dictionary of the stochastic variables of the system shooting_type : Shooting The way we integrate the solution such as SINGLE, SINGLE_CONTINUOUS, MULTIPLE control_type : ControlType @@ -346,8 +357,8 @@ def solve_ivp_bioptim_interface( y_final = np.array([], dtype=np.float64).reshape(x0i.shape[0], 0) - for s, func in enumerate(dynamics_func): - u_slice = slice(s, s + 1) if control_type == ControlType.CONSTANT else slice(s, s + 2) + for ss, func in enumerate(dynamics_func): + u_slice = slice(ss, ss + 1) if control_type == ControlType.CONSTANT else slice(ss, ss + 2) u_controls = [] if control_type == ControlType.NONE else u[:, u_slice] # y always contains [x0, xf] of the interval y = np.concatenate( @@ -355,7 +366,7 @@ def solve_ivp_bioptim_interface( np.array([], dtype=np.float64).reshape(x0i.shape[0], 0) if keep_intermediate_points else x0i, # x0 or None - np.array(func(x0=x0i, p=u_controls, params=params / param_scaling)[dynamics_output]), + np.array(func(x0=x0i, p=u_controls, params=params / param_scaling, s=s)[dynamics_output]), ), # xf or xall axis=1, ) @@ -367,7 +378,7 @@ def solve_ivp_bioptim_interface( x0i = y[:, -1:] else: # Shooting.MULTIPLE concatenated_y = y - x0i = x0[:, s + 1] if s < len(dynamics_func) - 1 else None + x0i = x0[:, ss + 1] if ss < len(dynamics_func) - 1 else None y_final = np.concatenate((y_final, concatenated_y), axis=1) From 0574c20c87bb6116837948660d8a966511396aaf Mon Sep 17 00:00:00 2001 From: Mac-eve Date: Tue, 11 Jul 2023 19:14:56 +0200 Subject: [PATCH 15/54] forgot dynamics and integrator --- bioptim/__init__.py | 2 +- bioptim/dynamics/dynamics_functions.py | 8 +++ bioptim/dynamics/integrator.py | 78 +++++++++++++++----------- 3 files changed, 54 insertions(+), 34 deletions(-) diff --git a/bioptim/__init__.py b/bioptim/__init__.py index 6aa2770fe..b598fbbec 100644 --- a/bioptim/__init__.py +++ b/bioptim/__init__.py @@ -214,5 +214,5 @@ from .optimization.optimization_variable import OptimizationVariableList from .optimization.variable_scaling import VariableScalingList, VariableScaling from .optimization.stochastic_optimal_control_program import StochasticOptimalControlProgram - +from .optimization.problem_type import OcpType from .misc.casadi_expand import lt, le, gt, ge, if_else, if_else_zero diff --git a/bioptim/dynamics/dynamics_functions.py b/bioptim/dynamics/dynamics_functions.py index 76a42d364..6f09b5989 100644 --- a/bioptim/dynamics/dynamics_functions.py +++ b/bioptim/dynamics/dynamics_functions.py @@ -72,6 +72,7 @@ def torque_driven( states: MX.sym, controls: MX.sym, parameters: MX.sym, + stochastic_variables: MX.sym, nlp, with_contact: bool, with_passive_torque: bool, @@ -227,6 +228,7 @@ def torque_activations_driven( states: MX.sym, controls: MX.sym, parameters: MX.sym, + stochastic_variables: MX.sym, nlp, with_contact: bool, with_passive_torque: bool, @@ -285,6 +287,7 @@ def torque_derivative_driven( states: MX.sym, controls: MX.sym, parameters: MX.sym, + stochastic_variables: MX.sym, nlp, rigidbody_dynamics: RigidBodyDynamics, with_contact: bool, @@ -355,6 +358,7 @@ def forces_from_torque_driven( states: MX.sym, controls: MX.sym, parameters: MX.sym, + stochastic_variables: MX.sym, nlp, with_passive_torque: bool = False, with_ligament: bool = False, @@ -400,6 +404,7 @@ def forces_from_torque_activation_driven( states: MX.sym, controls: MX.sym, parameters: MX.sym, + stochastic_variables: MX.sym, nlp, with_passive_torque: bool = False, with_ligament: bool = False, @@ -445,6 +450,7 @@ def muscles_driven( states: MX.sym, controls: MX.sym, parameters: MX.sym, + stochastic_variables: MX.sym, nlp, with_contact: bool, with_passive_torque: bool = False, @@ -580,6 +586,7 @@ def forces_from_muscle_driven( states: MX.sym, controls: MX.sym, parameters: MX.sym, + stochastic_variables: MX.sym, nlp, with_passive_torque: bool = False, with_ligament: bool = False, @@ -626,6 +633,7 @@ def joints_acceleration_driven( states: MX.sym, controls: MX.sym, parameters: MX.sym, + stochastic_variables: MX.sym, nlp, rigidbody_dynamics: RigidBodyDynamics = RigidBodyDynamics.ODE, ) -> DynamicsEvaluation: diff --git a/bioptim/dynamics/integrator.py b/bioptim/dynamics/integrator.py index a71622d4e..3869d7937 100644 --- a/bioptim/dynamics/integrator.py +++ b/bioptim/dynamics/integrator.py @@ -73,6 +73,7 @@ def __init__(self, ode: dict, ode_opt: dict): self.u_sym = [] if ode_opt["control_type"] is ControlType.NONE else ode["p_scaled"] self.param_sym = ode_opt["param"].cx self.param_scaling = ode_opt["param"].scaling + self.stochastic_variables_sym = ode["stochastic_variables"] self.fun = ode["ode"] self.implicit_fun = ode["implicit_ode"] self.defects_type = ode_opt["defects_type"] @@ -152,9 +153,9 @@ def _finish_init(self): self.function = Function( "integrator", - [self.x_sym, self.u_sym, self.param_sym], - self.dxdt(self.h, self.x_sym, self.u_sym, self.param_sym, self.param_scaling), - ["x0", "p", "params"], + [self.x_sym, self.u_sym, self.param_sym, self.stochastic_variables_sym], + self.dxdt(self.h, self.x_sym, self.u_sym, self.param_sym, self.param_scaling, self.stochastic_variables_sym), + ["x0", "p", "params", "s"], ["xf", "xall"], ) @@ -219,7 +220,7 @@ def next_x(self, h: float, t: float, x_prev: MX | SX, u: MX | SX, p: MX | SX): raise RuntimeError("RK is abstract, please select a specific RK") - def dxdt(self, h: float, states: MX | SX, controls: MX | SX, params: MX | SX, param_scaling) -> tuple: + def dxdt(self, h: float, states: MX | SX, controls: MX | SX, params: MX | SX, param_scaling, stochastic_variables: MX | SX) -> tuple: """ The dynamics of the system @@ -243,10 +244,11 @@ def dxdt(self, h: float, states: MX | SX, controls: MX | SX, params: MX | SX, pa x = self.cx(states.shape[0], self.n_step + 1) p = params * param_scaling x[:, 0] = states + s = stochastic_variables for i in range(1, self.n_step + 1): t_norm_init = (i - 1) / self.n_step - x[:, i] = self.next_x(h, t_norm_init, x[:, i - 1], u, p) + x[:, i] = self.next_x(h, t_norm_init, x[:, i - 1], u, p, s) if self.model.nb_quaternions > 0: x[:, i] = self.model.normalize_state_quaternions(x[:, i]) @@ -325,7 +327,7 @@ def __init__(self, ode: dict, ode_opt: dict): super(RK2, self).__init__(ode, ode_opt) self._finish_init() - def next_x(self, h: float, t: float, x_prev: MX | SX, u: MX | SX, p: MX | SX): + def next_x(self, h: float, t: float, x_prev: MX | SX, u: MX | SX, p: MX | SX, s: MX | SX): """ Compute the next integrated state @@ -341,13 +343,15 @@ def next_x(self, h: float, t: float, x_prev: MX | SX, u: MX | SX, p: MX | SX): The control of the system p: MX | SX The parameters of the system + s: MX | SX + The stochastic variables of the system Returns ------- The next integrate states """ - k1 = self.fun(x_prev, self.get_u(u, t), p)[:, self.idx] - return x_prev + h * self.fun(x_prev + h / 2 * k1, self.get_u(u, t + self.h_norm / 2), p)[:, self.idx] + k1 = self.fun(x_prev, self.get_u(u, t), p, s)[:, self.idx] + return x_prev + h * self.fun(x_prev + h / 2 * k1, self.get_u(u, t + self.h_norm / 2), p, s)[:, self.idx] class RK4(RK): @@ -373,7 +377,7 @@ def __init__(self, ode: dict, ode_opt: dict): super(RK4, self).__init__(ode, ode_opt) self._finish_init() - def next_x(self, h: float, t: float, x_prev: MX | SX, u: MX | SX, p: MX | SX): + def next_x(self, h: float, t: float, x_prev: MX | SX, u: MX | SX, p: MX | SX, s: MX | SX): """ Compute the next integrated state @@ -389,16 +393,18 @@ def next_x(self, h: float, t: float, x_prev: MX | SX, u: MX | SX, p: MX | SX): The control of the system p: MX | SX The parameters of the system + s: MX | SX + The stochastic variables of the system Returns ------- The next integrate states """ - k1 = self.fun(x_prev, self.get_u(u, t), p)[:, self.idx] - k2 = self.fun(x_prev + h / 2 * k1, self.get_u(u, t + self.h_norm / 2), p)[:, self.idx] - k3 = self.fun(x_prev + h / 2 * k2, self.get_u(u, t + self.h_norm / 2), p)[:, self.idx] - k4 = self.fun(x_prev + h * k3, self.get_u(u, t + self.h_norm), p)[:, self.idx] + k1 = self.fun(x_prev, self.get_u(u, t), p, s)[:, self.idx] + k2 = self.fun(x_prev + h / 2 * k1, self.get_u(u, t + self.h_norm / 2), p, s)[:, self.idx] + k3 = self.fun(x_prev + h / 2 * k2, self.get_u(u, t + self.h_norm / 2), p, s)[:, self.idx] + k4 = self.fun(x_prev + h * k3, self.get_u(u, t + self.h_norm), p, s)[:, self.idx] return x_prev + h / 6 * (k1 + 2 * k2 + 2 * k3 + k4) @@ -425,7 +431,7 @@ def __init__(self, ode: dict, ode_opt: dict): super(RK8, self).__init__(ode, ode_opt) self._finish_init() - def next_x(self, h: float, t: float, x_prev: MX | SX, u: MX | SX, p: MX | SX): + def next_x(self, h: float, t: float, x_prev: MX | SX, u: MX | SX, p: MX | SX, s: MX | SX): """ Compute the next integrated state @@ -441,40 +447,42 @@ def next_x(self, h: float, t: float, x_prev: MX | SX, u: MX | SX, p: MX | SX): The control of the system p: MX | SX The parameters of the system + s: MX | SX + The stochastic variables of the system Returns ------- The next integrate states """ - k1 = self.fun(x_prev, self.get_u(u, t), p)[:, self.idx] - k2 = self.fun(x_prev + (h * 4 / 27) * k1, self.get_u(u, t + self.h_norm * (4 / 27)), p)[:, self.idx] - k3 = self.fun(x_prev + (h / 18) * (k1 + 3 * k2), self.get_u(u, t + self.h_norm * (2 / 9)), p)[:, self.idx] - k4 = self.fun(x_prev + (h / 12) * (k1 + 3 * k3), self.get_u(u, t + self.h_norm * (1 / 3)), p)[:, self.idx] - k5 = self.fun(x_prev + (h / 8) * (k1 + 3 * k4), self.get_u(u, t + self.h_norm * (1 / 2)), p)[:, self.idx] + k1 = self.fun(x_prev, self.get_u(u, t), p, s)[:, self.idx] + k2 = self.fun(x_prev + (h * 4 / 27) * k1, self.get_u(u, t + self.h_norm * (4 / 27)), p, s)[:, self.idx] + k3 = self.fun(x_prev + (h / 18) * (k1 + 3 * k2), self.get_u(u, t + self.h_norm * (2 / 9)), p, s)[:, self.idx] + k4 = self.fun(x_prev + (h / 12) * (k1 + 3 * k3), self.get_u(u, t + self.h_norm * (1 / 3)), p, s)[:, self.idx] + k5 = self.fun(x_prev + (h / 8) * (k1 + 3 * k4), self.get_u(u, t + self.h_norm * (1 / 2)), p, s)[:, self.idx] k6 = self.fun( - x_prev + (h / 54) * (13 * k1 - 27 * k3 + 42 * k4 + 8 * k5), self.get_u(u, t + self.h_norm * (2 / 3)), p + x_prev + (h / 54) * (13 * k1 - 27 * k3 + 42 * k4 + 8 * k5), self.get_u(u, t + self.h_norm * (2 / 3)), p, s )[:, self.idx] k7 = self.fun( x_prev + (h / 4320) * (389 * k1 - 54 * k3 + 966 * k4 - 824 * k5 + 243 * k6), self.get_u(u, t + self.h_norm * (1 / 6)), - p, + p, s, )[:, self.idx] k8 = self.fun( x_prev + (h / 20) * (-234 * k1 + 81 * k3 - 1164 * k4 + 656 * k5 - 122 * k6 + 800 * k7), self.get_u(u, t + self.h_norm), - p, + p, s, )[:, self.idx] k9 = self.fun( x_prev + (h / 288) * (-127 * k1 + 18 * k3 - 678 * k4 + 456 * k5 - 9 * k6 + 576 * k7 + 4 * k8), self.get_u(u, t + self.h_norm * (5 / 6)), - p, + p, s, )[:, self.idx] k10 = self.fun( x_prev + (h / 820) * (1481 * k1 - 81 * k3 + 7104 * k4 - 3376 * k5 + 72 * k6 - 5040 * k7 - 60 * k8 + 720 * k9), self.get_u(u, t + self.h_norm), - p, + p, s, )[:, self.idx] return x_prev + h / 840 * (41 * k1 + 27 * k4 + 272 * k5 + 27 * k6 + 216 * k7 + 216 * k9 + 41 * k10) @@ -574,7 +582,7 @@ def get_u(self, u: np.ndarray, dt_norm: float) -> np.ndarray: else: raise NotImplementedError(f"{self.control_type} ControlType not implemented yet with COLLOCATION") - def dxdt(self, h: float, states: MX | SX, controls: MX | SX, params: MX | SX, param_scaling) -> tuple: + def dxdt(self, h: float, states: MX | SX, controls: MX | SX, params: MX | SX, param_scaling, stochastic_variables: MX | SX) -> tuple: """ The dynamics of the system @@ -588,6 +596,10 @@ def dxdt(self, h: float, states: MX | SX, controls: MX | SX, params: MX | SX, pa The controls of the system params: MX | SX The parameters of the system + param_scaling: MX | SX + The parameters scaling of the system + stochastic_variables: MX | SX + The stochastic variables of the system Returns ------- @@ -604,12 +616,12 @@ def dxdt(self, h: float, states: MX | SX, controls: MX | SX, params: MX | SX, pa xp_j += self._c[r, j] * states[r] if self.defects_type == DefectType.EXPLICIT: - f_j = self.fun(states[j], self.get_u(controls, self.step_time[j]), params * param_scaling)[:, self.idx] + f_j = self.fun(states[j], self.get_u(controls, self.step_time[j]), params * param_scaling, stochastic_variables)[:, self.idx] defects.append(h * f_j - xp_j) elif self.defects_type == DefectType.IMPLICIT: defects.append( self.implicit_fun( - states[j], self.get_u(controls, self.step_time[j]), params * param_scaling, xp_j / h + states[j], self.get_u(controls, self.step_time[j]), params * param_scaling, stochastic_variables, xp_j / h, ) ) else: @@ -629,9 +641,9 @@ def _finish_init(self): self.function = Function( "integrator", - [horzcat(*self.x_sym), self.u_sym, self.param_sym], - self.dxdt(self.h, self.x_sym, self.u_sym, self.param_sym, self.param_scaling), - ["x0", "p", "params"], + [horzcat(*self.x_sym), self.u_sym, self.param_sym, self.stochastic_variables_sym], + self.dxdt(self.h, self.x_sym, self.u_sym, self.param_sym, self.param_scaling, self.stochastic_variables_sym), + ["x0", "p", "params", "s"], ["xf", "xall", "defects"], ) @@ -705,9 +717,9 @@ def _finish_init(self): self.function = Function( "integrator", - [self.x_sym[0], self.u_sym, self.param_sym], - self.dxdt(self.h, self.x_sym, self.u_sym, self.param_sym, self.param_scaling), - ["x0", "p", "params"], + [self.x_sym[0], self.u_sym, self.param_sym, self.stochastic_variables_sym], + self.dxdt(self.h, self.x_sym, self.u_sym, self.param_sym, self.param_scaling, self.stochastic_variables_sym), + ["x0", "p", "params", "s"], ["xf", "xall"], ) From e4c6f7d4c9479592e4fac3bbb9fe9c6d7f00a278 Mon Sep 17 00:00:00 2001 From: Mac-eve Date: Tue, 11 Jul 2023 21:46:18 +0200 Subject: [PATCH 16/54] updated examples --- bioptim/examples/getting_started/pendulum.py | 5 ++ .../arm_reaching_muscle_driven.py | 51 ++++++++++++++----- 2 files changed, 43 insertions(+), 13 deletions(-) diff --git a/bioptim/examples/getting_started/pendulum.py b/bioptim/examples/getting_started/pendulum.py index 0c0c9d1c6..de4546be8 100644 --- a/bioptim/examples/getting_started/pendulum.py +++ b/bioptim/examples/getting_started/pendulum.py @@ -93,6 +93,9 @@ def prepare_ocp( u_init = InitialGuessList() u_init["tau"] = [0] * n_tau + s_bounds = BoundsList() + s_init = InitialGuessList() + return OptimalControlProgram( bio_model, dynamics, @@ -100,8 +103,10 @@ def prepare_ocp( final_time, x_init=x_init, u_init=u_init, + s_init=s_init, x_bounds=x_bounds, u_bounds=u_bounds, + s_bounds=s_bounds, objective_functions=objective_functions, ode_solver=ode_solver, use_sx=use_sx, diff --git a/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py b/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py index c0867ee12..65dfce8b4 100644 --- a/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py +++ b/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py @@ -22,8 +22,7 @@ from bioptim import ( OptimalControlProgram, StochasticOptimalControlProgram, - Bounds, - InitialGuess, + InitialGuessList, ObjectiveFcn, Solver, ObjectiveList, @@ -622,12 +621,14 @@ def prepare_socp( states_max = np.ones((n_states, n_shooting+1)) * cas.inf x_bounds = BoundsList() - x_bounds.add(bounds=Bounds(states_min, states_max, interpolation=InterpolationType.EACH_FRAME)) + x_bounds.add("q", min_bound=states_min[:n_q, :], max_bound=states_max[:n_q, :], interpolation=InterpolationType.EACH_FRAME) + x_bounds.add("qdot", min_bound=states_min[n_q:n_q+n_qdot, :], max_bound=states_max[n_q:n_q+n_qdot, :], interpolation=InterpolationType.EACH_FRAME) + x_bounds.add("muscles", min_bound=states_min[n_q+n_qdot:, :], max_bound=states_max[n_q+n_qdot:, :], interpolation=InterpolationType.EACH_FRAME) u_bounds = BoundsList() controls_min = np.ones((n_muscles, 3)) * -cas.inf controls_max = np.ones((n_muscles, 3)) * cas.inf - u_bounds.add(bounds=Bounds(controls_min, controls_max)) + u_bounds.add("muscles", min_bound=controls_min, max_bound=controls_max) input_sol_FLAG = False # True if input_sol_FLAG: @@ -654,35 +655,59 @@ def prepare_socp( states_init[n_q + n_qdot:, :] = 0.01 else: states_init = cas.vertcat(q_sol, qdot_sol, activations_sol) - x_init = InitialGuess(states_init, interpolation=InterpolationType.EACH_FRAME) + x_init = InitialGuessList() + x_init.add("q", initial_guess=states_init[:n_q, :], interpolation=InterpolationType.EACH_FRAME) + x_init.add("qdot", initial_guess=states_init[n_q:n_q+n_qdot, :], interpolation=InterpolationType.EACH_FRAME) + x_init.add("muscles", initial_guess=states_init[n_q+n_qdot:, :], interpolation=InterpolationType.EACH_FRAME) if not input_sol_FLAG: controls_init = np.ones((n_muscles, n_shooting)) * 0.01 else: controls_init = excitations_sol[:, :-1] - u_init = InitialGuess(controls_init, interpolation=InterpolationType.EACH_FRAME) + u_init = InitialGuessList() + u_init.add("muscles", initial_guess=controls_init, interpolation=InterpolationType.EACH_FRAME) # TODO: This should probably be done automatically, not defined by the user n_stochastic = n_muscles*(n_q + n_qdot) + n_q+n_qdot + n_states*n_states # K(6x4) + ee_ref(4x1) + M(10x10) + s_init = InitialGuessList() + s_bounds = BoundsList() + stochastic_min = np.ones((n_stochastic, 3)) * -cas.inf + stochastic_max = np.ones((n_stochastic, 3)) * cas.inf if not input_sol_FLAG: stochastic_init = np.zeros((n_stochastic, n_shooting + 1)) curent_index = 0 stochastic_init[:n_muscles * (n_q + n_qdot), :] = 0.01 # K + s_init.add("k", initial_guess=stochastic_init[:n_muscles * (n_q + n_qdot), :], interpolation=InterpolationType.EACH_FRAME) + s_bounds.add("k", min_bound=stochastic_min[:n_muscles * (n_q + n_qdot), :], max_bound=stochastic_max[:n_muscles * (n_q + n_qdot), :]) curent_index += n_muscles * (n_q + n_qdot) stochastic_init[curent_index: curent_index + n_q + n_qdot, :] = 0.01 # ee_ref # stochastic_init[curent_index : curent_index + n_q+n_qdot, 0] = np.array([ee_initial_position[0], ee_initial_position[1], 0, 0]) # ee_ref # stochastic_init[curent_index : curent_index + n_q+n_qdot, 1] = np.array([ee_final_position[0], ee_final_position[1], 0, 0]) + s_init.add("ee_ref", initial_guess=stochastic_init[curent_index: curent_index + n_q + n_qdot, :], + interpolation=InterpolationType.EACH_FRAME) + s_bounds.add("ee_ref", min_bound=stochastic_min[curent_index: curent_index + n_q + n_qdot, :], max_bound=stochastic_max[curent_index: curent_index + n_q + n_qdot, :]) curent_index += n_q + n_qdot stochastic_init[curent_index: curent_index + n_states * n_states, :] = 0.01 # M + s_init.add("m", initial_guess=stochastic_init[curent_index: curent_index + n_states * n_states, :], interpolation=InterpolationType.EACH_FRAME) + s_bounds.add("m", min_bound=stochastic_min[curent_index: curent_index + n_states * n_states, :], + max_bound=stochastic_max[curent_index: curent_index + n_states * n_states, :]) else: stochastic_init = stochastic_variables_sol - s_init = InitialGuess(stochastic_init, interpolation=InterpolationType.EACH_FRAME) - - s_bounds = BoundsList() - stochastic_min = np.ones((n_stochastic, 3)) * -cas.inf - stochastic_max = np.ones((n_stochastic, 3)) * cas.inf - s_bounds.add(bounds=Bounds(stochastic_min, stochastic_max)) - # TODO: we should probably change the name stochastic_variables -> helper_variables ? + curent_index = 0 + s_init.add("k", initial_guess=stochastic_init[:n_muscles * (n_q + n_qdot), :], interpolation=InterpolationType.EACH_FRAME) + s_bounds.add("k", min_bound=stochastic_min[:n_muscles * (n_q + n_qdot), :], + max_bound=stochastic_max[:n_muscles * (n_q + n_qdot), :]) + curent_index += n_muscles * (n_q + n_qdot) + s_init.add("ee_ref", initial_guess=stochastic_init[curent_index: curent_index + n_q + n_qdot, :], + interpolation=InterpolationType.EACH_FRAME) + s_bounds.add("ee_ref", min_bound=stochastic_min[curent_index: curent_index + n_q + n_qdot, :], + max_bound=stochastic_max[curent_index: curent_index + n_q + n_qdot, :]) + curent_index += n_q + n_qdot + s_init.add("m", initial_guess=stochastic_init[curent_index: curent_index + n_states * n_states, :], + interpolation=InterpolationType.EACH_FRAME) + s_bounds.add("m", min_bound=stochastic_min[curent_index: curent_index + n_states * n_states, :], + max_bound=stochastic_max[curent_index: curent_index + n_states * n_states, :]) + # TODO: we should probably change the name stochastic_variables -> helper_variables ? integrated_value_functions = {"cov": lambda nlp, node_index: get_p_mat(nlp, node_index, force_field_magnitude=force_field_magnitude, wM_magnitude=wM_magnitude, wS_magnitude=wS_magnitude)} From f1418ffac41c8738b8d3dc91787199f5308f63af Mon Sep 17 00:00:00 2001 From: Mac-eve Date: Tue, 11 Jul 2023 21:46:33 +0200 Subject: [PATCH 17/54] fixed bounds --- bioptim/optimization/non_linear_program.py | 10 ++++++++++ bioptim/optimization/optimization_vector.py | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/bioptim/optimization/non_linear_program.py b/bioptim/optimization/non_linear_program.py index 369d43c0a..9bff821e5 100644 --- a/bioptim/optimization/non_linear_program.py +++ b/bioptim/optimization/non_linear_program.py @@ -93,6 +93,13 @@ class NonLinearProgram: The casadi variables for the integration at each node of the phase states: OptimizationVariableContainer A list of all the state variables + s_bounds = Bounds() + The bounds for the stochastic variables + s_init = InitialGuess() + The initial guess for the stochastic variables + S: list[MX | SX] + The casadi variables for the stochastic variables + Methods ------- @@ -154,6 +161,9 @@ def __init__(self, assume_phase_dynamics): self.X_scaled = None self.x_scaling = None self.X = None + self.s_bounds = BoundsList() + self.s_init = InitialGuessList() + self.S = None self.assume_phase_dynamics = assume_phase_dynamics self.states = OptimizationVariableContainer(assume_phase_dynamics) self.states_dot = OptimizationVariableContainer(assume_phase_dynamics) diff --git a/bioptim/optimization/optimization_vector.py b/bioptim/optimization/optimization_vector.py index 5c9423f6e..f12910bf2 100644 --- a/bioptim/optimization/optimization_vector.py +++ b/bioptim/optimization/optimization_vector.py @@ -226,7 +226,7 @@ def bounds_vectors(ocp) -> tuple[np.ndarray, np.ndarray]: for i_phase in range(ocp.n_phases): nlp = ocp.nlp[i_phase] OptimizationVectorHelper._set_node_index(nlp, 0) - for key in nlp.stochastic_states.keys(): + for key in nlp.stochastic_variables.keys(): if key in nlp.s_bounds.keys(): nlp.s_bounds[key].check_and_adjust_dimensions(nlp.stochastic_variables[key].cx.shape[0], nlp.ns) @@ -346,7 +346,7 @@ def init_vector(ocp): nlp = ocp.nlp[i_phase] OptimizationVectorHelper._set_node_index(nlp, 0) - for key in nlp.stochastoc_variables.keys(): + for key in nlp.stochastic_variables.keys(): if key in nlp.s_init.keys(): nlp.s_init[key].check_and_adjust_dimensions(nlp.stochastic_variables[key].cx.shape[0], nlp.ns) From 0da11bcf7cbc1784e0c0fecc1f09c1c4b601c1ca Mon Sep 17 00:00:00 2001 From: Mac-eve Date: Tue, 11 Jul 2023 21:47:12 +0200 Subject: [PATCH 18/54] dissected OCP into smaller functions --- .../optimization/optimal_control_program.py | 209 ++++++++++++- .../stochastic_optimal_control_program.py | 281 ++++++++++++++++++ 2 files changed, 475 insertions(+), 15 deletions(-) diff --git a/bioptim/optimization/optimal_control_program.py b/bioptim/optimization/optimal_control_program.py index a2ac1c2d1..0936793d5 100644 --- a/bioptim/optimization/optimal_control_program.py +++ b/bioptim/optimization/optimal_control_program.py @@ -248,21 +248,134 @@ def __init__( If the dynamics of for each shooting node in phases are assumed to be the same """ - if not isinstance(bio_model, (list, tuple)): - bio_model = [bio_model] + self.check_bioptim_version() + + bio_model = self.initialize_model(bio_model) + + self.set_original_values(bio_model, + dynamics, + n_shooting, + phase_time, + x_init, + u_init, + s_init, + x_bounds, + u_bounds, + s_bounds, + x_scaling, + xdot_scaling, + u_scaling, + external_forces, + ode_solver, + control_type, + variable_mappings, + time_phase_mapping, + node_mappings, + plot_mappings, + phase_transitions, + multinode_constraints, + multinode_objectives, + parameter_bounds, + parameter_init, + parameter_constraints, + parameter_objectives, + state_continuity_weight, + n_threads, + use_sx, + assume_phase_dynamics, + integrated_value_functions,) + + constraints, objective_functions, parameter_constraints, parameter_objectives, multinode_constraints, multinode_objectives = self.check_arguments_and_build_nlp( + dynamics, + n_threads, + n_shooting, + phase_time, + x_bounds, + u_bounds, + s_bounds, + x_init, + u_init, + s_init, + x_scaling, + xdot_scaling, + u_scaling, + objective_functions, + constraints, + parameters, + phase_transitions, + multinode_constraints, + multinode_objectives, + parameter_bounds, + parameter_init, + parameter_constraints, + parameter_objectives, + ode_solver, + use_sx, + assume_phase_dynamics, + bio_model, + external_forces, + plot_mappings, + time_phase_mapping, + control_type, + variable_mappings, + integrated_value_functions, + node_mappings, + state_continuity_weight) - bio_model = self._check_quaternions_hasattr(bio_model) + self._declare_multi_node_penalties(multinode_constraints, multinode_objectives) - self.version = {"casadi": casadi.__version__, "biorbd": biorbd.__version__, "bioptim": __version__} - self.n_phases = len(bio_model) + self.finalize_penalties(skip_continuity, + state_continuity_weight, + constraints, + parameter_constraints, + objective_functions, + parameter_objectives) - if isinstance(dynamics, Dynamics): - dynamics_type_tp = DynamicsList() - dynamics_type_tp.add(dynamics) - dynamics = dynamics_type_tp - elif not isinstance(dynamics, DynamicsList): - raise RuntimeError("dynamics should be a Dynamics or a DynamicsList") + def check_bioptim_version(self): + self.version = {"casadi": casadi.__version__, "biorbd": biorbd.__version__, "bioptim": __version__} + return + def initialize_model(self, bio_model): + if not isinstance(bio_model, (list, tuple)): + bio_model = [bio_model] + bio_model = self._check_quaternions_hasattr(bio_model) + self.n_phases = len(bio_model) + return bio_model + + def set_original_values(self, + bio_model, + dynamics, + n_shooting, + phase_time, + x_init, + u_init, + s_init, + x_bounds, + u_bounds, + s_bounds, + x_scaling, + xdot_scaling, + u_scaling, + external_forces, + ode_solver, + control_type, + variable_mappings, + time_phase_mapping, + node_mappings, + plot_mappings, + phase_transitions, + multinode_constraints, + multinode_objectives, + parameter_bounds, + parameter_init, + parameter_constraints, + parameter_objectives, + state_continuity_weight, + n_threads, + use_sx, + assume_phase_dynamics, + integrated_value_functions, + ): self.original_values = { "bio_model": [m.serialize() for m in bio_model], "dynamics": dynamics, @@ -300,8 +413,52 @@ def __init__( "assume_phase_dynamics": assume_phase_dynamics, "integrated_value_functions": integrated_value_functions, } + return + + def check_arguments_and_build_nlp(self, + dynamics, + n_threads, + n_shooting, + phase_time, + x_bounds, + u_bounds, + s_bounds, + x_init, + u_init, + s_init, + x_scaling, + xdot_scaling, + u_scaling, + objective_functions, + constraints, + parameters, + phase_transitions, + multinode_constraints, + multinode_objectives, + parameter_bounds, + parameter_init, + parameter_constraints, + parameter_objectives, + ode_solver, + use_sx, + assume_phase_dynamics, + bio_model, + external_forces, + plot_mappings, + time_phase_mapping, + control_type, + variable_mappings, + integrated_value_functions, + node_mappings, + state_continuity_weight): + + if isinstance(dynamics, Dynamics): + dynamics_type_tp = DynamicsList() + dynamics_type_tp.add(dynamics) + dynamics = dynamics_type_tp + elif not isinstance(dynamics, DynamicsList): + raise RuntimeError("dynamics should be a Dynamics or a DynamicsList") - # Check integrity of arguments if not isinstance(n_threads, int) or isinstance(n_threads, bool) or n_threads < 1: raise RuntimeError("n_threads should be a positive integer greater or equal than 1") @@ -309,7 +466,8 @@ def __init__( if not isinstance(ns, int) or ns < 2: if isinstance(ns, (tuple, list)): if sum([True for i in ns if not isinstance(i, int) and not isinstance(i, bool)]) != 0: - raise RuntimeError("n_shooting should be a positive integer (or a list of) greater or equal than 2") + raise RuntimeError( + "n_shooting should be a positive integer (or a list of) greater or equal than 2") else: raise RuntimeError("n_shooting should be a positive integer (or a list of) greater or equal than 2") @@ -499,7 +657,8 @@ def __init__( self.time_phase_mapping = time_phase_mapping # Add any time related parameters to the parameters list before declaring it - self._define_time(phase_time, objective_functions, constraints, parameters, parameter_init, parameter_bounds) + self._define_time(phase_time, objective_functions, constraints, parameters, parameter_init, + parameter_bounds) # Declare and fill the parameters self.parameters = ParameterList() @@ -555,7 +714,16 @@ def __init__( # Prepare phase transitions (Reminder, it is important that parameters are declared before, # otherwise they will erase the phase_transitions) self.phase_transitions = phase_transitions.prepare_phase_transitions(self, state_continuity_weight) - self._declare_multi_node_penalties(multinode_constraints, multinode_objectives) + + return constraints, objective_functions, parameter_constraints, parameter_objectives, multinode_constraints, multinode_objectives + + def finalize_penalties(self, + skip_continuity, + state_continuity_weight, + constraints, + parameter_constraints, + objective_functions, + parameter_objectives): # Skipping creates an OCP without built-in continuity constraints, make sure you declared constraints elsewhere if not skip_continuity: @@ -569,6 +737,7 @@ def __init__( # Prepare objectives self.update_objectives(objective_functions) self.update_parameter_objectives(parameter_objectives) + return @property def variables_vector(self): @@ -951,6 +1120,7 @@ def update_initial_guess( x_init: InitialGuessList = None, u_init: InitialGuessList = None, parameter_init: InitialGuessList = None, + s_init: InitialGuessList = None, ): """ The main user interface to add initial guesses in the ocp @@ -963,6 +1133,8 @@ def update_initial_guess( The control initial guess to add parameter_init: BoundsList The parameters initial guess to add + s_init: BoundsList + The stochastic variable initial guess to add """ for i in range(self.n_phases): @@ -990,6 +1162,13 @@ def update_initial_guess( raise ValueError("InterpolationType.ALL_POINTS must only be used with direct collocation") self.nlp[i].u_init.add(key, u_init[origin_phase][key], phase=0) + if s_init: + if not isinstance(s_init, InitialGuessList): + raise RuntimeError("s_init should be built from a InitialGuessList") + origin_phase = 0 if len(s_init) == 1 else i + for key in s_init[origin_phase].keys(): + self.nlp[i].s_init.add(key, s_init[origin_phase][key], phase=0) + if parameter_init is not None: if not isinstance(parameter_init, InitialGuessList): raise RuntimeError("parameter_init should be built from a InitialGuessList") diff --git a/bioptim/optimization/stochastic_optimal_control_program.py b/bioptim/optimization/stochastic_optimal_control_program.py index e69de29bb..87098d107 100644 --- a/bioptim/optimization/stochastic_optimal_control_program.py +++ b/bioptim/optimization/stochastic_optimal_control_program.py @@ -0,0 +1,281 @@ +from typing import Callable, Any + +from ..dynamics.configure_problem import DynamicsList, Dynamics +from ..dynamics.ode_solver import OdeSolver, OdeSolverBase +from ..interfaces.biomodel import BioModel +from ..limits.constraints import ( + ConstraintFcn, + ConstraintList, + Constraint, + ParameterConstraintList, + ParameterConstraint, +) +from ..limits.phase_transition import PhaseTransitionList +from ..limits.multinode_constraint import MultinodeConstraintList, MultinodeConstraintFcn +from ..limits.multinode_objective import MultinodeObjectiveList +from ..limits.objective_functions import ObjectiveList, Objective, ParameterObjectiveList, ParameterObjective +from ..limits.path_conditions import BoundsList, Bounds +from ..limits.path_conditions import InitialGuess, InitialGuessList +from ..misc.enums import ( + Node, + ControlType +) +from ..misc.mapping import BiMappingList, Mapping, NodeMappingList, BiMapping +from ..optimization.parameters import ParameterList, Parameter +from ..optimization.problem_type import OcpType +from ..optimization.optimal_control_program import OptimalControlProgram +from .. optimization.variable_scaling import VariableScalingList, VariableScaling + + + +class StochasticOptimalControlProgram(OptimalControlProgram): + """ + The main class to define a stochastic ocp. This class prepares the full program and gives all + the needed interface to modify and solve the program + """ + + def __init__( + self, + bio_model: list | tuple | BioModel, + dynamics: Dynamics | DynamicsList, + n_shooting: int | list | tuple, + phase_time: int | float | list | tuple, + x_bounds: BoundsList = None, + u_bounds: BoundsList = None, + s_bounds: BoundsList = None, + x_init: InitialGuessList | None = None, + u_init: InitialGuessList | None = None, + s_init: InitialGuessList | None = None, + objective_functions: Objective | ObjectiveList = None, + constraints: Constraint | ConstraintList = None, + parameters: ParameterList = None, + parameter_bounds: BoundsList = None, + parameter_init: InitialGuessList = None, + parameter_objectives: ParameterObjectiveList = None, + parameter_constraints: ParameterConstraintList = None, + external_forces: list[list[Any], ...] | tuple[list[Any], ...] = None, + ode_solver: list | OdeSolverBase | OdeSolver = None, + control_type: ControlType | list = ControlType.CONSTANT, + variable_mappings: BiMappingList = None, + time_phase_mapping: BiMapping = None, + node_mappings: NodeMappingList = None, + plot_mappings: Mapping = None, + phase_transitions: PhaseTransitionList = None, + multinode_constraints: MultinodeConstraintList = None, + multinode_objectives: MultinodeObjectiveList = None, + x_scaling: VariableScalingList = None, + xdot_scaling: VariableScalingList = None, + u_scaling: VariableScalingList = None, + state_continuity_weight: float = None, # TODO: docstring + n_threads: int = 1, + use_sx: bool = False, + skip_continuity: bool = False, + assume_phase_dynamics: bool = False, + integrated_value_functions: dict[Callable] = None, + problem_type: OcpType = OcpType.SOCP_EXPLICIT, + **kwargs, + ): + """ + """ + + if "n_thread" in kwargs: + if kwargs["n_thread"] != 1: + raise ValueError( + "Multi-threading is not possible yet while solving a stochactic ocp." + "n_thread is set to 1 by default." + ) + + self.n_threads = 1 + + if "assume_phase_dynamics" in kwargs: + if kwargs["assume_phase_dynamics"]: + raise ValueError( + "The dynamics cannot be assumed to be the same between phases with a stochactic ocp." + "assume_phase_dynamics is set to False by default." + ) + + self.assume_phase_dynamics = False + + self.check_bioptim_version() + + bio_model = self.initialize_model(bio_model) + + self.set_original_values(bio_model, + dynamics, + n_shooting, + phase_time, + x_init, + u_init, + s_init, + x_bounds, + u_bounds, + s_bounds, + x_scaling, + xdot_scaling, + u_scaling, + external_forces, + ode_solver, + control_type, + variable_mappings, + time_phase_mapping, + node_mappings, + plot_mappings, + phase_transitions, + multinode_constraints, + multinode_objectives, + parameter_bounds, + parameter_init, + parameter_constraints, + parameter_objectives, + state_continuity_weight, + n_threads, + use_sx, + assume_phase_dynamics, + integrated_value_functions,) + + constraints, objective_functions, parameter_constraints, parameter_objectives, multinode_constraints, multinode_objectives = self.check_arguments_and_build_nlp( + dynamics, + n_threads, + n_shooting, + phase_time, + x_bounds, + u_bounds, + s_bounds, + x_init, + u_init, + s_init, + x_scaling, + xdot_scaling, + u_scaling, + objective_functions, + constraints, + parameters, + phase_transitions, + multinode_constraints, + multinode_objectives, + parameter_bounds, + parameter_init, + parameter_constraints, + parameter_objectives, + ode_solver, + use_sx, + assume_phase_dynamics, + bio_model, + external_forces, + plot_mappings, + time_phase_mapping, + control_type, + variable_mappings, + integrated_value_functions, + node_mappings, + state_continuity_weight) + + self.problem_type = problem_type + self._declare_multi_node_penalties(multinode_constraints, multinode_objectives) + + self.finalize_penalties(skip_continuity, + state_continuity_weight, + constraints, + parameter_constraints, + objective_functions, + parameter_objectives) + + + def _declare_multi_node_penalties(self, multinode_constraints: ConstraintList, multinode_objectives: ObjectiveList): + multinode_constraints.add_or_replace_to_penalty_pool(self) + multinode_objectives.add_or_replace_to_penalty_pool(self) + + # Add the internal multi-node constraints for the stochastic ocp + if isinstance(self.problem_type, OcpType.SOCP_EXPLICIT): + self._prepare_stochastic_dynamics_explicit(wM_magnitude=self.problem_type.wM_magnitude, + wS_magnitude=self.problem_type.wS_magnitude) + elif isinstance(self.problem_type, OcpType.SOCP_IMPLICIT): + self._prepare_stochastic_dynamics_implicit(wM_magnitude=self.problem_type.wM_magnitude, + wS_magnitude=self.problem_type.wS_magnitude) + + + def _prepare_stochastic_dynamics_explicit(self, wM_magnitude, wS_magnitude): + """ + ... + """ + penalty_m_dg_dz_list = MultinodeConstraintList() + for i_phase, nlp in enumerate(self.nlp): + for i_node in range(nlp.ns - 1): + penalty_m_dg_dz_list.add( + MultinodeConstraintFcn.M_EQUALS_INVERSE_OF_DG_DZ, + nodes_phase=(i_phase, i_phase), + nodes=(i_node, i_node+1), + dynamics=nlp.dynamics_type.dynamic_function, + wM_magnitude=wM_magnitude, + wS_magnitude=wS_magnitude, + ) + if i_phase > 0: # TODO: verify with Friedl, but should be OK + penalty_m_dg_dz_list.add( + MultinodeConstraintFcn.M_EQUALS_INVERSE_OF_DG_DZ, + nodes_phase=(i_phase-1, i_phase), + nodes=(-1, 0), + dynamics=nlp.dynamics_type.dynamic_function, + wM_magnitude=wM_magnitude, + wS_magnitude=wS_magnitude, + ) + penalty_m_dg_dz_list.add_or_replace_to_penalty_pool(self) + + + def _prepare_stochastic_dynamics_implicit(self, wM_magnitude, wS_magnitude): + """ + ... + """ + # constrain A, C, P, M TODO: some are missing + multi_node_penalties = MultinodeConstraintList() + single_node_penalties = ConstraintList() + # constrain M + for i_phase, nlp in enumerate(self.nlp): + for i_node in range(nlp.ns - 1): + multi_node_penalties.add( + MultinodeConstraintFcn.M_EQUALS_INVERSE_OF_DG_DZ, + nodes_phase=(i_phase, i_phase), + nodes=(i_node, i_node+1), + dynamics=nlp.dynamics_type.dynamic_function, + wM_magnitude=wM_magnitude, + wS_magnitude=wS_magnitude, + ) + if i_phase > 0: # TODO: verify with Friedl, but should be OK + multi_node_penalties.add( + MultinodeConstraintFcn.M_EQUALS_INVERSE_OF_DG_DZ, + nodes_phase=(i_phase-1, i_phase), + nodes=(-1, 0), + dynamics=nlp.dynamics_type.dynamic_function, + wM_magnitude=wM_magnitude, + wS_magnitude=wS_magnitude, + ) + + # Constrain P + for i_phase, nlp in enumerate(self.nlp): + single_node_penalties.add(ConstraintFcn.COVARIANCE_MATRIX_CONINUITY_IMPLICIT, node=Node.ALL, phase=i_phase, + wM_magnitude=wM_magnitude, wS_magnitude=wS_magnitude) + if i_phase > 0: + multi_node_penalties.add( # TODO: check + MultinodeConstraintFcn.COVARIANCE_MATRIX_CONINUITY_IMPLICIT, # TODO: to be continued in penalty + nodes_phase=(i_phase-1, i_phase), + nodes=(-1, 0), + wM_magnitude=wM_magnitude, + wS_magnitude=wS_magnitude, + ) + # Constrain A + for i_phase, nlp in enumerate(self.nlp): + single_node_penalties.add(ConstraintFcn.A_EQUALS_DF_DX, + node=Node.ALL, phase=i_phase, + wM_magnitude=wM_magnitude, + wS_magnitude=wS_magnitude, + ) + + # Constrain C + for i_phase, nlp in enumerate(self.nlp): + single_node_penalties.add(ConstraintFcn.C_EQUALS_DF_DW, + node=Node.ALL, phase=i_phase, + wM_magnitude=wM_magnitude, + wS_magnitude=wS_magnitude, + ) + + multi_node_penalties.add_or_replace_to_penalty_pool(self) + single_node_penalties.add_or_replace_to_penalty_pool(self) From b9db0cfc221347be8dc65fa6e89b3c06a30df7e9 Mon Sep 17 00:00:00 2001 From: Charbie Date: Wed, 12 Jul 2023 10:14:35 +0200 Subject: [PATCH 19/54] copy-pasting error fix --- bioptim/interfaces/interface_utils.py | 2 +- bioptim/limits/penalty_controller.py | 4 ++-- bioptim/limits/penalty_option.py | 2 +- bioptim/optimization/optimal_control_program.py | 2 +- bioptim/optimization/optimization_vector.py | 10 +++++----- bioptim/optimization/solution.py | 2 +- .../optimization/stochastic_optimal_control_program.py | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/bioptim/interfaces/interface_utils.py b/bioptim/interfaces/interface_utils.py index 28f497572..dc52e67d7 100644 --- a/bioptim/interfaces/interface_utils.py +++ b/bioptim/interfaces/interface_utils.py @@ -265,7 +265,7 @@ def get_control_modificator(index): _u = [] else: _u = nlp.U_scaled[_idx][:, 0] if _idx < len(nlp.U_scaled) else [] - _s = nlp.S[_idx][:, 0] + _s = nlp.S[_idx][:, 0] if _penalty.derivative or _penalty.explicit_derivative: if _idx < nlp.ns: diff --git a/bioptim/limits/penalty_controller.py b/bioptim/limits/penalty_controller.py index c44575bd8..45bbc753b 100644 --- a/bioptim/limits/penalty_controller.py +++ b/bioptim/limits/penalty_controller.py @@ -146,7 +146,7 @@ def stochastic_variables(self) -> OptimizationVariableList: The stochastic_variables at node node_index """ self._nlp.stochastic_variables.node_index = self.node_index - out = self._nlp.stochastic_variables.unscaled + out = self._nlp.stochastic_variables out.current_cx_to_get = self.cx_index_to_get return out @@ -159,7 +159,7 @@ def integrated_values(self) -> OptimizationVariableList: The integrated_values at node node_index """ self._nlp.integrated_values.node_index = self.node_index - out = self._nlp.integrated_values.unscaled + out = self._nlp.integrated_values out.current_cx_to_get = self.cx_index_to_get return out diff --git a/bioptim/limits/penalty_option.py b/bioptim/limits/penalty_option.py index d3a44e5cd..81fe1b04b 100644 --- a/bioptim/limits/penalty_option.py +++ b/bioptim/limits/penalty_option.py @@ -442,7 +442,7 @@ def get_u(u: MX | SX, dt: MX | SX): for ctrl in controllers: state_cx_scaled = vertcat(state_cx_scaled, ctrl.states_scaled.cx) control_cx_scaled = vertcat(control_cx_scaled, ctrl.controls_scaled.cx) - stochastic_cx_scaled = vertcat(stochastic_cx_scaled, ctrl.stochastic_variables.cx) + stochastic_cx_scaled = vertcat(stochastic_cx_scaled, ctrl.stochastic_variables.unscaled.cx) else: ocp = controller.ocp diff --git a/bioptim/optimization/optimal_control_program.py b/bioptim/optimization/optimal_control_program.py index 0936793d5..6c09e8dbd 100644 --- a/bioptim/optimization/optimal_control_program.py +++ b/bioptim/optimization/optimal_control_program.py @@ -176,7 +176,7 @@ def __init__( use_sx: bool = False, skip_continuity: bool = False, assume_phase_dynamics: bool = False, - integrated_value_functions: dict[Callable] = None, + integrated_value_functions: dict[str, Callable] = None, ): """ Parameters diff --git a/bioptim/optimization/optimization_vector.py b/bioptim/optimization/optimization_vector.py index f12910bf2..9e181a3e5 100644 --- a/bioptim/optimization/optimization_vector.py +++ b/bioptim/optimization/optimization_vector.py @@ -243,8 +243,8 @@ def bounds_vectors(ocp) -> tuple[np.ndarray, np.ndarray]: value_max = np.inf # Organize the stochastic variables according to the correct indices - collapsed_values_min[nlp.states[key].index, :] = value_min - collapsed_values_max[nlp.states[key].index, :] = value_max + collapsed_values_min[nlp.stochastic_variables[key].index, :] = np.reshape(value_min, (-1, 1)) + collapsed_values_max[nlp.stochastic_variables[key].index, :] = np.reshape(value_max, (-1, 1)) v_bounds_min = np.concatenate((v_bounds_min, np.reshape(collapsed_values_min.T, (-1, 1)))) v_bounds_max = np.concatenate((v_bounds_max, np.reshape(collapsed_values_max.T, (-1, 1)))) @@ -431,12 +431,12 @@ def to_dictionaries(ocp, data: np.ndarray | DM) -> tuple: nlp.ns + (1 if nlp.control_type in (ControlType.LINEAR_CONTINUOUS,) else 0), ) ) - for key in ocp.nlp[p].controls + for key in nlp.controls.keys() } ) data_stochastic_variables.append( { - key: np.ndarray((nlp.controls[key].shape, nlp.ns + 1)) + key: np.ndarray((nlp.stochastic_variables[key].shape, nlp.ns + 1)) for key in ocp.nlp[p].stochastic_variables } ) @@ -480,7 +480,7 @@ def to_dictionaries(ocp, data: np.ndarray | DM) -> tuple: nlp.controls.node_index = k u_array = v_array[offset : offset + nu].reshape((nlp.controls.scaled.shape, -1), order="F") for key in nlp.controls: - data_controls[p_idx][key][:, k : k + 1] = u_array[nlp.controls[key].index, :] + data_controls[p_idx][key][:, k: k + 1] = u_array[nlp.controls[key].index, :] offset += nu p_idx += 1 diff --git a/bioptim/optimization/solution.py b/bioptim/optimization/solution.py index d20f903d0..920017d50 100644 --- a/bioptim/optimization/solution.py +++ b/bioptim/optimization/solution.py @@ -538,7 +538,7 @@ def _to_unscaled_values(self, states_scaled, controls_scaled) -> tuple: ocp = self.ocp states = [{} for _ in range(len(states_scaled))] - controls = [{} for _ in range(len(states_scaled))] + controls = [{} for _ in range(len(controls_scaled))] for phase in range(len(states_scaled)): states[phase] = {} controls[phase] = {} diff --git a/bioptim/optimization/stochastic_optimal_control_program.py b/bioptim/optimization/stochastic_optimal_control_program.py index 87098d107..94fde5b0f 100644 --- a/bioptim/optimization/stochastic_optimal_control_program.py +++ b/bioptim/optimization/stochastic_optimal_control_program.py @@ -71,7 +71,7 @@ def __init__( use_sx: bool = False, skip_continuity: bool = False, assume_phase_dynamics: bool = False, - integrated_value_functions: dict[Callable] = None, + integrated_value_functions: dict[str, Callable] = None, problem_type: OcpType = OcpType.SOCP_EXPLICIT, **kwargs, ): From a5d42514ece8f016dbd751a29ed621518740bcc2 Mon Sep 17 00:00:00 2001 From: Charbie Date: Wed, 12 Jul 2023 11:36:00 +0200 Subject: [PATCH 20/54] Problem here! --- .../stochastic_optimal_control/arm_reaching_muscle_driven.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py b/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py index 65dfce8b4..611639972 100644 --- a/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py +++ b/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py @@ -318,6 +318,7 @@ def configure_stochastic_optimal_control_problem(ocp: OptimalControlProgram, nlp ConfigureProblem.configure_qdot(ocp, nlp, True, False, True) ConfigureProblem.configure_qddot(ocp, nlp, False, False, True) ConfigureProblem.configure_muscles(ocp, nlp, True, True) # Muscles activations as states + muscles excitations as controls + ocp.nlp[0].controls = nlp.controls # Seems like I broke the link between nlp and ocp :( @ Pariterre ? # Stochastic variables ConfigureProblem.configure_stochastic_k(ocp, nlp, n_noised_controls=6, n_feedbacks=4) @@ -520,7 +521,7 @@ def prepare_socp( wS_magnitude: cas.DM, force_field_magnitude: float = 0, problem_type: str = "CIRCLE", -) -> OptimalControlProgram: +) -> StochasticOptimalControlProgram: """ The initialization of an ocp Parameters From 595ea0c587a574242857daa477bad819c362ab33 Mon Sep 17 00:00:00 2001 From: Charbie Date: Wed, 12 Jul 2023 14:52:36 +0200 Subject: [PATCH 21/54] fixed the graphs --- bioptim/dynamics/configure_problem.py | 18 +++---- .../muscle_activations_tracker.py | 1 + .../muscle_excitations_tracker.py | 1 + bioptim/gui/plot.py | 54 ++++++++++++++++--- bioptim/interfaces/solve_ivp_interface.py | 16 +++--- .../optimization/optimal_control_program.py | 15 ++++-- bioptim/optimization/optimization_vector.py | 19 +++---- bioptim/optimization/solution.py | 5 +- 8 files changed, 89 insertions(+), 40 deletions(-) diff --git a/bioptim/dynamics/configure_problem.py b/bioptim/dynamics/configure_problem.py index f4ce3a3de..7e723a882 100644 --- a/bioptim/dynamics/configure_problem.py +++ b/bioptim/dynamics/configure_problem.py @@ -729,7 +729,7 @@ def configure_contact_function(ocp, nlp, dyn_func: Callable, **extra_params): ) nlp.plot["contact_forces"] = CustomPlot( - lambda t, x, u, p: nlp.contact_forces_func(x, u, p), + lambda t, x, u, p, s: nlp.contact_forces_func(x, u, p, s), plot_type=PlotType.INTEGRATED, axes_idx=axes_idx, legend=all_contact_names, @@ -792,7 +792,7 @@ def configure_soft_contact_function(ocp, nlp): to_second=[i for i, c in enumerate(all_soft_contact_names) if c in soft_contact_names_in_phase], ) nlp.plot[f"soft_contact_forces_{nlp.model.soft_contact_names[i_sc]}"] = CustomPlot( - lambda t, x, u, p: nlp.soft_contact_forces_func(x, u, p)[(i_sc * 6) : ((i_sc + 1) * 6), :], + lambda t, x, u, p, s: nlp.soft_contact_forces_func(x, u, p, s)[(i_sc * 6) : ((i_sc + 1) * 6), :], plot_type=PlotType.INTEGRATED, axes_idx=phase_mappings, legend=all_soft_contact_names, @@ -836,14 +836,14 @@ def _manage_fatigue_to_new_variable( legend = [f"{name}_{i}" for i in name_elements] fatigue_plot_name = f"fatigue_{name}" nlp.plot[fatigue_plot_name] = CustomPlot( - lambda t, x, u, p: x[:n_elements, :] * np.nan, + lambda t, x, u, p, s: x[:n_elements, :] * np.nan, plot_type=PlotType.INTEGRATED, legend=legend, bounds=Bounds(None, -1, 1), ) control_plot_name = f"{name}_controls" if not multi_interface and split_controls else f"{name}" nlp.plot[control_plot_name] = CustomPlot( - lambda t, x, u, p: u[:n_elements, :] * np.nan, plot_type=PlotType.STEP, legend=legend + lambda t, x, u, p, s: u[:n_elements, :] * np.nan, plot_type=PlotType.STEP, legend=legend ) var_names_with_suffix = [] @@ -858,7 +858,7 @@ def _manage_fatigue_to_new_variable( var_names_with_suffix[-1], name_elements, ocp, nlp, as_states, as_controls, skip_plot=True ) nlp.plot[f"{var_names_with_suffix[-1]}_controls"] = CustomPlot( - lambda t, x, u, p, key: u[nlp.controls[key].index, :], + lambda t, x, u, p, s, key: u[nlp.controls[key].index, :], plot_type=PlotType.STEP, combine_to=control_plot_name, key=var_names_with_suffix[-1], @@ -869,7 +869,7 @@ def _manage_fatigue_to_new_variable( f"{name}", name_elements, ocp, nlp, as_states, as_controls, skip_plot=True ) nlp.plot[f"{name}_controls"] = CustomPlot( - lambda t, x, u, p, key: u[nlp.controls[key].index, :], + lambda t, x, u, p, s, key: u[nlp.controls[key].index, :], plot_type=PlotType.STEP, combine_to=control_plot_name, key=f"{name}", @@ -880,7 +880,7 @@ def _manage_fatigue_to_new_variable( name_tp = f"{var_names_with_suffix[-1]}_{params}" ConfigureProblem.configure_new_variable(name_tp, name_elements, ocp, nlp, True, False, skip_plot=True) nlp.plot[name_tp] = CustomPlot( - lambda t, x, u, p, key, mod: mod * x[nlp.states[key].index, :], + lambda t, x, u, p, s, key, mod: mod * x[nlp.states[key].index, :], plot_type=PlotType.INTEGRATED, combine_to=fatigue_plot_name, key=name_tp, @@ -1091,7 +1091,7 @@ def define_cx_unscaled(_cx_scaled: list, scaling: np.ndarray) -> list: nlp.states.append(name, cx[0], cx_scaled[0], mx_states, nlp.variable_mappings[name], node_index) if not skip_plot: nlp.plot[f"{name}_states"] = CustomPlot( - lambda t, x, u, p: x[nlp.states[name].index, :], + lambda t, x, u, p, s: x[nlp.states[name].index, :], plot_type=PlotType.INTEGRATED, axes_idx=axes_idx, legend=legend, @@ -1121,7 +1121,7 @@ def define_cx_unscaled(_cx_scaled: list, scaling: np.ndarray) -> list: plot_type = PlotType.PLOT if nlp.control_type == ControlType.LINEAR_CONTINUOUS else PlotType.STEP if not skip_plot: nlp.plot[f"{name}_controls"] = CustomPlot( - lambda t, x, u, p: u[nlp.controls[name].index, :], + lambda t, x, u, p, s: u[nlp.controls[name].index, :], plot_type=plot_type, axes_idx=axes_idx, legend=legend, diff --git a/bioptim/examples/muscle_driven_ocp/muscle_activations_tracker.py b/bioptim/examples/muscle_driven_ocp/muscle_activations_tracker.py index 64cc08039..8c285c3cd 100644 --- a/bioptim/examples/muscle_driven_ocp/muscle_activations_tracker.py +++ b/bioptim/examples/muscle_driven_ocp/muscle_activations_tracker.py @@ -167,6 +167,7 @@ def generate_data( states=symbolic_states, controls=symbolic_controls, parameters=symbolic_parameters, + stochastic_variables=MX(), nlp=nlp, with_contact=False, rigidbody_dynamics=RigidBodyDynamics.ODE, diff --git a/bioptim/examples/muscle_driven_ocp/muscle_excitations_tracker.py b/bioptim/examples/muscle_driven_ocp/muscle_excitations_tracker.py index 7d05edf77..26bcbd9d9 100644 --- a/bioptim/examples/muscle_driven_ocp/muscle_excitations_tracker.py +++ b/bioptim/examples/muscle_driven_ocp/muscle_excitations_tracker.py @@ -169,6 +169,7 @@ def generate_data( states=symbolic_states, controls=symbolic_controls, parameters=symbolic_parameters, + stochastic_variables=MX(), nlp=nlp, with_contact=False, rigidbody_dynamics=RigidBodyDynamics.ODE, diff --git a/bioptim/gui/plot.py b/bioptim/gui/plot.py index b73a7f9e4..438f8f57e 100644 --- a/bioptim/gui/plot.py +++ b/bioptim/gui/plot.py @@ -22,7 +22,7 @@ class CustomPlot: Attributes ---------- - function: Callable[states, controls, parameters] + function: Callable[states, controls, parameters, stochasti_variables] The function to call to update the graph type: PlotType Type of plot to use @@ -66,7 +66,7 @@ def __init__( """ Parameters ---------- - update_function: Callable[states, controls, parameters] + update_function: Callable[states, controls, parameters, stochastic_variables] The function to call to update the graph plot_type: PlotType Type of plot to use @@ -343,6 +343,7 @@ def legend_without_duplicate_labels(ax): nlp.states.node_index = node_index nlp.states_dot.node_index = node_index nlp.controls.node_index = node_index + nlp.stochastic_variables.node_index = node_index size = ( nlp.plot[key] @@ -351,6 +352,7 @@ def legend_without_duplicate_labels(ax): np.zeros((nlp.states.shape, 2)), np.zeros((nlp.controls.shape, 2)), np.zeros((nlp.parameters.shape, 2)), + np.zeros((nlp.stochastic_variables.shape, 2)), **nlp.plot[key].parameters, ) .shape[0] @@ -665,6 +667,7 @@ def update_data(self, v: dict): data_controls = sol.controls data_params = sol.parameters data_params_in_dyn = np.array([data_params[key] for key in data_params if key != "all"]).reshape(-1, 1) + data_stochastic = sol.stochastic_variables for _ in self.ocp.nlp: if self.t_idx_to_optimize: @@ -683,19 +686,26 @@ def update_data(self, v: dict): n_elements = data_time[i].shape[0] state = np.ndarray((0, n_elements)) - for s in nlp.states: + for ss in nlp.states: if nlp.use_states_from_phase_idx == nlp.phase_idx: if isinstance(data_states, (list, tuple)): - state = np.concatenate((state, data_states[i][s])) + state = np.concatenate((state, data_states[i][ss])) else: - state = np.concatenate((state, data_states[s])) + state = np.concatenate((state, data_states[ss])) control = np.ndarray((0, nlp.ns + 1)) - for s in nlp.controls: + for ss in nlp.controls: if nlp.use_controls_from_phase_idx == nlp.phase_idx: if isinstance(data_controls, (list, tuple)): - control = np.concatenate((control, data_controls[i][s])) + control = np.concatenate((control, data_controls[i][ss])) else: - control = np.concatenate((control, data_controls[s])) + control = np.concatenate((control, data_controls[ss])) + + stochastic = np.ndarray((0, nlp.ns + 1)) + for ss in nlp.stochastic_variables: + if isinstance(data_stochastic, (list, tuple)): + stochastic = np.concatenate((stochastic, data_stochastic[i][ss])) + else: + stochastic = np.concatenate((stochastic, data_stochastic[ss])) for key in self.variable_sizes[i]: if not self.plot_func[key][i]: @@ -738,6 +748,7 @@ def update_data(self, v: dict): state[:, step_size * idx : step_size * (idx + 1) + x_mod], control[:, idx : idx + u_mod + 1], data_params_in_dyn, + stochastic[:, idx: idx + 1 + 1], **self.plot_func[key][i].parameters, ) @@ -799,11 +810,28 @@ def update_data(self, v: dict): ) u_phase = np.vstack((u_phase, u_phase_tp)) + s_phase = np.ndarray((0, len(penalty.nodes_phase))) + for stochastic_key in data_stochastic[i].keys(): + s_phase_tp = np.ndarray((data_stochastic[i][stochastic_key].shape[0], 0)) + for tp in range(len(penalty.nodes_phase)): + phase_tp = penalty.nodes_phase[tp] + node_idx_tp = penalty.all_nodes_index[tp] + s_phase_tp = np.hstack( + ( + s_phase_tp, + data_stochastic[phase_tp][stochastic_key][ + :, node_idx_tp - (1 if node_idx_tp == nlp.ns else 0) + ][:, np.newaxis], + ) + ) + s_phase = np.vstack((s_phase, s_phase_tp)) + val_tempo = self.plot_func[key][i].function( self.plot_func[key][i].node_idx[0], x_phase, u_phase, data_params_in_dyn, + s_phase, **self.plot_func[key][i].parameters, ) y[0] = val_tempo[abs(self.plot_func[key][i].phase_mappings.to_second.map_idx[i_var])] @@ -829,6 +857,12 @@ def update_data(self, v: dict): ) ), data_params_in_dyn, + np.hstack( + ( + data_stochastic[node_idx]["all"][:, -1], + data_stochastic[node_idx + 1]["all"][:, 0], + ) + ), **self.plot_func[key][i].parameters, ) else: @@ -844,11 +878,13 @@ def update_data(self, v: dict): control_tp = control[:, node_idx : node_idx + 1 + u_mod] if np.isnan(control_tp).any(): control_tp = np.array(()) + stochastic_tp = stochastic[:, node_idx: node_idx + 1 + 1] val = self.plot_func[key][i].function( node_idx, states, control_tp, data_params_in_dyn, + stochastic_tp, **self.plot_func[key][i].parameters, ) y[i_node] = val[i_var] @@ -866,6 +902,7 @@ def update_data(self, v: dict): state[:, node_idx * step_size : (node_idx + 1) * step_size + 1 : step_size], control[:, node_idx : node_idx + 1 + 1], data_params_in_dyn, + stochastic[:, node_idx: node_idx + 1 + 1], **self.plot_func[key][i].parameters, ) for ctr, axe_index in enumerate(self.plot_func[key][i].phase_mappings.to_first.map_idx): @@ -892,6 +929,7 @@ def update_data(self, v: dict): state[:, ::step_size], control, data_params_in_dyn, + stochastic, **self.plot_func[key][i].parameters, ) if ( diff --git a/bioptim/interfaces/solve_ivp_interface.py b/bioptim/interfaces/solve_ivp_interface.py index a5f908693..a51f8e15f 100644 --- a/bioptim/interfaces/solve_ivp_interface.py +++ b/bioptim/interfaces/solve_ivp_interface.py @@ -11,7 +11,7 @@ def solve_ivp_interface( x0: np.ndarray, u: np.ndarray, params: np.ndarray, - s: dict[str, np.ndarray], + s: np.ndarray, method: str | Any = "RK45", keep_intermediate_points: bool = False, control_type: ControlType = ControlType.CONSTANT, @@ -32,7 +32,7 @@ def solve_ivp_interface( params : np.ndarray array of parameters s : np.ndarray - dictionary of arrays of stochastic variables + array of arrays of stochastic variables method : str, optional method to use for the integration, by default "RK45" keep_intermediate_points : bool @@ -135,7 +135,7 @@ def run_solve_ivp( x0: np.ndarray, u: np.ndarray, params: np.ndarray, - s: dict[str, np.ndarray], + s: np.ndarray, method: str | Any = "RK45", keep_intermediate_points: bool = False, control_type: ControlType = ControlType.CONSTANT, @@ -155,8 +155,8 @@ def run_solve_ivp( arrays of controls u evaluated at t_eval params : np.ndarray array of parameters - s : dict[str, np.ndarray] - dictionary of arrays of the stochastic variables + s : np.ndarray + array of arrays of the stochastic variables method : str, optional method to use for the integration, by default "RK45" keep_intermediate_points : bool @@ -314,7 +314,7 @@ def solve_ivp_bioptim_interface( u: np.ndarray, params: np.ndarray, param_scaling: np.ndarray, - s: dict[str, np.ndarray], + s: np.ndarray, shooting_type: Shooting, control_type: ControlType, ): @@ -335,8 +335,8 @@ def solve_ivp_bioptim_interface( array of parameters param_scaling : np.ndarray array of scaling factors for the parameters - s : dict[str, np.ndarray] - dictionary of the stochastic variables of the system + s : np.ndarray + array of the stochastic variables of the system shooting_type : Shooting The way we integrate the solution such as SINGLE, SINGLE_CONTINUOUS, MULTIPLE control_type : ControlType diff --git a/bioptim/optimization/optimal_control_program.py b/bioptim/optimization/optimal_control_program.py index 0225aa093..8f09d18fb 100644 --- a/bioptim/optimization/optimal_control_program.py +++ b/bioptim/optimization/optimal_control_program.py @@ -1266,7 +1266,7 @@ def penalty_color(): color[name] = plt.cm.viridis(i / len(name_unique_objective)) return color - def compute_penalty_values(t, x, u, p, penalty, dt: int | Callable): + def compute_penalty_values(t, x, u, p, s, penalty, dt: int | Callable): """ Compute the penalty value for the given time, state, control, parameters, penalty and time step @@ -1280,6 +1280,8 @@ def compute_penalty_values(t, x, u, p, penalty, dt: int | Callable): Control vector with starting control (and sometimes final control) p: ndarray Parameters vector + s: ndarray + Stochastic variables vector penalty: Penalty The penalty object containing details on how to compute it dt: float, Callable @@ -1295,6 +1297,9 @@ def compute_penalty_values(t, x, u, p, penalty, dt: int | Callable): if len(u.shape) < 2: u = u.reshape((-1, 1)) + if len(s.shape) < 2: + s = s.reshape((-1, 1)) + # if time is parameter of the ocp, we need to evaluate with current parameters if isinstance(dt, Function): dt = dt(p) @@ -1331,7 +1336,7 @@ def compute_penalty_values(t, x, u, p, penalty, dt: int | Callable): if penalty.transition or penalty.multinode_penalty: out.append( penalty.weighted_function_non_threaded[t]( - x.reshape((-1, 1)), u.reshape((-1, 1)), p, penalty.weight, _target, dt + x.reshape((-1, 1)), u.reshape((-1, 1)), p, s, penalty.weight, _target, dt ) ) @@ -1345,17 +1350,17 @@ def compute_penalty_values(t, x, u, p, penalty, dt: int | Callable): (x.shape[0], int(penalty.weighted_function_non_threaded[t].nnz_in(0) / x.shape[0])) ) - out.append(penalty.weighted_function_non_threaded[t](state_value, u, p, penalty.weight, _target, dt)) + out.append(penalty.weighted_function_non_threaded[t](state_value, u, p, s, penalty.weight, _target, dt)) elif ( penalty.integration_rule == QuadratureRule.APPROXIMATE_TRAPEZOIDAL or penalty.integration_rule == QuadratureRule.TRAPEZOIDAL ): out = [ - penalty.weighted_function_non_threaded[t](x[:, [i, i + 1]], u[:, i], p, penalty.weight, _target, dt) + penalty.weighted_function_non_threaded[t](x[:, [i, i + 1]], u[:, i], p, s, penalty.weight, _target, dt) for i in range(x.shape[1] - 1) ] else: - out.append(penalty.weighted_function_non_threaded[t](x, u, p, penalty.weight, _target, dt)) + out.append(penalty.weighted_function_non_threaded[t](x, u, p, s, penalty.weight, _target, dt)) return sum1(horzcat(*out)) def add_penalty(_penalties): diff --git a/bioptim/optimization/optimization_vector.py b/bioptim/optimization/optimization_vector.py index 9e181a3e5..e76a44695 100644 --- a/bioptim/optimization/optimization_vector.py +++ b/bioptim/optimization/optimization_vector.py @@ -431,7 +431,7 @@ def to_dictionaries(ocp, data: np.ndarray | DM) -> tuple: nlp.ns + (1 if nlp.control_type in (ControlType.LINEAR_CONTINUOUS,) else 0), ) ) - for key in nlp.controls.keys() + for key in ocp.nlp[p].controls } ) data_stochastic_variables.append( @@ -480,7 +480,7 @@ def to_dictionaries(ocp, data: np.ndarray | DM) -> tuple: nlp.controls.node_index = k u_array = v_array[offset : offset + nu].reshape((nlp.controls.scaled.shape, -1), order="F") for key in nlp.controls: - data_controls[p_idx][key][:, k: k + 1] = u_array[nlp.controls[key].index, :] + data_controls[p_idx][key][:, k : k + 1] = u_array[nlp.controls[key].index, :] offset += nu p_idx += 1 @@ -494,13 +494,14 @@ def to_dictionaries(ocp, data: np.ndarray | DM) -> tuple: for p in range(ocp.n_phases): nlp = ocp.nlp[p] nstochastic = nlp.stochastic_variables.shape - for k in range(nlp.ns + 1): - nlp.stochastic_variables.node_index = k - u_array = v_array[offset : offset + nstochastic].reshape((nlp.stochastic_variables.shape, -1), order="F") # @pariterre "F" seems like an interpolation? - for key in nlp.stochastic_variables: - data_stochastic_variables[p_idx][key][:, k : k + 1] = u_array[nlp.stochastic_variables[key].index, :] - offset += nstochastic - p_idx += 1 + if nstochastic > 0: + for k in range(nlp.ns + 1): + nlp.stochastic_variables.node_index = k + u_array = v_array[offset : offset + nstochastic].reshape((nlp.stochastic_variables.shape, -1), order="F") # @pariterre "F" seems like an interpolation? + for key in nlp.stochastic_variables: + data_stochastic_variables[p_idx][key][:, k : k + 1] = u_array[nlp.stochastic_variables[key].index, :] + offset += nstochastic + p_idx += 1 return data_states, data_controls, data_parameters, data_stochastic_variables diff --git a/bioptim/optimization/solution.py b/bioptim/optimization/solution.py index 920017d50..5d860789d 100644 --- a/bioptim/optimization/solution.py +++ b/bioptim/optimization/solution.py @@ -1150,7 +1150,10 @@ def __perform_integration( ] ) ) - s = self.ocp.nlp[p].stochastic_variables + if self.ocp.nlp[p].stochastic_variables.keys(): + s = np.concatenate([self._stochastic_variables[p][key] for key in self.ocp.nlp[p].stochastic_variables]) + else: + s = np.array([]) if integrator == SolutionIntegrator.OCP: integrated_sol = solve_ivp_bioptim_interface( dynamics_func=nlp.dynamics, From 1f059437e5dbfa9ca775b986e85dd15668547f2f Mon Sep 17 00:00:00 2001 From: Charbie Date: Wed, 12 Jul 2023 14:53:00 +0200 Subject: [PATCH 22/54] updates torque_driven example --- .../arm_reaching_torque_driven.py | 43 ++++++++++++------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py b/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py index d6c6085b0..6e7755878 100644 --- a/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py +++ b/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py @@ -17,8 +17,6 @@ from bioptim import ( OptimalControlProgram, StochasticOptimalControlProgram, - Bounds, - InitialGuess, ObjectiveFcn, Solver, BiorbdModel, @@ -37,6 +35,7 @@ ConstraintFcn, MultinodeConstraintList, MultinodeObjectiveList, + InitialGuessList, ) def get_force_field(q, force_field_magnitude): @@ -342,7 +341,7 @@ def prepare_socp( wS_magnitude: cas.DM, force_field_magnitude: float = 0, problem_type: str = "CIRCLE", -) -> OptimalControlProgram: +) -> StochasticOptimalControlProgram: """ The initialization of an ocp Parameters @@ -435,18 +434,22 @@ def prepare_socp( stochastic_variables, nlp, wM, wS, force_field_magnitude=force_field_magnitude, with_gains=with_gains), - wM=np.zeros((n_tau, 1)), wS=np.zeros((n_q+n_qdot, 1)), expand=False) + wM=np.zeros((n_tau, 1)), wS=np.zeros((n_q+n_qdot, 1))) # expand=False states_min = np.ones((n_states, n_shooting+1)) * -cas.inf states_max = np.ones((n_states, n_shooting+1)) * cas.inf x_bounds = BoundsList() - x_bounds.add(bounds=Bounds(states_min, states_max, interpolation=InterpolationType.EACH_FRAME)) + x_bounds.add("q", min_bound=states_min[:n_q, :], max_bound=states_max[:n_q, :], interpolation=InterpolationType.EACH_FRAME) + x_bounds.add("qdot", min_bound=states_min[n_q:n_q+n_qdot, :], max_bound=states_max[n_q:n_q+n_qdot, :], interpolation=InterpolationType.EACH_FRAME) + x_bounds.add("qddot", min_bound=states_min[n_q+n_qdot:n_q+n_qdot*2, :], max_bound=states_max[n_q+n_qdot:n_q+n_qdot*2, :], interpolation=InterpolationType.EACH_FRAME) - u_bounds = BoundsList() controls_min = np.ones((n_controls, 3)) * -cas.inf controls_max = np.ones((n_controls, 3)) * cas.inf - u_bounds.add(bounds=Bounds(controls_min, controls_max)) + + u_bounds = BoundsList() + u_bounds.add("qdddot", min_bound=controls_min[:n_q, :], max_bound=controls_max[:n_q, :]) + u_bounds.add("tau", min_bound=controls_min[n_q:, :], max_bound=controls_max[n_q:, :]) # Initial guesses states_init = np.zeros((n_states, n_shooting + 1)) @@ -456,30 +459,38 @@ def prepare_socp( states_init[1, -1] = elbow_pos_final states_init[n_states:, :] = 0.01 - x_init = InitialGuess(states_init, interpolation=InterpolationType.EACH_FRAME) + x_init = InitialGuessList() + x_init.add("q", initial_guess=states_init[:n_q, :], interpolation=InterpolationType.EACH_FRAME) + x_init.add("qdot", initial_guess=states_init[n_q:n_q+n_qdot, :], interpolation=InterpolationType.EACH_FRAME) + x_init.add("qddot", initial_guess=states_init[n_q+n_qdot:n_q+n_qdot*2, :], interpolation=InterpolationType.EACH_FRAME) controls_init = np.ones((n_controls, n_shooting)) * 0.01 - u_init = InitialGuess(controls_init, interpolation=InterpolationType.EACH_FRAME) + u_init = InitialGuessList() + u_init.add("qdddot", initial_guess=controls_init[:n_q, :], interpolation=InterpolationType.EACH_FRAME) + u_init.add("tau", initial_guess=controls_init[n_q:, :], interpolation=InterpolationType.EACH_FRAME) # TODO: This should probably be done automatically, not defined by the user + s_init = InitialGuessList() + s_bounds = BoundsList() n_stochastic = n_tau*(n_q+n_qdot) + n_q+n_qdot + n_states*n_states # K(2x4) + ee_ref(4x1) + M(6x6) stochastic_init = np.zeros((n_stochastic, n_shooting + 1)) + stochastic_min = np.ones((n_stochastic, 3)) * -cas.inf + stochastic_max = np.ones((n_stochastic, 3)) * cas.inf curent_index = 0 stochastic_init[:n_tau*(n_q+n_qdot), :] = 0.01 # K + s_init.add("k", initial_guess=stochastic_init[:n_tau*(n_q+n_qdot), :], interpolation=InterpolationType.EACH_FRAME) + s_bounds.add("k", min_bound=stochastic_min[:n_tau*(n_q+n_qdot), :], max_bound=stochastic_max[:n_tau*(n_q+n_qdot), :]) curent_index += n_tau*(n_q+n_qdot) stochastic_init[curent_index: curent_index + n_q + n_qdot, :] = 0.01 # ee_ref # stochastic_init[curent_index : curent_index + n_q+n_qdot, 0] = np.array([ee_initial_position[0], ee_initial_position[1], 0, 0]) # ee_ref # stochastic_init[curent_index : curent_index + n_q+n_qdot, 1] = np.array([ee_final_position[0], ee_final_position[1], 0, 0]) + s_init.add("ee_ref", initial_guess=stochastic_init[curent_index: curent_index + n_q + n_qdot, :], interpolation=InterpolationType.EACH_FRAME) + s_bounds.add("ee_ref", min_bound=stochastic_min[curent_index: curent_index + n_q + n_qdot, :], max_bound=stochastic_max[curent_index: curent_index + n_q + n_qdot, :]) curent_index += n_q + n_qdot stochastic_init[curent_index: curent_index + n_states * n_states, :] = 0.01 # M - - s_init = InitialGuess(stochastic_init, interpolation=InterpolationType.EACH_FRAME) - - s_bounds = BoundsList() - stochastic_min = np.ones((n_stochastic, 3)) * -cas.inf - stochastic_max = np.ones((n_stochastic, 3)) * cas.inf - s_bounds.add(bounds=Bounds(stochastic_min, stochastic_max)) + s_init.add("m", initial_guess=stochastic_init[curent_index: curent_index + n_states * n_states, :], interpolation=InterpolationType.EACH_FRAME) + s_bounds.add("m", min_bound=stochastic_min[curent_index: curent_index + n_states * n_states, :], max_bound=stochastic_max[curent_index: curent_index + n_states * n_states, :]) integrated_value_functions = {"cov": lambda nlp, node_index: get_p_mat(nlp, node_index, force_field_magnitude=force_field_magnitude, wM_magnitude=wM_magnitude, wS_magnitude=wS_magnitude)} From 545a0058bdf8df366e88b2b7d5ae738279d7ed5b Mon Sep 17 00:00:00 2001 From: Charbie Date: Wed, 12 Jul 2023 15:14:40 +0200 Subject: [PATCH 23/54] fixed chech_onditionning --- bioptim/gui/check_conditioning.py | 66 +++++++++++++++++++++++-------- 1 file changed, 49 insertions(+), 17 deletions(-) diff --git a/bioptim/gui/check_conditioning.py b/bioptim/gui/check_conditioning.py index 0512b42a2..139bc8db9 100644 --- a/bioptim/gui/check_conditioning.py +++ b/bioptim/gui/check_conditioning.py @@ -62,23 +62,25 @@ def jacobian_hessian_constraints(): nlp.states.node_index = node_index nlp.states_dot.node_index = node_index nlp.controls.node_index = node_index + nlp.stochastic_variables.node_index = node_index for axis in range( 0, constraints.function[node_index]( - nlp.states.cx_start, nlp.controls.cx_start, nlp.parameters.cx + nlp.states.cx_start, nlp.controls.cx_start, nlp.parameters.cx, nlp.stochastic_variables.cx_start ).shape[0], ): # depends if there are parameters if nlp.parameters.shape == 0: - vertcat_obj = vertcat(*nlp.X_scaled, *nlp.U_scaled, nlp.parameters.cx) + vertcat_obj = vertcat(*nlp.X_scaled, *nlp.U_scaled, nlp.parameters.cx, *nlp.S) else: - vertcat_obj = vertcat(*nlp.X_scaled, *nlp.U_scaled, *[nlp.parameters.cx]) + vertcat_obj = vertcat(*nlp.X_scaled, *nlp.U_scaled, *[nlp.parameters.cx, *nlp.S]) list_constraints.append( jacobian( constraints.function[constraints.node_idx[0]]( - nlp.states.cx_start, nlp.controls.cx_start, nlp.parameters.cx + nlp.states.cx_start, nlp.controls.cx_start, nlp.parameters.cx, + nlp.stochastic_variables.cx_start )[axis], vertcat_obj, ) @@ -88,9 +90,9 @@ def jacobian_hessian_constraints(): # depends if there are parameters if nlp.parameters.shape == 0: - vertcat_obj = vertcat(*nlp.X_scaled, *nlp.U_scaled, nlp.parameters.cx) + vertcat_obj = vertcat(*nlp.X_scaled, *nlp.U_scaled, nlp.parameters.cx, *nlp.S) else: - vertcat_obj = vertcat(*nlp.X_scaled, *nlp.U_scaled, *[nlp.parameters.cx]) + vertcat_obj = vertcat(*nlp.X_scaled, *nlp.U_scaled, *[nlp.parameters.cx], *nlp.S) jac_func = Function( "jacobian", @@ -100,11 +102,13 @@ def jacobian_hessian_constraints(): nb_x_init = sum([nlp.x_init[key].shape[0] for key in nlp.x_init.keys()]) nb_u_init = sum([nlp.u_init[key].shape[0] for key in nlp.u_init.keys()]) + nb_s_init = sum([nlp.s_init[key].shape[0] for key in nlp.s_init.keys()]) # evaluate jac_func at X_init, U_init, considering the parameters x_init = np.zeros((len(nlp.X), nb_x_init)) u_init = np.zeros((len(nlp.U), nb_u_init)) param_init = np.array([ocp.parameter_init[key].shape[0] for key in ocp.parameter_init.keys()]) + s_init = np.zeros((len(nlp.S), nb_s_init)) for key in nlp.states.keys(): nlp.x_init[key].check_and_adjust_dimensions(len(nlp.states[key]), nlp.ns + 1) @@ -116,12 +120,18 @@ def jacobian_hessian_constraints(): for node_index in range(nlp.ns): nlp.controls.node_index = node_index u_init[node_index, nlp.controls[key].index] = np.array(nlp.u_init[key].init.evaluate_at(node_index)) + for key in nlp.stochastic_variables.keys(): + nlp.s_init[key].check_and_adjust_dimensions(len(nlp.stochastic_variables[key]), nlp.ns) + for node_index in range(nlp.ns): + nlp.stochastic_variables.node_index = node_index + s_init[node_index, nlp.stochastic_variables[key].index] = np.array(nlp.s_init[key].init.evaluate_at(node_index)) x_init = x_init.reshape((x_init.size, 1)) u_init = u_init.reshape((u_init.size, 1)) param_init = param_init.reshape((param_init.size, 1)) + s_init = s_init.reshape((s_init.size, 1)) - jacobian_matrix = np.array(jac_func(np.vstack((x_init, u_init, param_init)))) + jacobian_matrix = np.array(jac_func(np.vstack((x_init, u_init, param_init, s_init)))) jacobian_list.append(jacobian_matrix) @@ -141,26 +151,28 @@ def jacobian_hessian_constraints(): nlp.states.node_index = node_index nlp.states_dot.node_index = node_index nlp.controls.node_index = node_index + nlp.stochastic_variables.node_index = node_index for axis in range( 0, constraints.function[node_index]( - nlp.states.cx_start, nlp.controls.cx_start, nlp.parameters.cx + nlp.states.cx_start, nlp.controls.cx_start, nlp.parameters.cx, nlp.stochastic_variables.cx_start ).shape[0], ): # find all equality constraints if constraints.bounds.min[axis][0] == constraints.bounds.max[axis][0]: # parameters if nlp.parameters.shape == 0: - vertcat_obj = vertcat(*nlp.X_scaled, *nlp.U_scaled, nlp.parameters.cx) + vertcat_obj = vertcat(*nlp.X_scaled, *nlp.U_scaled, nlp.parameters.cx, *nlp.S) else: - vertcat_obj = vertcat(*nlp.X_scaled, *nlp.U_scaled, *[nlp.parameters.cx]) + vertcat_obj = vertcat(*nlp.X_scaled, *nlp.U_scaled, *[nlp.parameters.cx, *nlp.S]) hessian_cas = hessian( constraints.function[node_index]( nlp.states.cx_start, nlp.controls.cx_start, nlp.parameters.cx, + nlp.stochastic_variables.cx_start, )[axis], vertcat_obj, )[0] @@ -173,7 +185,7 @@ def jacobian_hessian_constraints(): [hessian_cas], ) - hessian_matrix = np.array(hes_func(np.vstack((x_init, u_init, param_init)))) + hessian_matrix = np.array(hes_func(np.vstack((x_init, u_init, param_init, s_init)))) # append hessian list list_hessian.append(hessian_matrix) @@ -291,6 +303,7 @@ def hessian_objective(): nlp.states.node_index = node_index nlp.states_dot.node_index = node_index nlp.controls.node_index = node_index + nlp.stochastic_variables.node_index = node_index # Test every possibility if obj.multinode_penalty or obj.transition: @@ -300,25 +313,30 @@ def hessian_objective(): states_post = nlp_post.states.cx_start controls_pre = phase.controls.cx_end controls_post = nlp_post.controls.cx_start + stochastic_pre = phase.stochastic_cx_end + stochastic_post = nlp_post.stochastic_cx_start state_cx = vertcat(states_pre, states_post) control_cx = vertcat(controls_pre, controls_post) + stochastic_cx = vertcat(stochastic_pre, stochastic_post) else: if obj.integrate: state_cx = horzcat(*([nlp.states.cx_start] + nlp.states.cx_intermediates_list)) - control_cx = nlp.controls.cx_start else: state_cx = nlp.states.cx_start - control_cx = nlp.controls.cx_start + control_cx = nlp.controls.cx_start + stochastic_cx = nlp.stochastic_variables.cx_start if obj.explicit_derivative: if obj.derivative: raise RuntimeError("derivative and explicit_derivative cannot be simultaneously true") state_cx = horzcat(state_cx, nlp.states.cx_end) control_cx = horzcat(control_cx, nlp.controls.cx_end) + stochastic_cx = horzcat(stochastic_cx, nlp.stochastic_cx_end) if obj.derivative: state_cx = horzcat(nlp.states.cx_end, nlp.states.cx_start) control_cx = horzcat(nlp.controls.cx_end, nlp.controls.cx_start) + stochastic_cx = horzcat(nlp.stochastic.cx_end, nlp.stochastic.cx_start) dt_cx = nlp.cx.sym("dt", 1, 1) is_trapezoidal = ( @@ -337,13 +355,18 @@ def hessian_objective(): if nlp.control_type == ControlType.CONSTANT else horzcat(nlp.controls.cx_start, nlp.controls.cx_end) ) - control_cx_end = get_u(nlp, control_cx, dt_cx) + stochastic_cx = ( + horzcat(nlp.stochastic_variables.cx_start) + if nlp.control_type == ControlType.CONSTANT + else horzcat(nlp.stochastic_variables.cx_start, nlp.stochastic_variables.cx_end) + ) if obj.target is None: p = obj.weighted_function[node_index]( state_cx, control_cx, nlp.parameters.cx, + stochastic_cx, obj.weight, [], obj.dt, @@ -353,6 +376,7 @@ def hessian_objective(): state_cx, control_cx, nlp.parameters.cx, + stochastic_cx, obj.weight, obj.target, obj.dt, @@ -364,9 +388,9 @@ def hessian_objective(): # create function to build the hessian # parameters if nlp.parameters.shape == 0: - vertcat_obj = vertcat(*nlp.X_scaled, *nlp.U_scaled, nlp.parameters.cx) + vertcat_obj = vertcat(*nlp.X_scaled, *nlp.U_scaled, nlp.parameters.cx, *nlp.S) else: - vertcat_obj = vertcat(*nlp.X_scaled, *nlp.U_scaled, *[nlp.parameters.cx]) + vertcat_obj = vertcat(*nlp.X_scaled, *nlp.U_scaled, *[nlp.parameters.cx], *nlp.S) hessian_cas = hessian(objective, vertcat_obj)[0] @@ -378,11 +402,13 @@ def hessian_objective(): nb_x_init = sum([nlp.x_init[key].shape[0] for key in nlp.x_init.keys()]) nb_u_init = sum([nlp.u_init[key].shape[0] for key in nlp.u_init.keys()]) + nb_s_init = sum([nlp.s_init[key].shape[0] for key in nlp.s_init.keys()]) # evaluate jac_func at X_init, U_init, considering the parameters x_init = np.zeros((len(nlp.X), nb_x_init)) u_init = np.zeros((len(nlp.U), nb_u_init)) param_init = np.array([nlp.x_init[key].shape[0] for key in ocp.parameter_init.keys()]) + s_init = np.zeros((len(nlp.S), nb_s_init)) for key in nlp.states.keys(): nlp.x_init[key].check_and_adjust_dimensions(len(nlp.states[key]), nlp.ns + 1) @@ -394,12 +420,18 @@ def hessian_objective(): for node_index in range(nlp.ns): nlp.controls.node_index = node_index u_init[node_index, nlp.controls[key].index] = np.array(nlp.u_init[key].init.evaluate_at(node_index)) + for key in nlp.stochastic_variables.keys(): + nlp.s_init[key].check_and_adjust_dimensions(len(nlp.stochastic_variables[key]), nlp.ns) + for node_index in range(nlp.ns): + nlp.stochastic_variables.node_index = node_index + s_init[node_index, nlp.stochastic_variables[key].index] = np.array(nlp.s_init[key].init.evaluate_at(node_index)) x_init = x_init.reshape((x_init.size, 1)) u_init = u_init.reshape((u_init.size, 1)) param_init = param_init.reshape((param_init.size, 1)) + s_init = s_init.reshape((s_init.size, 1)) - hessian_obj_matrix = np.array(hes_func(np.vstack((x_init, u_init, param_init)))) + hessian_obj_matrix = np.array(hes_func(np.vstack((x_init, u_init, param_init, s_init)))) hessian_obj_list.append(hessian_obj_matrix) # Convexity checking (positive semi-definite hessian) From 1257a973e0a09f68d6dbbdd6377ed1974bf36614 Mon Sep 17 00:00:00 2001 From: Charbie Date: Wed, 12 Jul 2023 15:26:46 +0200 Subject: [PATCH 24/54] generalized to all integrators --- bioptim/dynamics/integrator.py | 51 +++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 16 deletions(-) diff --git a/bioptim/dynamics/integrator.py b/bioptim/dynamics/integrator.py index 3869d7937..317f02f86 100644 --- a/bioptim/dynamics/integrator.py +++ b/bioptim/dynamics/integrator.py @@ -27,6 +27,8 @@ class Integrator: The parameters variables param_scaling: MX | SX The parameters variables scaling factor + s_sym: MX | SX + The stochastic variables fun: Callable The dynamic function which provides the derivative of the states implicit_fun: Callable @@ -48,7 +50,7 @@ class Integrator: Get the multithreaded CasADi graph of the integration get_u(self, u: np.ndarray, dt_norm: float) -> np.ndarray Get the control at a given time - dxdt(self, h: float, states: MX | SX, controls: MX | SX, params: MX | SX) -> tuple[SX, list[SX]] + dxdt(self, h: float, states: MX | SX, controls: MX | SX, params: MX | SX, stochastic_variables: MX | SX) -> tuple[SX, list[SX]] The dynamics of the system _finish_init(self) Prepare the CasADi function from dxdt @@ -73,6 +75,7 @@ def __init__(self, ode: dict, ode_opt: dict): self.u_sym = [] if ode_opt["control_type"] is ControlType.NONE else ode["p_scaled"] self.param_sym = ode_opt["param"].cx self.param_scaling = ode_opt["param"].scaling + self.S_sym = ode["s_scaled"] self.stochastic_variables_sym = ode["stochastic_variables"] self.fun = ode["ode"] self.implicit_fun = ode["implicit_ode"] @@ -124,7 +127,7 @@ def get_u(self, u: np.ndarray, dt_norm: float) -> np.ndarray: else: raise RuntimeError(f"{self.control_type} ControlType not implemented yet") - def dxdt(self, h: float, states: MX | SX, controls: MX | SX, params: MX | SX, param_scaling) -> tuple: + def dxdt(self, h: float, states: MX | SX, controls: MX | SX, params: MX | SX, param_scaling, stochastic_variables: MX | SX) -> tuple: """ The dynamics of the system @@ -138,6 +141,10 @@ def dxdt(self, h: float, states: MX | SX, controls: MX | SX, params: MX | SX, pa The controls of the system params: MX | SX The parameters of the system + param_scaling + The parameters scaling factor + stochastic_variables: MX | SX + The stochastic variables of the system Returns ------- @@ -175,9 +182,9 @@ class RK(Integrator): Methods ------- - next_x(self, h: float, t: float, x_prev: MX | SX, u: MX | SX, p: MX | SX) + next_x(self, h: float, t: float, x_prev: MX | SX, u: MX | SX, p: MX | SX, s: MX | SX) Compute the next integrated state (abstract) - dxdt(self, h: float, states: MX | SX, controls: MX | SX, params: MX | SX) -> tuple[SX, list[SX]] + dxdt(self, h: float, states: MX | SX, controls: MX | SX, params: MX | SX, stochastic_variables: MX | SX) -> tuple[SX, list[SX]] The dynamics of the system """ @@ -196,7 +203,7 @@ def __init__(self, ode: dict, ode_opt: dict): self.h_norm = 1 / self.n_step self.h = self.step_time * self.h_norm - def next_x(self, h: float, t: float, x_prev: MX | SX, u: MX | SX, p: MX | SX): + def next_x(self, h: float, t: float, x_prev: MX | SX, u: MX | SX, p: MX | SX, s: MX | SX) -> MX | SX: """ Compute the next integrated state (abstract) @@ -212,6 +219,8 @@ def next_x(self, h: float, t: float, x_prev: MX | SX, u: MX | SX, p: MX | SX): The control of the system p: MX | SX The parameters of the system + s: MX | SX + The stochastic variables of the system Returns ------- @@ -234,6 +243,10 @@ def dxdt(self, h: float, states: MX | SX, controls: MX | SX, params: MX | SX, pa The controls of the system params: MX | SX The parameters of the system + param_scaling + The parameters scaling factor + stochastic_variables: MX | SX + The stochastic variables of the system Returns ------- @@ -262,7 +275,7 @@ class RK1(RK): Methods ------- - next_x(self, h: float, t: float, x_prev: MX | SX, u: MX | SX, p: MX | SX) + next_x(self, h: float, t: float, x_prev: MX | SX, u: MX | SX, p: MX | SX, s: MX | SX) Compute the next integrated state (abstract) """ @@ -279,7 +292,7 @@ def __init__(self, ode: dict, ode_opt: dict): super(RK1, self).__init__(ode, ode_opt) self._finish_init() - def next_x(self, h: float, t: float, x_prev: MX | SX, u: MX | SX, p: MX | SX): + def next_x(self, h: float, t: float, x_prev: MX | SX, u: MX | SX, p: MX | SX, s: MX | SX) -> MX | SX: """ Compute the next integrated state @@ -295,13 +308,15 @@ def next_x(self, h: float, t: float, x_prev: MX | SX, u: MX | SX, p: MX | SX): The control of the system p: MX | SX The parameters of the system + s: MX | SX + The stochastic variables of the system Returns ------- The next integrate states """ - return x_prev + h * self.fun(x_prev, self.get_u(u, t), p)[:, self.idx] + return x_prev + h * self.fun(x_prev, self.get_u(u, t), p, s)[:, self.idx] class RK2(RK): @@ -310,7 +325,7 @@ class RK2(RK): Methods ------- - next_x(self, h: float, t: float, x_prev: MX | SX, u: MX | SX, p: MX | SX) + next_x(self, h: float, t: float, x_prev: MX | SX, u: MX | SX, p: MX | SX, s: MX | SX) Compute the next integrated state (abstract) """ @@ -360,7 +375,7 @@ class RK4(RK): Methods ------- - next_x(self, h: float, t: float, x_prev: MX | SX, u: MX | SX, p: MX | SX) + next_x(self, h: float, t: float, x_prev: MX | SX, u: MX | SX, p: MX | SX, s: MX | SX) Compute the next integrated state (abstract) """ @@ -414,7 +429,7 @@ class RK8(RK4): Methods ------- - next_x(self, h: float, t: float, x_prev: MX | SX, u: MX | SX, p: MX | SX) + next_x(self, h: float, t: float, x_prev: MX | SX, u: MX | SX, p: MX | SX, s: MX | SX) Compute the next integrated state (abstract) """ @@ -501,7 +516,7 @@ class COLLOCATION(Integrator): ------- get_u(self, u: np.ndarray, dt_norm: float) -> np.ndarray Get the control at a given time - dxdt(self, h: float, states: MX | SX, controls: MX | SX, params: MX | SX) -> tuple[SX, list[SX]] + dxdt(self, h: float, states: MX | SX, controls: MX | SX, params: MX | SX, stochastic_variables: MX | SX) -> tuple[SX, list[SX]] The dynamics of the system """ @@ -672,7 +687,7 @@ def __init__(self, ode: dict, ode_opt: dict): super(IRK, self).__init__(ode, ode_opt) - def dxdt(self, h: float, states: MX | SX, controls: MX | SX, params: MX | SX, param_scaling) -> tuple: + def dxdt(self, h: float, states: MX | SX, controls: MX | SX, params: MX | SX, param_scaling, stochastic_variables: MX | SX) -> tuple: """ The dynamics of the system @@ -686,6 +701,10 @@ def dxdt(self, h: float, states: MX | SX, controls: MX | SX, params: MX | SX, pa The controls of the system params: MX | SX The parameters of the system + param_scaling + The parameters scaling of the system + stochastic_variables: MX | SX + The stochastic variables of the system Returns ------- @@ -693,14 +712,14 @@ def dxdt(self, h: float, states: MX | SX, controls: MX | SX, params: MX | SX, pa """ nx = states[0].shape[0] - _, _, defect = super(IRK, self).dxdt(h, states, controls, params, param_scaling) + _, _, defect = super(IRK, self).dxdt(h, states, controls, params, param_scaling, stochastic_variables) # Root-finding function, implicitly defines x_collocation_points as a function of x0 and p - vfcn = Function("vfcn", [vertcat(*states[1:]), states[0], controls, params], [defect]).expand() + vfcn = Function("vfcn", [vertcat(*states[1:]), states[0], controls, params, stochastic_variables], [defect]).expand() # Create a implicit function instance to solve the system of equations ifcn = rootfinder("ifcn", "newton", vfcn) - x_irk_points = ifcn(self.cx(), states[0], controls, params) + x_irk_points = ifcn(self.cx(), states[0], controls, params, stochastic_variables) x = [states[0] if r == 0 else x_irk_points[(r - 1) * nx : r * nx] for r in range(self.degree + 1)] # Get an expression for the state at the end of the finite element From 93d8acf70b196a8db07183f084ce3ca7de24b51d Mon Sep 17 00:00:00 2001 From: Charbie Date: Wed, 12 Jul 2023 15:26:54 +0200 Subject: [PATCH 25/54] fixed plot tests --- bioptim/limits/penalty_option.py | 2 +- tests/test__global_plots.py | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/bioptim/limits/penalty_option.py b/bioptim/limits/penalty_option.py index 81fe1b04b..2a94bf62a 100644 --- a/bioptim/limits/penalty_option.py +++ b/bioptim/limits/penalty_option.py @@ -633,7 +633,7 @@ def _finish_add_target_to_plot(self, controller: PenaltyController): """ - def plot_function(t, x, u, p, penalty=None): + def plot_function(t, x, u, p, s, penalty=None): if isinstance(t, (list, tuple)): return self.target_to_plot[:, [self.node_idx.index(_t) for _t in t]] else: diff --git a/tests/test__global_plots.py b/tests/test__global_plots.py index dfdaa45e1..0f84f26fc 100644 --- a/tests/test__global_plots.py +++ b/tests/test__global_plots.py @@ -123,24 +123,24 @@ def test_add_new_plot(assume_phase_dynamics): ocp.save(sol, save_name) # Test 1 - Working plot - ocp.add_plot("My New Plot", lambda t, x, u, p: x[0:2, :]) + ocp.add_plot("My New Plot", lambda t, x, u, p, s: x[0:2, :]) sol.graphs(automatically_organize=False) # Test 2 - Combine using combine_to is not allowed ocp, sol = OptimalControlProgram.load(save_name) with pytest.raises(RuntimeError): - ocp.add_plot("My New Plot", lambda t, x, u, p: x[0:2, :], combine_to="NotAllowed") + ocp.add_plot("My New Plot", lambda t, x, u, p, s: x[0:2, :], combine_to="NotAllowed") # Test 3 - Create a completely new plot ocp, sol = OptimalControlProgram.load(save_name) - ocp.add_plot("My New Plot", lambda t, x, u, p: x[0:2, :]) - ocp.add_plot("My Second New Plot", lambda t, x, p, u: x[0:2, :]) + ocp.add_plot("My New Plot", lambda t, x, u, p, s: x[0:2, :]) + ocp.add_plot("My Second New Plot", lambda t, x, p, u, s: x[0:2, :]) sol.graphs(automatically_organize=False) # Test 4 - Combine to the first using fig_name ocp, sol = OptimalControlProgram.load(save_name) - ocp.add_plot("My New Plot", lambda t, x, u, p: x[0:2, :]) - ocp.add_plot("My New Plot", lambda t, x, u, p: x[0:2, :]) + ocp.add_plot("My New Plot", lambda t, x, u, p, s: x[0:2, :]) + ocp.add_plot("My New Plot", lambda t, x, u, p, s: x[0:2, :]) sol.graphs(automatically_organize=False) # Add the plot of objectives and constraints to this mess From 749e3b5b773e46edc8e141464697da5c4f58fd6d Mon Sep 17 00:00:00 2001 From: Charbie Date: Wed, 12 Jul 2023 16:25:05 +0200 Subject: [PATCH 26/54] fixed some tests --- bioptim/dynamics/configure_problem.py | 4 +- bioptim/dynamics/dynamics_functions.py | 2 + bioptim/dynamics/integrator.py | 2 +- bioptim/dynamics/ode_solver.py | 3 ++ .../getting_started/custom_dynamics.py | 1 + .../arm_reaching_muscle_driven.py | 1 - bioptim/gui/graph.py | 1 + bioptim/limits/penalty_controller.py | 52 +++++++++---------- bioptim/optimization/optimization_vector.py | 8 +-- tests/test__global_plots.py | 1 + 10 files changed, 43 insertions(+), 32 deletions(-) diff --git a/bioptim/dynamics/configure_problem.py b/bioptim/dynamics/configure_problem.py index 7e723a882..0ad3c724f 100644 --- a/bioptim/dynamics/configure_problem.py +++ b/bioptim/dynamics/configure_problem.py @@ -697,17 +697,19 @@ def configure_contact_function(ocp, nlp, dyn_func: Callable, **extra_params): nlp.states.scaled.mx_reduced, nlp.controls.scaled.mx_reduced, nlp.parameters.mx, + nlp.stochastic_variables.mx, ], [ dyn_func( nlp.states.scaled.mx_reduced, nlp.controls.scaled.mx_reduced, nlp.parameters.mx, + nlp.stochastic_variables.mx, nlp, **extra_params, ) ], - ["x", "u", "p"], + ["x", "u", "p", "s"], ["contact_forces"], ).expand() diff --git a/bioptim/dynamics/dynamics_functions.py b/bioptim/dynamics/dynamics_functions.py index 70821ef06..a0a836ee9 100644 --- a/bioptim/dynamics/dynamics_functions.py +++ b/bioptim/dynamics/dynamics_functions.py @@ -374,6 +374,8 @@ def forces_from_torque_driven( The controls of the system parameters: MX.sym The parameters of the system + stochastic_variables: MX.sym + The stochastic variables of the system nlp: NonLinearProgram The definition of the system with_passive_torque: bool diff --git a/bioptim/dynamics/integrator.py b/bioptim/dynamics/integrator.py index 317f02f86..a631487f9 100644 --- a/bioptim/dynamics/integrator.py +++ b/bioptim/dynamics/integrator.py @@ -75,7 +75,7 @@ def __init__(self, ode: dict, ode_opt: dict): self.u_sym = [] if ode_opt["control_type"] is ControlType.NONE else ode["p_scaled"] self.param_sym = ode_opt["param"].cx self.param_scaling = ode_opt["param"].scaling - self.S_sym = ode["s_scaled"] + self.s_sym = ode["stochastic_variables"] self.stochastic_variables_sym = ode["stochastic_variables"] self.fun = ode["ode"] self.implicit_fun = ode["implicit_ode"] diff --git a/bioptim/dynamics/ode_solver.py b/bioptim/dynamics/ode_solver.py index 4f25eda7c..def7841a2 100644 --- a/bioptim/dynamics/ode_solver.py +++ b/bioptim/dynamics/ode_solver.py @@ -122,6 +122,7 @@ def integrator(self, ocp, nlp, node_index: int) -> list: nlp.states.node_index = node_index nlp.states_dot.node_index = node_index nlp.controls.node_index = node_index + nlp.stochastic_variables.node_index = node_index ode_opt = { "t0": 0, @@ -290,6 +291,7 @@ def integrator(self, ocp, nlp, node_index: int) -> list: nlp.states.node_index = node_index nlp.states_dot.node_index = node_index nlp.controls.node_index = node_index + nlp.stochastic_variables.node_index = node_index if ocp.n_threads > 1 and nlp.control_type == ControlType.LINEAR_CONTINUOUS: raise RuntimeError("Piece-wise linear continuous controls cannot be used with multiple threads") @@ -421,6 +423,7 @@ def integrator(self, ocp, nlp, node_index: int) -> list: nlp.states.node_index = node_index nlp.states_dot.node_index = node_index nlp.controls.node_index = node_index + nlp.stochastic_variables.node_index = node_index if not isinstance(ocp.cx(), MX): raise RuntimeError("use_sx=True and OdeSolver.CVODES are not yet compatible") diff --git a/bioptim/examples/getting_started/custom_dynamics.py b/bioptim/examples/getting_started/custom_dynamics.py index 24eecf6d6..e68ba808e 100644 --- a/bioptim/examples/getting_started/custom_dynamics.py +++ b/bioptim/examples/getting_started/custom_dynamics.py @@ -35,6 +35,7 @@ def custom_dynamic( states: MX | SX, controls: MX | SX, parameters: MX | SX, + stochastic_variables: MX | SX, nlp: NonLinearProgram, my_additional_factor=1, ) -> DynamicsEvaluation: diff --git a/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py b/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py index 611639972..84bc4ed1d 100644 --- a/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py +++ b/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py @@ -318,7 +318,6 @@ def configure_stochastic_optimal_control_problem(ocp: OptimalControlProgram, nlp ConfigureProblem.configure_qdot(ocp, nlp, True, False, True) ConfigureProblem.configure_qddot(ocp, nlp, False, False, True) ConfigureProblem.configure_muscles(ocp, nlp, True, True) # Muscles activations as states + muscles excitations as controls - ocp.nlp[0].controls = nlp.controls # Seems like I broke the link between nlp and ocp :( @ Pariterre ? # Stochastic variables ConfigureProblem.configure_stochastic_k(ocp, nlp, n_noised_controls=6, n_feedbacks=4) diff --git a/bioptim/gui/graph.py b/bioptim/gui/graph.py index c47a975e0..97d1ce2fc 100644 --- a/bioptim/gui/graph.py +++ b/bioptim/gui/graph.py @@ -282,6 +282,7 @@ def print(self): self.ocp.nlp[phase_idx].states.node_index = 0 self.ocp.nlp[phase_idx].states_dot.node_index = 0 self.ocp.nlp[phase_idx].controls.node_index = 0 + self.ocp.nlp[phase_idx].stochastic_variables.node_index = 0 print(f"PHASE: {phase_idx}") print(f"**********") diff --git a/bioptim/limits/penalty_controller.py b/bioptim/limits/penalty_controller.py index 45bbc753b..3673e6b33 100644 --- a/bioptim/limits/penalty_controller.py +++ b/bioptim/limits/penalty_controller.py @@ -123,6 +123,20 @@ def states(self) -> OptimizationVariableList: out.current_cx_to_get = self.cx_index_to_get return out + @property + def controls(self) -> OptimizationVariableList: + """ + Return the controls associated with the current node index + + Returns + ------- + The controls at node node_index + """ + self._nlp.controls.node_index = self.node_index + out = self._nlp.controls.unscaled + out.current_cx_to_get = self.cx_index_to_get + return out + @property def states_dot(self) -> OptimizationVariableList: """ @@ -189,51 +203,37 @@ def states_scaled(self) -> OptimizationVariableList: return out @property - def states_dot_scaled(self) -> OptimizationVariableList: + def controls_scaled(self) -> OptimizationVariableList: """ - Return the scaled states_dot associated with the current node index. + Return the scaled controls associated with the current node index. - Warning: Most of the time, the user does not want that states but the normal `states_dot`, that said, it can + Warning: Most of the time, the user does not want that controls but the normal `controls`, that said, it can sometime be useful for very limited number of use case. Returns ------- - The scaled states_dot at node node_index - """ - self._nlp.states_dot.node_index = self.node_index - - out = self._nlp.states_dot.scaled - out.current_cx_to_get = self.cx_index_to_get - return out - - @property - def controls(self) -> OptimizationVariableList: - """ - Return the controls associated with the current node index - - Returns - ------- - The controls at node node_index + The scaled controls at node node_index """ self._nlp.controls.node_index = self.node_index - out = self._nlp.controls.unscaled + out = self._nlp.controls.scaled out.current_cx_to_get = self.cx_index_to_get return out @property - def controls_scaled(self) -> OptimizationVariableList: + def states_dot_scaled(self) -> OptimizationVariableList: """ - Return the scaled controls associated with the current node index. + Return the scaled states_dot associated with the current node index. - Warning: Most of the time, the user does not want that controls but the normal `controls`, that said, it can + Warning: Most of the time, the user does not want that states but the normal `states_dot`, that said, it can sometime be useful for very limited number of use case. Returns ------- - The scaled controls at node node_index + The scaled states_dot at node node_index """ - self._nlp.controls.node_index = self.node_index - out = self._nlp.controls.scaled + self._nlp.states_dot.node_index = self.node_index + + out = self._nlp.states_dot.scaled out.current_cx_to_get = self.cx_index_to_get return out diff --git a/bioptim/optimization/optimization_vector.py b/bioptim/optimization/optimization_vector.py index e76a44695..f725209b0 100644 --- a/bioptim/optimization/optimization_vector.py +++ b/bioptim/optimization/optimization_vector.py @@ -421,6 +421,8 @@ def to_dictionaries(ocp, data: np.ndarray | DM) -> tuple: data_stochastic_variables = [] for p in range(ocp.n_phases): nlp = ocp.nlp[p] + nlp.controls.node_index = 0 + n_points = nlp.ns * (1 if nlp.ode_solver.is_direct_shooting else (nlp.ode_solver.polynomial_degree + 1)) + 1 data_states.append({key: np.ndarray((nlp.states[key].shape, n_points)) for key in nlp.states}) data_controls.append( @@ -485,9 +487,9 @@ def to_dictionaries(ocp, data: np.ndarray | DM) -> tuple: p_idx += 1 # For parameters - offset = v_array.shape[0] - ocp.parameters.shape for param in ocp.parameters: data_parameters[param.name] = v_array[[offset + i for i in param.index], np.newaxis] * param.scaling + offset += len(ocp.parameters) # For stochastic variables p_idx = 0 @@ -497,9 +499,9 @@ def to_dictionaries(ocp, data: np.ndarray | DM) -> tuple: if nstochastic > 0: for k in range(nlp.ns + 1): nlp.stochastic_variables.node_index = k - u_array = v_array[offset : offset + nstochastic].reshape((nlp.stochastic_variables.shape, -1), order="F") # @pariterre "F" seems like an interpolation? + s_array = v_array[offset : offset + nstochastic].reshape((nlp.stochastic_variables.shape, -1), order="F") # @pariterre "F" seems like an interpolation? for key in nlp.stochastic_variables: - data_stochastic_variables[p_idx][key][:, k : k + 1] = u_array[nlp.stochastic_variables[key].index, :] + data_stochastic_variables[p_idx][key][:, k : k + 1] = s_array[nlp.stochastic_variables[key].index, :].reshape(nlp.stochastic_variables[key].shape, 1) offset += nstochastic p_idx += 1 diff --git a/tests/test__global_plots.py b/tests/test__global_plots.py index 0f84f26fc..81bf301f4 100644 --- a/tests/test__global_plots.py +++ b/tests/test__global_plots.py @@ -220,6 +220,7 @@ def override_penalty(pen: list[PenaltyOption]): nlp.states.node_index = node_index nlp.states_dot.node_index = node_index nlp.controls.node_index = node_index + nlp.stochastic_variables.node_index = node_index name = ( p.name.replace("->", "_") From 5a2076cdaa6bfeff27d38530cdbc78db19bb7d29 Mon Sep 17 00:00:00 2001 From: Charbie Date: Wed, 12 Jul 2023 16:25:11 +0200 Subject: [PATCH 27/54] fixed solution --- bioptim/optimization/solution.py | 84 ++++++++++++++++++++++---------- 1 file changed, 59 insertions(+), 25 deletions(-) diff --git a/bioptim/optimization/solution.py b/bioptim/optimization/solution.py index 5d860789d..a3748fcd3 100644 --- a/bioptim/optimization/solution.py +++ b/bioptim/optimization/solution.py @@ -324,31 +324,65 @@ def __init__(self, ocp, sol: dict | list | tuple | np.ndarray | DM | None): def get_integrated_values(states, controls, parameters, stochastic_variables): integrated_values_num = [{} for _ in self.ocp.nlp] for i_phase, nlp in enumerate(self.ocp.nlp): + nlp.states.node_index = 0 + nlp.controls.node_index = 0 + nlp.parameters.node_index = 0 + nlp.stochastic_variables.node_index = 0 for key in nlp.integrated_values: states_cx = nlp.states.cx_start controls_cx = nlp.controls.cx_start stochastic_variables_cx = nlp.stochastic_variables.cx_start integrated_values_cx = nlp.integrated_values[key].cx_start - states_num = states[i_phase]['all'][:, 0] - controls_num = controls[i_phase]['all'][:, 0] - stochastic_variables_num = stochastic_variables[i_phase]['all'][:, 0] + + states_num = np.array([]) + for key_tempo in states[i_phase].keys(): + states_num = np.concatenate((states_num, states[i_phase][key_tempo][:, 0])) + + controls_num = np.array([]) + for key_tempo in controls[i_phase].keys(): + controls_num = np.concatenate((controls_num, controls[i_phase][key_tempo][:, 0])) + + stochastic_variables_num = np.array([]) + for key_tempo in stochastic_variables[i_phase].keys(): + stochastic_variables_num = np.concatenate((stochastic_variables_num, stochastic_variables[i_phase][key_tempo][:, 0])) + for i_node in range(1, nlp.ns): nlp.states.node_index = i_node nlp.controls.node_index = i_node nlp.stochastic_variables.node_index = i_node nlp.integrated_values.node_index = i_node + states_cx = vertcat(states_cx, nlp.states.cx_start) controls_cx = vertcat(controls_cx, nlp.controls.cx_start) stochastic_variables_cx = vertcat(stochastic_variables_cx, nlp.stochastic_variables.cx_start) integrated_values_cx = vertcat(integrated_values_cx, nlp.integrated_values[key].cx_start) - states_num = vertcat(states_num, states[i_phase]['all'][:, i_node]) - controls_num = vertcat(controls_num, controls[i_phase]['all'][:, i_node]) - stochastic_variables_num = vertcat(stochastic_variables_num, stochastic_variables[i_phase]['all'][:, i_node]) + states_num_tempo = np.array([]) + for key_tempo in states[i_phase].keys(): + states_num_tempo = np.concatenate((states_num_tempo, states[i_phase][key_tempo][:, i_node])) + states_num = vertcat(states_num, states_num_tempo) + + controls_num_tempo = np.array([]) + for key_tempo in controls[i_phase].keys(): + controls_num_tempo = np.concatenate((controls_num_tempo, controls[i_phase][key_tempo][:, i_node])) + controls_num = vertcat(controls_num, controls_num_tempo) + + stochastic_variables_num_tempo = np.array([]) + if len(stochastic_variables[i_phase]) > 0: + for key_tempo in stochastic_variables[i_phase].keys(): + stochastic_variables_num_tempo = np.concatenate( + (stochastic_variables_num_tempo, stochastic_variables[i_phase][key_tempo][:, i_node])) + stochastic_variables_num = vertcat(stochastic_variables_num, + stochastic_variables_num_tempo) + + parameters_tempo = np.array([]) + if len(parameters) > 0: + for key_tempo in parameters[i_phase].keys(): + parameters_tempo = np.concatenate((parameters_tempo, parameters[i_phase][key_tempo])) casadi_func = Function("integrate_values", [states_cx, controls_cx, nlp.parameters.cx_start, stochastic_variables_cx], [integrated_values_cx]) - integrated_values_this_time = casadi_func(states_num, controls_num, parameters["all"], stochastic_variables_num) + integrated_values_this_time = casadi_func(states_num, controls_num, parameters_tempo, stochastic_variables_num) nb_elements = nlp.integrated_values[key].cx_start.shape[0] integrated_values_data = np.zeros((nb_elements, nlp.ns)) for i_node in range(nlp.ns): @@ -434,21 +468,21 @@ def init_from_initial_guess(_sol: list): self.vector = np.ndarray((0, 1)) sol_states, sol_controls, sol_stochastic_variables = _sol[0], _sol[1], _sol[3] # For states - for p, s in enumerate(sol_states): - for key in s.keys(): + for p, ss in enumerate(sol_states): + for key in ss.keys(): ns = ( self.ocp.nlp[p].ns + 1 - if s[key].init.type != InterpolationType.EACH_FRAME + if ss[key].init.type != InterpolationType.EACH_FRAME else self.ocp.nlp[p].ns ) - s[key].init.check_and_adjust_dimensions(len(self.ocp.nlp[p].states[key]), ns, "states") + ss[key].init.check_and_adjust_dimensions(len(self.ocp.nlp[p].states[key]), ns, "states") for i in range(self.ns[p] + 1): - for key in s.keys(): - self.vector = np.concatenate((self.vector, s[key].init.evaluate_at(i)[:, np.newaxis])) + for key in ss.keys(): + self.vector = np.concatenate((self.vector, ss[key].init.evaluate_at(i)[:, np.newaxis])) # For controls - for p, s in enumerate(sol_controls): + for p, ss in enumerate(sol_controls): control_type = self.ocp.nlp[p].control_type if control_type == ControlType.CONSTANT: off = 0 @@ -457,29 +491,29 @@ def init_from_initial_guess(_sol: list): else: raise NotImplementedError(f"control_type {control_type} is not implemented in Solution") - for key in s.keys(): + for key in ss.keys(): self.ocp.nlp[p].controls[key].node_index = 0 - s[key].init.check_and_adjust_dimensions(len(self.ocp.nlp[p].controls[key]), self.ns[p], "controls") + ss[key].init.check_and_adjust_dimensions(len(self.ocp.nlp[p].controls[key]), self.ns[p], "controls") for i in range(self.ns[p] + off): - for key in s.keys(): - self.vector = np.concatenate((self.vector, s[key].init.evaluate_at(i)[:, np.newaxis])) + for key in ss.keys(): + self.vector = np.concatenate((self.vector, ss[key].init.evaluate_at(i)[:, np.newaxis])) # For parameters if n_param: sol_params = _sol[2] - for p, s in enumerate(sol_params): - self.vector = np.concatenate((self.vector, np.repeat(s.init, self.ns[p] + 1)[:, np.newaxis])) + for p, ss in enumerate(sol_params): + self.vector = np.concatenate((self.vector, np.repeat(ss.init, self.ns[p] + 1)[:, np.newaxis])) # For stochastic variables - for p, s in enumerate(sol_stochastic_variables): - for key in s.keys(): + for p, ss in enumerate(sol_stochastic_variables): + for key in ss.keys(): self.ocp.nlp[p].stochastic_variables[key].node_index = 0 - s[key].init.check_and_adjust_dimensions(len(self.ocp.nlp[p].stochastic_variables[key]), self.ns[p], "stochastic_variables") + ss[key].init.check_and_adjust_dimensions(len(self.ocp.nlp[p].stochastic_variables[key]), self.ns[p], "stochastic_variables") for i in range(self.ns[p] + 1): - for key in s.keys(): - self.vector = np.concatenate((self.vector, s[key].init.evaluate_at(i)[:, np.newaxis])) + for key in ss.keys(): + self.vector = np.concatenate((self.vector, ss[key].init.evaluate_at(i)[:, np.newaxis])) ( self._states["scaled"], From 5bce6ebe037811b05b950b681b0a4c2b7053ac52 Mon Sep 17 00:00:00 2001 From: Charbie Date: Wed, 12 Jul 2023 16:39:26 +0200 Subject: [PATCH 28/54] test_all_examples passes --- .../examples/torque_driven_ocp/spring_load.py | 4 +++- bioptim/limits/constraints.py | 2 +- bioptim/limits/penalty.py | 2 +- bioptim/limits/penalty_option.py | 5 +++-- bioptim/optimization/solution.py | 16 +++++++++++++--- 5 files changed, 21 insertions(+), 8 deletions(-) diff --git a/bioptim/examples/torque_driven_ocp/spring_load.py b/bioptim/examples/torque_driven_ocp/spring_load.py index ebd1c223e..48c4b3c82 100644 --- a/bioptim/examples/torque_driven_ocp/spring_load.py +++ b/bioptim/examples/torque_driven_ocp/spring_load.py @@ -23,7 +23,7 @@ ) -def custom_dynamic(states: MX, controls: MX, parameters: MX, nlp: NonLinearProgram) -> DynamicsEvaluation: +def custom_dynamic(states: MX, controls: MX, parameters: MX, stochastic_variables: MX, nlp: NonLinearProgram) -> DynamicsEvaluation: """ The dynamics of the system using an external force (see custom_dynamics for more explanation) @@ -35,6 +35,8 @@ def custom_dynamic(states: MX, controls: MX, parameters: MX, nlp: NonLinearProgr The current controls of the system parameters: MX The current parameters of the system + stochastic_variables: MX + The current stochastic variables of the system nlp: NonLinearProgram A reference to the phase of the ocp diff --git a/bioptim/limits/constraints.py b/bioptim/limits/constraints.py index a80f8a18f..7ee9fcf2f 100644 --- a/bioptim/limits/constraints.py +++ b/bioptim/limits/constraints.py @@ -244,7 +244,7 @@ def non_slipping( constraint.max_bound = np.array([np.inf, np.inf]) contact = controller.get_nlp.contact_forces_func( - controller.states.cx_start, controller.controls.cx_start, controller.parameters.cx + controller.states.cx_start, controller.controls.cx_start, controller.parameters.cx, controller.stochastic_variables.cx_start ) normal_contact_force_squared = sum1(contact[normal_component_idx, 0]) ** 2 if len(tangential_component_idx) == 1: diff --git a/bioptim/limits/penalty.py b/bioptim/limits/penalty.py index 44e1bc06f..d24edf09a 100644 --- a/bioptim/limits/penalty.py +++ b/bioptim/limits/penalty.py @@ -657,7 +657,7 @@ def minimize_contact_forces( penalty.quadratic = True if penalty.quadratic is None else penalty.quadratic contact_force = controller.get_nlp.contact_forces_func( - controller.states.cx_start, controller.controls.cx_start, controller.parameters.cx + controller.states.cx_start, controller.controls.cx_start, controller.parameters.cx, controller.stochastic_variables.cx_start ) return contact_force diff --git a/bioptim/limits/penalty_option.py b/bioptim/limits/penalty_option.py index 2a94bf62a..d10771336 100644 --- a/bioptim/limits/penalty_option.py +++ b/bioptim/limits/penalty_option.py @@ -488,8 +488,9 @@ def get_u(u: MX | SX, dt: MX | SX): control_cx_scaled = horzcat(controller.controls_scaled.cx_end, controller.controls_scaled.cx_start) self.function[node] = biorbd.to_casadi_func( f"{name}", - self.function[node](controller.states_scaled.cx_end, controller.controls_scaled.cx_end, param_cx, stochastic_cx_scaled.cx_end) - - self.function[node](controller.states_scaled.cx_start, controller.controls_scaled.cx_start, param_cx, stochastic_cx_scaled.cx_end), + # TODO: Charbie -> this is Flase, add stochastic_variables for start, mid AND end + self.function[node](controller.states_scaled.cx_end, controller.controls_scaled.cx_end, param_cx, controller.stochastic_variables.cx_start) + - self.function[node](controller.states_scaled.cx_start, controller.controls_scaled.cx_start, param_cx, controller.stochastic_variables.cx_start), state_cx_scaled, control_cx_scaled, param_cx, diff --git a/bioptim/optimization/solution.py b/bioptim/optimization/solution.py index a3748fcd3..e8b18d047 100644 --- a/bioptim/optimization/solution.py +++ b/bioptim/optimization/solution.py @@ -1570,11 +1570,13 @@ def _get_penalty_cost(self, nlp, penalty): for idx in penalty.node_idx: x = [] u = [] + s = [] target = [] if nlp is not None: if penalty.multinode_penalty or penalty.transition: x = np.array(()) u = np.array(()) + s = np.array(()) for i in range(len(penalty.nodes_phase)): node_idx = penalty.multinode_idx[i] phase_idx = penalty.nodes_phase[i] @@ -1584,7 +1586,9 @@ def _get_penalty_cost(self, nlp, penalty): for key in nlp.controls: # Make an exception to the fact that U is not available for the last node u = np.concatenate((u, self._controls["scaled"][phase_idx][key][:, node_idx])) - + for key in nlp.stochastic_variables: + s = np.concatenate((s, self.stochastic_variables[phase_idx][key][:, node_idx]) + ) elif ( "Lagrange" not in penalty.type.__str__() and "Mayer" not in penalty.type.__str__() @@ -1596,6 +1600,7 @@ def _get_penalty_cost(self, nlp, penalty): else: col_x_idx = list(range(idx * steps, (idx + 1) * steps)) if penalty.integrate else [idx] col_u_idx = [idx] + col_s_idx = [idx] if ( penalty.derivative or penalty.explicit_derivative @@ -1631,6 +1636,11 @@ def _get_penalty_cost(self, nlp, penalty): if nlp.control_type == ControlType.NONE else self._controls["scaled"][phase_idx][key][:, col_u_idx] ) + + s = np.ndarray((nlp.stochastic_variables.shape, len(col_s_idx))) + for key in nlp.stochastic_variables: + s[nlp.stochastic_variables[key].index, :] = self.stochastic_variables["scaled"][phase_idx][key][:, col_s_idx] + if penalty.target is None: target = [] elif ( @@ -1650,8 +1660,8 @@ def _get_penalty_cost(self, nlp, penalty): # casadi function if not self.ocp.assume_phase_dynamics and ((isinstance(u, list) and u != []) or isinstance(u, np.ndarray)): u = u[:, ~np.isnan(np.sum(u, axis=0))] - val.append(penalty.function[idx](x, u, p)) - val_weighted.append(penalty.weighted_function[idx](x, u, p, penalty.weight, target, dt)) + val.append(penalty.function[idx](x, u, p, s)) + val_weighted.append(penalty.weighted_function[idx](x, u, p, s, penalty.weight, target, dt)) val = np.nansum(val) val_weighted = np.nansum(val_weighted) From 95782e355a29aa71dfdef4988d1c531b7c418713 Mon Sep 17 00:00:00 2001 From: Charbie Date: Wed, 12 Jul 2023 16:58:30 +0200 Subject: [PATCH 29/54] fixed tests up to custom_model --- bioptim/dynamics/dynamics_functions.py | 3 +++ .../custom_model/custom_package/custom_dynamics.py | 1 + bioptim/limits/penalty_option.py | 1 + tests/test__global_plots.py | 11 ++++++----- tests/test_controltype_none.py | 3 ++- 5 files changed, 13 insertions(+), 6 deletions(-) diff --git a/bioptim/dynamics/dynamics_functions.py b/bioptim/dynamics/dynamics_functions.py index a0a836ee9..4c1675c6e 100644 --- a/bioptim/dynamics/dynamics_functions.py +++ b/bioptim/dynamics/dynamics_functions.py @@ -902,6 +902,7 @@ def holonomic_torque_driven( states: MX | SX, controls: MX | SX, parameters: MX | SX, + stochastic_variables: MX | SX, nlp: NonLinearProgram, ) -> DynamicsEvaluation: """ @@ -915,6 +916,8 @@ def holonomic_torque_driven( The controls of the system parameters: MX | SX The parameters acting on the system + stochastic_variables: MX | SX + The stochastic variables of the system nlp: NonLinearProgram A reference to the phase diff --git a/bioptim/examples/custom_model/custom_package/custom_dynamics.py b/bioptim/examples/custom_model/custom_package/custom_dynamics.py index c83eb1bf5..fa2f5bc00 100644 --- a/bioptim/examples/custom_model/custom_package/custom_dynamics.py +++ b/bioptim/examples/custom_model/custom_package/custom_dynamics.py @@ -17,6 +17,7 @@ def custom_dynamics( states: MX, controls: MX, parameters: MX, + stochastic_variables: MX, nlp: NonLinearProgram, ) -> DynamicsEvaluation: """ diff --git a/bioptim/limits/penalty_option.py b/bioptim/limits/penalty_option.py index d10771336..7a4ecfaab 100644 --- a/bioptim/limits/penalty_option.py +++ b/bioptim/limits/penalty_option.py @@ -568,6 +568,7 @@ def get_u(u: MX | SX, dt: MX | SX): state_cx_scaled, control_cx_scaled, param_cx, + stochastic_cx_scaled, target_cx, dt_cx, ) diff --git a/tests/test__global_plots.py b/tests/test__global_plots.py index 81bf301f4..079f29956 100644 --- a/tests/test__global_plots.py +++ b/tests/test__global_plots.py @@ -237,16 +237,17 @@ def override_penalty(pen: list[PenaltyOption]): if p.weighted_function[node_index].sparsity_in("i1").shape == (0, 0): u = MX.sym("u", 3, 1) param = MX.sym("param", *p.weighted_function[node_index].sparsity_in("i2").shape) - weight = MX.sym("weight", *p.weighted_function[node_index].sparsity_in("i3").shape) - target = MX.sym("target", *p.weighted_function[node_index].sparsity_in("i4").shape) - dt = MX.sym("dt", *p.weighted_function[node_index].sparsity_in("i5").shape) + s = MX.sym("s", *p.weighted_function[node_index].sparsity_in("i3").shape) + weight = MX.sym("weight", *p.weighted_function[node_index].sparsity_in("i4").shape) + target = MX.sym("target", *p.weighted_function[node_index].sparsity_in("i5").shape) + dt = MX.sym("dt", *p.weighted_function[node_index].sparsity_in("i6").shape) p.function[node_index] = Function( - name, [x, u, param], [np.array([range(cmp, len(p.rows) + cmp)]).T] + name, [x, u, param, s], [np.array([range(cmp, len(p.rows) + cmp)]).T] ) p.function_non_threaded[node_index] = p.function[node_index] p.weighted_function[node_index] = Function( - name, [x, u, param, weight, target, dt], [np.array([range(cmp + 1, len(p.rows) + cmp + 1)]).T] + name, [x, u, param, s, weight, target, dt], [np.array([range(cmp + 1, len(p.rows) + cmp + 1)]).T] ) p.weighted_function_non_threaded[node_index] = p.weighted_function[node_index] diff --git a/tests/test_controltype_none.py b/tests/test_controltype_none.py index 4d7fa6649..7a9879435 100644 --- a/tests/test_controltype_none.py +++ b/tests/test_controltype_none.py @@ -121,9 +121,10 @@ def custom_configure_dynamics_function(self, ocp, nlp, **extra_params): nlp.states.scaled.mx_reduced, nlp.controls.scaled.mx_reduced, nlp.parameters.mx, + nlp.stochastic_variables.mx, ], [dynamics_eval_horzcat], - ["x", "u", "p"], + ["x", "u", "p", "s"], ["xdot"], ) From a46076d3dce329789437aeffa3ed17315ea7f83c Mon Sep 17 00:00:00 2001 From: Charbie Date: Wed, 12 Jul 2023 17:44:57 +0200 Subject: [PATCH 30/54] fixed tests up to mhe --- bioptim/dynamics/ode_solver.py | 4 +- .../optimization/optimal_control_program.py | 16 +++--- bioptim/optimization/solution.py | 2 + tests/test_dynamics.py | 55 +++++++++++-------- tests/utils.py | 5 +- 5 files changed, 50 insertions(+), 32 deletions(-) diff --git a/bioptim/dynamics/ode_solver.py b/bioptim/dynamics/ode_solver.py index def7841a2..4c32c4bb2 100644 --- a/bioptim/dynamics/ode_solver.py +++ b/bioptim/dynamics/ode_solver.py @@ -441,6 +441,7 @@ def integrator(self, ocp, nlp, node_index: int) -> list: nlp.states.scaled.cx_start, nlp.controls.scaled.cx_start, nlp.parameters.cx, + nlp.stochastic_variables.cx_start, ), } ode_opt = {"t0": 0, "tf": nlp.dt} @@ -454,13 +455,14 @@ def integrator(self, ocp, nlp, node_index: int) -> list: nlp.states.scaled.cx_start, nlp.controls.scaled.cx_start, nlp.parameters.cx, + nlp.stochastic_variables.cx_start, ], self._adapt_integrator_output( integrator_func, nlp.states.scaled.cx_start, nlp.controls.scaled.cx_start, ), - ["x0", "p", "params"], + ["x0", "p", "params", "s"], ["xf", "xall"], ) ] diff --git a/bioptim/optimization/optimal_control_program.py b/bioptim/optimization/optimal_control_program.py index 8f09d18fb..a81264056 100644 --- a/bioptim/optimization/optimal_control_program.py +++ b/bioptim/optimization/optimal_control_program.py @@ -378,6 +378,15 @@ def set_original_values(self, assume_phase_dynamics, integrated_value_functions, ): + + # Placed here because of MHE + if isinstance(dynamics, Dynamics): + dynamics_type_tp = DynamicsList() + dynamics_type_tp.add(dynamics) + dynamics = dynamics_type_tp + elif not isinstance(dynamics, DynamicsList): + raise RuntimeError("dynamics should be a Dynamics or a DynamicsList") + self.original_values = { "bio_model": [m.serialize() for m in bio_model], "dynamics": dynamics, @@ -454,13 +463,6 @@ def check_arguments_and_build_nlp(self, node_mappings, state_continuity_weight): - if isinstance(dynamics, Dynamics): - dynamics_type_tp = DynamicsList() - dynamics_type_tp.add(dynamics) - dynamics = dynamics_type_tp - elif not isinstance(dynamics, DynamicsList): - raise RuntimeError("dynamics should be a Dynamics or a DynamicsList") - if not isinstance(n_threads, int) or isinstance(n_threads, bool) or n_threads < 1: raise RuntimeError("n_threads should be a positive integer greater or equal than 1") diff --git a/bioptim/optimization/solution.py b/bioptim/optimization/solution.py index e8b18d047..831f512bf 100644 --- a/bioptim/optimization/solution.py +++ b/bioptim/optimization/solution.py @@ -1170,6 +1170,8 @@ def __perform_integration( params = vertcat(*[self.parameters[key] for key in self.parameters]) for p, (nlp, t_eval) in enumerate(zip(self.ocp.nlp, out._time_vector)): + self.ocp.nlp[p].controls.node_index = 0 + states_phase_idx = self.ocp.nlp[p].use_states_from_phase_idx controls_phase_idx = self.ocp.nlp[p].use_controls_from_phase_idx param_scaling = nlp.parameters.scaling diff --git a/tests/test_dynamics.py b/tests/test_dynamics.py index 2a9bef8e2..66cc6a07c 100644 --- a/tests/test_dynamics.py +++ b/tests/test_dynamics.py @@ -91,10 +91,11 @@ def test_torque_driven(with_contact, with_external_force, cx, rigidbody_dynamics states = np.random.rand(nlp.states.shape, nlp.ns) controls = np.random.rand(nlp.controls.shape, nlp.ns) params = np.random.rand(nlp.parameters.shape, nlp.ns) - x_out = np.array(nlp.dynamics_func(states, controls, params)) + stochastic_variables = np.random.rand(nlp.stochastic_variables.shape, nlp.ns) + x_out = np.array(nlp.dynamics_func(states, controls, params, stochastic_variables)) if rigidbody_dynamics == RigidBodyDynamics.ODE: if with_contact: - contact_out = np.array(nlp.contact_forces_func(states, controls, params)) + contact_out = np.array(nlp.contact_forces_func(states, controls, params, stochastic_variables)) if with_external_force: np.testing.assert_almost_equal( x_out[:, 0], @@ -131,7 +132,7 @@ def test_torque_driven(with_contact, with_external_force, cx, rigidbody_dynamics ) elif rigidbody_dynamics == RigidBodyDynamics.DAE_FORWARD_DYNAMICS: if with_contact: - contact_out = np.array(nlp.contact_forces_func(states, controls, params)) + contact_out = np.array(nlp.contact_forces_func(states, controls, params, stochastic_variables)) if with_external_force: np.testing.assert_almost_equal( x_out[:, 0], [0.8631034, 0.3251833, 0.1195942, 0.4937956, 0.8074402, 0.4271078, 0.417411, 0.3232029] @@ -156,7 +157,7 @@ def test_torque_driven(with_contact, with_external_force, cx, rigidbody_dynamics ) elif rigidbody_dynamics == RigidBodyDynamics.DAE_INVERSE_DYNAMICS: if with_contact: - contact_out = np.array(nlp.contact_forces_func(states, controls, params)) + contact_out = np.array(nlp.contact_forces_func(states, controls, params, stochastic_variables)) if with_external_force: np.testing.assert_almost_equal( x_out[:, 0], [0.8631034, 0.3251833, 0.1195942, 0.4937956, 0.8074402, 0.4271078, 0.417411, 0.3232029] @@ -230,10 +231,11 @@ def test_torque_driven_implicit(with_contact, cx, assume_phase_dynamics): states = np.random.rand(nlp.states.shape, nlp.ns) controls = np.random.rand(nlp.controls.shape, nlp.ns) params = np.random.rand(nlp.parameters.shape, nlp.ns) - x_out = np.array(nlp.dynamics_func(states, controls, params)) + stochastic_variables = np.random.rand(nlp.stochastic_variables.shape, nlp.ns) + x_out = np.array(nlp.dynamics_func(states, controls, params, stochastic_variables)) if with_contact: - contact_out = np.array(nlp.contact_forces_func(states, controls, params)) + contact_out = np.array(nlp.contact_forces_func(states, controls, params, stochastic_variables)) np.testing.assert_almost_equal( x_out[:, 0], [0.6118529, 0.785176, 0.6075449, 0.8083973, 0.3886773, 0.5426961, 0.7722448, 0.7290072] ) @@ -294,10 +296,11 @@ def test_torque_driven_soft_contacts_dynamics(with_contact, cx, implicit_contact states = np.random.rand(nlp.states.shape, nlp.ns) controls = np.random.rand(nlp.controls.shape, nlp.ns) params = np.random.rand(nlp.parameters.shape, nlp.ns) - x_out = np.array(nlp.dynamics_func(states, controls, params)) + stochastic_variables = np.random.rand(nlp.stochastic_variables.shape, nlp.ns) + x_out = np.array(nlp.dynamics_func(states, controls, params, stochastic_variables)) if with_contact: - contact_out = np.array(nlp.contact_forces_func(states, controls, params)) + contact_out = np.array(nlp.contact_forces_func(states, controls, params, stochastic_variables)) np.testing.assert_almost_equal( x_out[:, 0], [0.6118529, 0.785176, 0.6075449, 0.8083973, -0.3214905, -0.1912131, 0.6507164, -0.2359716] ) @@ -366,10 +369,11 @@ def test_torque_derivative_driven(with_contact, with_external_force, cx, assume_ states = np.random.rand(nlp.states.shape, nlp.ns) controls = np.random.rand(nlp.controls.shape, nlp.ns) params = np.random.rand(nlp.parameters.shape, nlp.ns) - x_out = np.array(nlp.dynamics_func(states, controls, params)) + stochastic_variables = np.random.rand(nlp.stochastic_variables.shape, nlp.ns) + x_out = np.array(nlp.dynamics_func(states, controls, params, stochastic_variables)) if with_contact: - contact_out = np.array(nlp.contact_forces_func(states, controls, params)) + contact_out = np.array(nlp.contact_forces_func(states, controls, params, stochastic_variables)) if with_external_force: np.testing.assert_almost_equal( x_out[:, 0], @@ -496,10 +500,11 @@ def test_torque_derivative_driven_implicit(with_contact, cx, assume_phase_dynami states = np.random.rand(nlp.states.shape, nlp.ns) controls = np.random.rand(nlp.controls.shape, nlp.ns) params = np.random.rand(nlp.parameters.shape, nlp.ns) - x_out = np.array(nlp.dynamics_func(states, controls, params)) + stochastic_variables = np.random.rand(nlp.stochastic_variables.shape, nlp.ns) + x_out = np.array(nlp.dynamics_func(states, controls, params, stochastic_variables)) if with_contact: - contact_out = np.array(nlp.contact_forces_func(states, controls, params)) + contact_out = np.array(nlp.contact_forces_func(states, controls, params, stochastic_variables)) np.testing.assert_almost_equal( x_out[:, 0], [ @@ -594,10 +599,11 @@ def test_torque_derivative_driven_soft_contacts_dynamics(with_contact, cx, impli states = np.random.rand(nlp.states.shape, nlp.ns) controls = np.random.rand(nlp.controls.shape, nlp.ns) params = np.random.rand(nlp.parameters.shape, nlp.ns) - x_out = np.array(nlp.dynamics_func(states, controls, params)) + stochastic_variables = np.random.rand(nlp.stochastic_variables.shape, nlp.ns) + x_out = np.array(nlp.dynamics_func(states, controls, params, stochastic_variables)) if with_contact: - contact_out = np.array(nlp.contact_forces_func(states, controls, params)) + contact_out = np.array(nlp.contact_forces_func(states, controls, params, stochastic_variables)) np.testing.assert_almost_equal( x_out[:, 0], [ @@ -772,10 +778,11 @@ def test_torque_activation_driven(with_contact, with_external_force, cx, assume_ states = np.random.rand(nlp.states.shape, nlp.ns) controls = np.random.rand(nlp.controls.shape, nlp.ns) params = np.random.rand(nlp.parameters.shape, nlp.ns) - x_out = np.array(nlp.dynamics_func(states, controls, params)) + stochastic_variables = np.random.rand(nlp.stochastic_variables.shape, nlp.ns) + x_out = np.array(nlp.dynamics_func(states, controls, params, stochastic_variables)) if with_contact: - contact_out = np.array(nlp.contact_forces_func(states, controls, params)) + contact_out = np.array(nlp.contact_forces_func(states, controls, params, stochastic_variables)) if with_external_force: np.testing.assert_almost_equal( x_out[:, 0], @@ -877,7 +884,8 @@ def test_torque_activation_driven_with_residual_torque( states = np.random.rand(nlp.states.shape, nlp.ns) controls = np.random.rand(nlp.controls.shape, nlp.ns) params = np.random.rand(nlp.parameters.shape, nlp.ns) - x_out = np.array(nlp.dynamics_func(states, controls, params)) + stochastic_variables = np.random.rand(nlp.stochastic_variables.shape, nlp.ns) + x_out = np.array(nlp.dynamics_func(states, controls, params, stochastic_variables)) if with_residual_torque: if with_external_force: @@ -1003,7 +1011,8 @@ def test_muscle_driven( states = np.random.rand(nlp.states.shape, nlp.ns) controls = np.random.rand(nlp.controls.shape, nlp.ns) params = np.random.rand(nlp.parameters.shape, nlp.ns) - x_out = np.array(nlp.dynamics_func(states, controls, params)) + stochastic_variables = np.random.rand(nlp.stochastic_variables.shape, nlp.ns) + x_out = np.array(nlp.dynamics_func(states, controls, params, stochastic_variables)) if with_contact: # Warning this test is a bit bogus, there since the model does not have contacts if rigidbody_dynamics == RigidBodyDynamics.DAE_INVERSE_DYNAMICS: @@ -1505,7 +1514,8 @@ def test_joints_acceleration_driven(cx, rigid_body_dynamics, assume_phase_dynami states = np.random.rand(nlp.states.shape, nlp.ns) controls = np.random.rand(nlp.controls.shape, nlp.ns) params = np.random.rand(nlp.parameters.shape, nlp.ns) - x_out = np.array(nlp.dynamics_func(states, controls, params)) + stochastic_variables = np.random.rand(nlp.stochastic_variables.shape, nlp.ns) + x_out = np.array(nlp.dynamics_func(states, controls, params, stochastic_variables)) # obtained using Ipuch reference implementation. [https://github.com/Ipuch/OnDynamicsForSomersaults] np.testing.assert_almost_equal(x_out[:, 0], [0.02058449, 0.18340451, -2.95556261, 0.61185289]) @@ -1514,7 +1524,7 @@ def test_joints_acceleration_driven(cx, rigid_body_dynamics, assume_phase_dynami @pytest.mark.parametrize("assume_phase_dynamics", [True, False]) @pytest.mark.parametrize("with_contact", [False, True]) def test_custom_dynamics(with_contact, assume_phase_dynamics): - def custom_dynamic(states, controls, parameters, nlp, with_contact=False) -> DynamicsEvaluation: + def custom_dynamic(states, controls, parameters, stochastic_variables, nlp, with_contact=False) -> DynamicsEvaluation: q = DynamicsFunctions.get(nlp.states["q"], states) qdot = DynamicsFunctions.get(nlp.states["qdot"], states) tau = DynamicsFunctions.get(nlp.controls["tau"], controls) @@ -1570,10 +1580,11 @@ def configure(ocp, nlp, with_contact=None): states = np.random.rand(nlp.states.shape, nlp.ns) controls = np.random.rand(nlp.controls.shape, nlp.ns) params = np.random.rand(nlp.parameters.shape, nlp.ns) - x_out = np.array(nlp.dynamics_func(states, controls, params)) + stochastic_variables = np.random.rand(nlp.stochastic_variables.shape, nlp.ns) + x_out = np.array(nlp.dynamics_func(states, controls, params, stochastic_variables)) if with_contact: - contact_out = np.array(nlp.contact_forces_func(states, controls, params)) + contact_out = np.array(nlp.contact_forces_func(states, controls, params, stochastic_variables)) np.testing.assert_almost_equal( x_out[:, 0], [0.6118529, 0.785176, 0.6075449, 0.8083973, -0.3214905, -0.1912131, 0.6507164, -0.2359716] ) diff --git a/tests/utils.py b/tests/utils.py index 293598d43..6b3a89bf2 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -60,8 +60,9 @@ def save_and_load(sol, ocp, test_solve_of_loaded=False): TestUtils.deep_assert(controls, sol.controls) TestUtils.deep_assert(parameters, sol.parameters) - os.remove(f"{file_path}.bo") - os.remove(f"{file_path}_sa.bo") + # @ Pariterre, merge problem ? + # os.remove(f"{file_path}.bo") + # os.remove(f"{file_path}_sa.bo") @staticmethod def deep_assert(first_elem, second_elem): From 797d041b2596f79c541a539fa5fd2ab8923eab60 Mon Sep 17 00:00:00 2001 From: Charbie Date: Wed, 12 Jul 2023 18:20:28 +0200 Subject: [PATCH 31/54] fixed some more tests (up to penalty) --- bioptim/interfaces/acados_interface.py | 3 +- bioptim/limits/penalty_controller.py | 1 + bioptim/limits/penalty_option.py | 3 +- .../receding_horizon_optimization.py | 19 ++++- bioptim/optimization/solution.py | 13 ++- tests/test_global_stochastic.py | 1 - tests/test_initial_condition.py | 8 +- tests/test_ligaments.py | 12 ++- tests/test_passive_torque.py | 12 ++- tests/test_penalty.py | 79 ++++++++++--------- 10 files changed, 91 insertions(+), 60 deletions(-) diff --git a/bioptim/interfaces/acados_interface.py b/bioptim/interfaces/acados_interface.py index 560f9c49e..fe4531aa2 100644 --- a/bioptim/interfaces/acados_interface.py +++ b/bioptim/interfaces/acados_interface.py @@ -158,6 +158,7 @@ def __acados_export_model(self, ocp): x = ocp.nlp[0].states.cx_start u = ocp.nlp[0].controls.cx_start p = ocp.nlp[0].parameters.cx + s = ocp.nlp[0].stochastic_variables.cx_start if ocp.parameters: for param in ocp.parameters: if str(param.cx)[:11] == f"time_phase_": @@ -168,7 +169,7 @@ def __acados_export_model(self, ocp): x = vertcat(p, x) x_dot = SX.sym("x_dot", x.shape[0], x.shape[1]) - f_expl = vertcat([0] * self.nparams, ocp.nlp[0].dynamics_func(x[self.nparams :, :], u, p)) + f_expl = vertcat([0] * self.nparams, ocp.nlp[0].dynamics_func(x[self.nparams :, :], u, p, s)) f_impl = x_dot - f_expl self.acados_model.f_impl_expr = f_impl diff --git a/bioptim/limits/penalty_controller.py b/bioptim/limits/penalty_controller.py index 3673e6b33..d14d6b8eb 100644 --- a/bioptim/limits/penalty_controller.py +++ b/bioptim/limits/penalty_controller.py @@ -26,6 +26,7 @@ def __init__( x_scaled: list, u_scaled: list, p: MX | SX | list, + s: list, node_index: int = None, ): """ diff --git a/bioptim/limits/penalty_option.py b/bioptim/limits/penalty_option.py index 7a4ecfaab..33adfbede 100644 --- a/bioptim/limits/penalty_option.py +++ b/bioptim/limits/penalty_option.py @@ -824,4 +824,5 @@ def _get_penalty_controller(self, ocp, nlp) -> PenaltyController: if nlp.U is not None and (not isinstance(nlp.U, list) or nlp.U != []): u = [nlp.U[idx] for idx in t if idx != nlp.ns] u_scaled = [nlp.U_scaled[idx] for idx in t if idx != nlp.ns] - return PenaltyController(ocp, nlp, t, x, u, x_scaled, u_scaled, nlp.parameters.cx) + s = [nlp.S[idx] for idx in t] + return PenaltyController(ocp, nlp, t, x, u, x_scaled, u_scaled, nlp.parameters.cx, s) diff --git a/bioptim/optimization/receding_horizon_optimization.py b/bioptim/optimization/receding_horizon_optimization.py index 0a4552be1..e705249aa 100644 --- a/bioptim/optimization/receding_horizon_optimization.py +++ b/bioptim/optimization/receding_horizon_optimization.py @@ -220,6 +220,8 @@ def _initialize_solution(self, states: list, controls: list): controls_tp = controls_tp[:, :-1] u_init.add(key, controls_tp, interpolation=InterpolationType.EACH_FRAME) + s_init = InitialGuessList() + p_init = InitialGuessList() model_class = self.original_values["bio_model"][0][0] model_initializer = self.original_values["bio_model"][0][1] solution_ocp = OptimalControlProgram( @@ -233,10 +235,11 @@ def _initialize_solution(self, states: list, controls: list): u_bounds=self.nlp[0].u_bounds, x_init=x_init, u_init=u_init, + s_init=s_init, use_sx=self.original_values["use_sx"], ) - return Solution(solution_ocp, [x_init, u_init_for_solution]) + return Solution(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) @@ -442,6 +445,8 @@ def _initialize_solution(self, states: list, controls: list): controls_tp = controls_tp[:, :-1] u_init.add(key, controls_tp, interpolation=InterpolationType.EACH_FRAME) + s_init = InitialGuessList() + p_init = InitialGuessList() model_class = self.original_values["bio_model"][0][0] model_initializer = self.original_values["bio_model"][0][1] solution_ocp = OptimalControlProgram( @@ -453,10 +458,11 @@ def _initialize_solution(self, states: list, controls: list): u_bounds=self.nlp[0].u_bounds, x_init=x_init, u_init=u_init, + s_init=s_init, skip_continuity=True, use_sx=self.original_values["use_sx"], ) - return Solution(solution_ocp, [x_init, u_init_for_solution]) + return Solution(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: @@ -676,6 +682,8 @@ def _initialize_solution(self, states: list, controls: list): controls_tp = controls_tp[:, :-1] u_init.add(key, controls_tp, interpolation=InterpolationType.EACH_FRAME, phase=0) + s_init = InitialGuessList() + p_init = InitialGuessList() model_class = self.original_values["bio_model"][0][0] model_initializer = self.original_values["bio_model"][0][1] solution_ocp = OptimalControlProgram( @@ -688,9 +696,10 @@ def _initialize_solution(self, states: list, controls: list): skip_continuity=True, x_init=x_init, u_init=u_init, + s_init=s_init, use_sx=self.original_values["use_sx"], ) - return Solution(solution_ocp, [x_init, u_init_for_solution]) + return Solution(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""" @@ -717,6 +726,7 @@ def _initialize_one_cycle(self, states: np.ndarray, controls: np.ndarray): model_class = original_values["bio_model"][0][0] model_initializer = original_values["bio_model"][0][1] + s_init = InitialGuessList() solution_ocp = OptimalControlProgram( bio_model=model_class(**model_initializer), dynamics=original_values["dynamics"][0], @@ -727,9 +737,10 @@ def _initialize_one_cycle(self, states: np.ndarray, controls: np.ndarray): skip_continuity=True, x_init=x_init, u_init=u_init, + s_init=s_init, use_sx=original_values["use_sx"], ) - return Solution(solution_ocp, [x_init, u_init_for_solution]) + return Solution(solution_ocp, [x_init, u_init_for_solution, s_init]) class NonlinearModelPredictiveControl(RecedingHorizonOptimization): diff --git a/bioptim/optimization/solution.py b/bioptim/optimization/solution.py index 831f512bf..99642b7e3 100644 --- a/bioptim/optimization/solution.py +++ b/bioptim/optimization/solution.py @@ -450,10 +450,10 @@ def init_from_initial_guess(_sol: list): for _ in range(len(self.ns)): tp.add(deepcopy(_sol[i].init), interpolation=_sol[i].init.type) _sol[i] = tp - if sum([isinstance(s, InitialGuessList) for s in _sol]) != 2: + if sum([isinstance(s, InitialGuessList) for s in _sol]) != 3: raise ValueError( "solution must be a solution dict, " - "an InitialGuess[List] of len 2 or 3 (states, controls, parameters), " + "an InitialGuess[List] of len 3 or 4 (states, controls, parameters, stochastic_variables), " "or a None" ) if sum([len(s) != len(self.ns) if p != 3 else False for p, s in enumerate(_sol)]) != 0: @@ -562,7 +562,7 @@ def init_from_vector(_sol: np.ndarray | DM): elif sol is None: self.ns = [] else: - raise ValueError("Solution called with unknown initializer") + raise ValueError("Solution called with unknown initializer") # @ Pariterre this seems weird, since it is used in test_initial_conditions def _to_unscaled_values(self, states_scaled, controls_scaled) -> tuple: """ @@ -1103,9 +1103,14 @@ def _get_first_frame_states(self, sol, shooting_type: Shooting, phase: int) -> n if self.ocp.assume_phase_dynamics or not np.isnan(u0).any(): u0 = vertcat(u0, u0) params = [] + s0 = [] + if len(self.ocp.nlp[phase - 1].stochastic_variables) > 0: + s0 = np.concatenate( + [self.stochastic_variables[phase - 1][key][:, -1] for key in self.ocp.nlp[phase - 1].stochastic_variables] + ) if self.parameters.keys(): params = np.vstack([self.parameters[key] for key in self.parameters]) - val = self.ocp.phase_transitions[phase - 1].function[-1](vertcat(x0, x0), u0, params) + val = self.ocp.phase_transitions[phase - 1].function[-1](vertcat(x0, x0), u0, params, s0) if val.shape[0] != x0.shape[0]: raise RuntimeError( f"Phase transition must have the same number of states ({val.shape[0]}) " diff --git a/tests/test_global_stochastic.py b/tests/test_global_stochastic.py index 39622a6fb..78e4a8244 100644 --- a/tests/test_global_stochastic.py +++ b/tests/test_global_stochastic.py @@ -31,7 +31,6 @@ def test_arm_reaching_muscle_driven(): final_time=final_time, n_shooting=n_shooting, ee_final_position=ee_final_position, - ee_initial_position=ee_initial_position, problem_type=problem_type, force_field_magnitude=force_field_magnitude ) diff --git a/tests/test_initial_condition.py b/tests/test_initial_condition.py index 4dcaf8786..d56b366c9 100644 --- a/tests/test_initial_condition.py +++ b/tests/test_initial_condition.py @@ -194,8 +194,10 @@ def test_simulate_from_initial_multiple_shoot(assume_phase_dynamics): X["qdot"] = [1, 0.5] U = InitialGuessList() U.add("tau", np.array([[-0.1, 0], [1, 2]]).T, interpolation=InterpolationType.LINEAR) + P = InitialGuessList() + S = InitialGuessList() - sol = Solution(ocp, [X, U]) + sol = Solution(ocp, [X, U, P, S]) controls = sol.controls sol = sol.integrate( shooting_type=Shooting.MULTIPLE, keep_intermediate_points=True, integrator=SolutionIntegrator.OCP @@ -238,8 +240,10 @@ def test_simulate_from_initial_single_shoot(assume_phase_dynamics): X["qdot"] = [0.1, 0.2] U = InitialGuessList() U.add("tau", np.array([[-0.1, 0], [1, 2]]).T, interpolation=InterpolationType.LINEAR) + P = InitialGuessList() + S = InitialGuessList() - sol = Solution(ocp, [X, U]) + sol = Solution(ocp, [X, U, P, S]) controls = sol.controls sol = sol.integrate(shooting_type=Shooting.SINGLE, keep_intermediate_points=True, integrator=SolutionIntegrator.OCP) diff --git a/tests/test_ligaments.py b/tests/test_ligaments.py index 633df884f..f65ba6e34 100644 --- a/tests/test_ligaments.py +++ b/tests/test_ligaments.py @@ -73,7 +73,8 @@ def test_torque_driven_with_ligament(with_ligament, cx, assume_phase_dynamics): states = np.random.rand(nlp.states.shape, nlp.ns) controls = np.random.rand(nlp.controls.shape, nlp.ns) params = np.random.rand(nlp.parameters.shape, nlp.ns) - x_out = np.array(nlp.dynamics_func(states, controls, params)) + stochastic_variables = np.random.rand(nlp.stochastic_variables.shape, nlp.ns) + x_out = np.array(nlp.dynamics_func(states, controls, params, stochastic_variables)) if with_ligament: np.testing.assert_almost_equal( x_out[:, 0], @@ -132,7 +133,8 @@ def test_torque_derivative_driven_with_ligament(with_ligament, cx, assume_phase_ states = np.random.rand(nlp.states.shape, nlp.ns) controls = np.random.rand(nlp.controls.shape, nlp.ns) params = np.random.rand(nlp.parameters.shape, nlp.ns) - x_out = np.array(nlp.dynamics_func(states, controls, params)) + stochastic_variables = np.random.rand(nlp.stochastic_variables.shape, nlp.ns) + x_out = np.array(nlp.dynamics_func(states, controls, params, stochastic_variables)) if with_ligament: np.testing.assert_almost_equal( x_out[:, 0], @@ -187,7 +189,8 @@ def test_torque_activation_driven_with_ligament(with_ligament, cx, assume_phase_ states = np.random.rand(nlp.states.shape, nlp.ns) controls = np.random.rand(nlp.controls.shape, nlp.ns) params = np.random.rand(nlp.parameters.shape, nlp.ns) - x_out = np.array(nlp.dynamics_func(states, controls, params)) + stochastic_variables = np.random.rand(nlp.stochastic_variables.shape, nlp.ns) + x_out = np.array(nlp.dynamics_func(states, controls, params, stochastic_variables)) if with_ligament: np.testing.assert_almost_equal( x_out[:, 0], @@ -250,7 +253,8 @@ def test_muscle_driven_with_ligament(with_ligament, cx, assume_phase_dynamics): states = np.random.rand(nlp.states.shape, nlp.ns) controls = np.random.rand(nlp.controls.shape, nlp.ns) params = np.random.rand(nlp.parameters.shape, nlp.ns) - x_out = np.array(nlp.dynamics_func(states, controls, params)) + stochastic_variables = np.random.rand(nlp.stochastic_variables.shape, nlp.ns) + x_out = np.array(nlp.dynamics_func(states, controls, params, stochastic_variables)) if with_ligament: np.testing.assert_almost_equal( diff --git a/tests/test_passive_torque.py b/tests/test_passive_torque.py index 0362d909c..59eb75bf2 100644 --- a/tests/test_passive_torque.py +++ b/tests/test_passive_torque.py @@ -78,7 +78,8 @@ def test_torque_driven_with_passive_torque(with_passive_torque, cx, rigidbody_dy states = np.random.rand(nlp.states.shape, nlp.ns) controls = np.random.rand(nlp.controls.shape, nlp.ns) params = np.random.rand(nlp.parameters.shape, nlp.ns) - x_out = np.array(nlp.dynamics_func(states, controls, params)) + stochastic_variables = np.random.rand(nlp.stochastic_variables.shape, nlp.ns) + x_out = np.array(nlp.dynamics_func(states, controls, params, stochastic_variables)) if rigidbody_dynamics == RigidBodyDynamics.ODE: if with_passive_torque: np.testing.assert_almost_equal( @@ -158,7 +159,8 @@ def test_torque_derivative_driven_with_passive_torque(with_passive_torque, cx, a states = np.random.rand(nlp.states.shape, nlp.ns) controls = np.random.rand(nlp.controls.shape, nlp.ns) params = np.random.rand(nlp.parameters.shape, nlp.ns) - x_out = np.array(nlp.dynamics_func(states, controls, params)) + stochastic_variables = np.random.rand(nlp.stochastic_variables.shape, nlp.ns) + x_out = np.array(nlp.dynamics_func(states, controls, params, stochastic_variables)) if with_passive_torque: np.testing.assert_almost_equal( x_out[:, 0], @@ -250,7 +252,8 @@ def test_torque_activation_driven_with_passive_torque( states = np.random.rand(nlp.states.shape, nlp.ns) controls = np.random.rand(nlp.controls.shape, nlp.ns) params = np.random.rand(nlp.parameters.shape, nlp.ns) - x_out = np.array(nlp.dynamics_func(states, controls, params)) + stochastic_variables = np.random.rand(nlp.stochastic_variables.shape, nlp.ns) + x_out = np.array(nlp.dynamics_func(states, controls, params, stochastic_variables)) if with_residual_torque: if with_passive_torque: np.testing.assert_almost_equal( @@ -365,7 +368,8 @@ def test_muscle_driven_with_passive_torque(with_passive_torque, rigidbody_dynami states = np.random.rand(nlp.states.shape, nlp.ns) controls = np.random.rand(nlp.controls.shape, nlp.ns) params = np.random.rand(nlp.parameters.shape, nlp.ns) - x_out = np.array(nlp.dynamics_func(states, controls, params)) + stochastic_variables = np.random.rand(nlp.stochastic_variables.shape, nlp.ns) + x_out = np.array(nlp.dynamics_func(states, controls, params, stochastic_variables)) if rigidbody_dynamics == RigidBodyDynamics.DAE_INVERSE_DYNAMICS: if with_passive_torque: diff --git a/tests/test_penalty.py b/tests/test_penalty.py index 6c8ce1b8f..44595f0c8 100644 --- a/tests/test_penalty.py +++ b/tests/test_penalty.py @@ -70,15 +70,16 @@ def prepare_test_ocp( return ocp -def get_penalty_value(ocp, penalty, t, x, u, p): - val = penalty.type(penalty, PenaltyController(ocp, ocp.nlp[0], t, x, u, [], [], [], 0), **penalty.params) +def get_penalty_value(ocp, penalty, t, x, u, p, s): + val = penalty.type(penalty, PenaltyController(ocp, ocp.nlp[0], t, x, u, [], [], [], [], 0), **penalty.params) if isinstance(val, float): return val states = ocp.nlp[0].states.cx_start if ocp.nlp[0].states.cx_start.shape != (0, 0) else ocp.cx(0, 0) controls = ocp.nlp[0].controls.cx_start if ocp.nlp[0].controls.cx_start.shape != (0, 0) else ocp.cx(0, 0) parameters = ocp.nlp[0].parameters.cx if ocp.nlp[0].parameters.cx.shape != (0, 0) else ocp.cx(0, 0) - return ocp.nlp[0].to_casadi_func("penalty", val, states, controls, parameters)(x[0], u[0], p) + stochastic_variables = ocp.nlp[0].stochastic_variables.cx_start if ocp.nlp[0].stochastic_variables.cx_start.shape != (0, 0) else ocp.cx(0, 0) + return ocp.nlp[0].to_casadi_func("penalty", val, states, controls, parameters, stochastic_variables)(x[0], u[0], p, s) def test_penalty_targets_shapes(): @@ -103,8 +104,8 @@ def test_penalty_minimize_time(penalty_origin, value, assume_phase_dynamics): penalty_type = penalty_origin.MINIMIZE_TIME penalty = Objective(penalty_type) - penalty_type(penalty, PenaltyController(ocp, ocp.nlp[0], [], [], [], [], [], [], 0)) - res = get_penalty_value(ocp, penalty, t, x, u, []) + penalty_type(penalty, PenaltyController(ocp, ocp.nlp[0], [], [], [], [], [], [], [], 0)) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) np.testing.assert_almost_equal(res, np.array(1)) @@ -118,7 +119,7 @@ def test_penalty_minimize_state(penalty_origin, value, assume_phase_dynamics): x = [DM.ones((8, 1)) * value] u = [0] penalty = Objective(penalty_origin.MINIMIZE_STATE, key="qdot") - res = get_penalty_value(ocp, penalty, t, x, u, []) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) np.testing.assert_almost_equal(res, np.array([[value]] * 4)) @@ -137,7 +138,7 @@ def test_penalty_minimize_qddot(penalty_origin, value, assume_phase_dynamics): else: penalty_type = penalty_origin.MINIMIZE_QDDOT penalty = Objective(penalty_type) - res = get_penalty_value(ocp, penalty, t, x, u, []).T + res = get_penalty_value(ocp, penalty, t, x, u, [], []).T np.testing.assert_almost_equal(res, [[value, -9.81 + value, value, value]]) @@ -155,7 +156,7 @@ def test_penalty_track_state(penalty_origin, value, assume_phase_dynamics): penalty = Objective(penalty_type, key="qdot", target=np.ones((4, 1)) * value) else: penalty = Constraint(penalty_type, key="qdot", target=np.ones((4, 1)) * value) - res = get_penalty_value(ocp, penalty, t, x, u, []) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) np.testing.assert_almost_equal(res, [[value]] * 4) @@ -169,7 +170,7 @@ def test_penalty_minimize_markers(penalty_origin, value, assume_phase_dynamics): u = [0] penalty_type = penalty_origin.MINIMIZE_MARKERS penalty = Objective(penalty_type) - res = get_penalty_value(ocp, penalty, t, x, u, []) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) expected = np.array( [ @@ -204,7 +205,7 @@ def test_penalty_track_markers(penalty_origin, value, assume_phase_dynamics): penalty = Objective(penalty_type, target=np.ones((3, 7, 1)) * value) else: penalty = Constraint(penalty_type, target=np.ones((3, 7, 1)) * value) - res = get_penalty_value(ocp, penalty, t, x, u, []) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) expected = np.array( [ @@ -235,7 +236,7 @@ def test_penalty_minimize_markers_velocity(penalty_origin, value, assume_phase_d u = [0] penalty_type = penalty_origin.MINIMIZE_MARKERS_VELOCITY penalty = Objective(penalty_type) - res = get_penalty_value(ocp, penalty, t, x, u, []) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) if value == 0.1: np.testing.assert_almost_equal( @@ -276,7 +277,7 @@ def test_penalty_track_markers_velocity(penalty_origin, value, assume_phase_dyna penalty = Objective(penalty_type, target=np.ones((3, 7, 1)) * value) else: penalty = Constraint(penalty_type, target=np.ones((3, 7, 1)) * value) - res = get_penalty_value(ocp, penalty, t, x, u, []) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) if value == 0.1: np.testing.assert_almost_equal( @@ -317,7 +318,7 @@ def test_penalty_track_super_impose_marker(penalty_origin, value, assume_phase_d penalty = Objective(penalty_type, first_marker=0, second_marker=1) else: penalty = Constraint(penalty_type, first_marker=0, second_marker=1) - res = get_penalty_value(ocp, penalty, t, x, u, []) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) expected = [[0.8951707, 0, -1.0948376]] if value == 0.1 else [[-1.3830926, 0, 0.2950504]] np.testing.assert_almost_equal(res.T, expected) @@ -337,7 +338,7 @@ def test_penalty_track_super_impose_marker_velocity(penalty_origin, value, assum penalty = Objective(penalty_type, first_marker=0, second_marker=1) else: penalty = Constraint(penalty_type, first_marker=0, second_marker=1) - res = get_penalty_value(ocp, penalty, t, x, u, []) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) expected = [[-0.1094838, 0.0, -0.0895171]] if value == 0.1 else [[-2.9505042, 0.0, -13.8309264]] np.testing.assert_almost_equal(res.T, expected) @@ -374,7 +375,7 @@ def test_penalty_proportional_state(penalty_origin, value, value_intercept, assu first_dof_intercept=value_intercept, second_dof_intercept=value_intercept, ) - res = get_penalty_value(ocp, penalty, t, x, u, []) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) if value_intercept == 0.0: np.testing.assert_almost_equal(res, -value) @@ -403,7 +404,7 @@ def test_penalty_proportional_control(penalty_origin, value, assume_phase_dynami penalty = Objective(penalty_type, key="tau", first_dof=first, second_dof=second, coef=coef) else: penalty = Constraint(penalty_type, key="tau", first_dof=first, second_dof=second, coef=coef) - res = get_penalty_value(ocp, penalty, t, x, u, []) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) np.testing.assert_almost_equal(res, np.array(u[0][first] - coef * u[0][second])) @@ -417,7 +418,7 @@ def test_penalty_minimize_torque(penalty_origin, value, assume_phase_dynamics): x = [0] u = [DM.ones((4, 1)) * value] penalty = Objective(penalty_origin.MINIMIZE_CONTROL, key="tau") - res = get_penalty_value(ocp, penalty, t, x, u, []) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) np.testing.assert_almost_equal(res, np.array([[value, value, value, value]]).T) @@ -436,7 +437,7 @@ def test_penalty_track_torque(penalty_origin, value, assume_phase_dynamics): penalty = Objective(penalty_type, key="tau", target=np.ones((4, 1)) * value) else: penalty = Constraint(penalty_type, key="tau", target=np.ones((4, 1)) * value) - res = get_penalty_value(ocp, penalty, t, x, u, []) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) np.testing.assert_almost_equal(res, np.array([[value, value, value, value]]).T) @@ -451,7 +452,7 @@ def test_penalty_minimize_muscles_control(penalty_origin, value, assume_phase_dy u = [DM.ones((8, 1)) * value] penalty_type = penalty_origin.MINIMIZE_CONTROL penalty = Objective(penalty_type, key="muscles") - res = get_penalty_value(ocp, penalty, t, x, u, []) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) np.testing.assert_almost_equal(res, np.array([[value, value, value, value, value, value]]).T) @@ -466,7 +467,7 @@ def test_penalty_minimize_contact_forces(penalty_origin, value, assume_phase_dyn u = [DM.ones((4, 1)) * value] penalty_type = penalty_origin.MINIMIZE_CONTACT_FORCES penalty = Objective(penalty_type) - res = get_penalty_value(ocp, penalty, t, x, u, []) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) if value == 0.1: np.testing.assert_almost_equal(res, np.array([[-9.6680105, 127.2360329, 5.0905995]]).T) @@ -488,7 +489,7 @@ def test_penalty_track_contact_forces(penalty_origin, value, assume_phase_dynami penalty = Objective(penalty_type, target=np.ones((1, 1)) * value, index=0) else: penalty = Constraint(penalty_type, target=np.ones((1, 1)) * value, index=0) - res = get_penalty_value(ocp, penalty, t, x, u, []) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) if value == 0.1: np.testing.assert_almost_equal(res.T, [[-9.6680105, 127.2360329, 5.0905995]]) @@ -505,7 +506,7 @@ def test_penalty_minimize_predicted_com_height(value, assume_phase_dynamics): u = [0] penalty_type = ObjectiveFcn.Mayer.MINIMIZE_PREDICTED_COM_HEIGHT penalty = Objective(penalty_type) - res = get_penalty_value(ocp, penalty, t, x, u, []) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) expected = np.array(0.0501274 if value == 0.1 else -3.72579) np.testing.assert_almost_equal(res, expected) @@ -528,7 +529,7 @@ def test_penalty_minimize_com_position(value, penalty_origin, assume_phase_dynam penalty = Objective(penalty_type) else: penalty = Constraint(penalty_type) - res = get_penalty_value(ocp, penalty, t, x, u, []) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) expected = np.array([[0.05], [0.05], [0.05]]) if value == -10: @@ -552,7 +553,7 @@ def test_penalty_minimize_angular_momentum(value, penalty_origin, assume_phase_d penalty = Objective(penalty_type) else: penalty = Constraint(penalty_type) - res = get_penalty_value(ocp, penalty, t, x, u, []) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) expected = np.array([[-0.005], [0.2], [0.005]]) if value == -10: @@ -577,7 +578,7 @@ def test_penalty_minimize_linear_momentum(value, penalty_origin, use_sx, assume_ penalty = Objective(penalty_type) else: penalty = Constraint(penalty_type) - res = get_penalty_value(ocp, penalty, t, x, u, []) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) expected = np.array([[0.1], [0], [0.1]]) if value == -10: @@ -604,7 +605,7 @@ def test_penalty_minimize_comddot(value, penalty_origin, implicit, assume_phase_ penalty = Constraint(penalty_type) if not implicit: - res = get_penalty_value(ocp, penalty, t, x, u, []) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) expected = np.array([[0.0], [-0.7168803], [-0.0740871]]) if value == -10: @@ -612,7 +613,7 @@ def test_penalty_minimize_comddot(value, penalty_origin, implicit, assume_phase_ np.testing.assert_almost_equal(res, expected) else: - res = get_penalty_value(ocp, penalty, t, x, u, []) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) expected = np.array([[0], [-0.0008324], [0.002668]]) if value == -10: @@ -635,7 +636,7 @@ def test_penalty_track_segment_with_custom_rt(penalty_origin, value, assume_phas penalty = Objective(penalty_type, segment="ground", rt=0) else: penalty = Constraint(penalty_type, segment="ground", rt=0) - res = get_penalty_value(ocp, penalty, t, x, u, []) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) expected = np.array([[0], [0.1], [0]]) if value == -10: @@ -658,7 +659,7 @@ def test_penalty_track_marker_with_segment_axis(penalty_origin, value, assume_ph penalty = Objective(penalty_type, marker="m0", segment="ground", axis=Axis.X) else: penalty = Constraint(penalty_type, marker="m0", segment="ground", axis=Axis.X) - res = get_penalty_value(ocp, penalty, t, x, u, []) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) expected = [[value, 0, value]] np.testing.assert_almost_equal(res.T, expected) @@ -679,7 +680,7 @@ def test_penalty_minimize_segment_rotation(penalty_origin, value, assume_phase_d else: penalty_type = penalty_origin.TRACK_SEGMENT_ROTATION penalty = Constraint(penalty_type, segment=2) - res = get_penalty_value(ocp, penalty, t, x, u, []) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) expected = [[0, value, 0]] if value == 0.1 else [[3.1415927, 0.575222, 3.1415927]] np.testing.assert_almost_equal(res.T, expected) @@ -700,7 +701,7 @@ def test_penalty_minimize_segment_velocity(penalty_origin, value, assume_phase_d else: penalty_type = penalty_origin.TRACK_SEGMENT_VELOCITY penalty = Constraint(penalty_type, segment=2) - res = get_penalty_value(ocp, penalty, t, x, u, []) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) expected = [[0, value, 0]] np.testing.assert_almost_equal(res.T, expected) @@ -733,7 +734,7 @@ def test_penalty_minimize_vector_orientation(penalty_origin, value, assume_phase vector_1_marker_1="m6", ) - res = get_penalty_value(ocp, penalty, t, x, u, []) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) if value == 0.1: np.testing.assert_almost_equal(float(res), 0.09999999999999999) @@ -752,7 +753,7 @@ def test_penalty_contact_force_inequality(penalty_origin, value, assume_phase_dy penalty_type = penalty_origin.TRACK_CONTACT_FORCES penalty = Constraint(penalty_type, contact_index=0) - res = get_penalty_value(ocp, penalty, t, x, u, []) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) expected = [[-9.6680105, 127.2360329, 5.0905995]] if value == 0.1 else [[25.6627161, 462.7973306, -94.0182191]] np.testing.assert_almost_equal(res.T, expected) @@ -769,7 +770,7 @@ def test_penalty_non_slipping(value, assume_phase_dynamics): penalty = Constraint( penalty_type, tangential_component_idx=0, normal_component_idx=1, static_friction_coefficient=2 ) - res = get_penalty_value(ocp, penalty, t, x, u, []) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) expected = [[64662.56185612, 64849.5027121]] if value == 0.1 else [[856066.90177734, 857384.05177395]] np.testing.assert_almost_equal(res.T, expected) @@ -787,10 +788,10 @@ def test_tau_max_from_actuators(value, threshold, assume_phase_dynamics): penalty = Constraint(penalty_type, min_torque=threshold) if threshold and threshold < 0: with pytest.raises(ValueError, match="min_torque cannot be negative in tau_max_from_actuators"): - get_penalty_value(ocp, penalty, t, x, u, []) + get_penalty_value(ocp, penalty, t, x, u, [], []) return else: - res = get_penalty_value(ocp, penalty, t, x, u, []) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) if threshold: np.testing.assert_almost_equal(res, np.repeat([value + threshold, value - threshold], 3)[:, np.newaxis]) @@ -807,7 +808,7 @@ def test_penalty_time_constraint(value, assume_phase_dynamics): u = [0] penalty_type = ConstraintFcn.TIME_CONSTRAINT penalty = Constraint(penalty_type) - res = get_penalty_value(ocp, penalty, t, x, u, []) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) np.testing.assert_almost_equal(res, np.array([])) @@ -831,7 +832,7 @@ def custom(controller: PenaltyController, mult): penalty = Objective(custom, index=0, mult=mult, custom_type=penalty_origin) else: penalty = Constraint(custom, index=0, mult=mult) - res = get_penalty_value(ocp, penalty, t, x, u, []) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) np.testing.assert_almost_equal(res, [[value * mult]] * 4) @@ -903,7 +904,7 @@ def custom_with_bounds(controller: PenaltyController): u = [0] penalty = Constraint(custom_with_bounds) - res = get_penalty_value(ocp, penalty, t, x, u, []) + res = get_penalty_value(ocp, penalty, t, x, u, [], []) np.testing.assert_almost_equal(res, [[value]] * 4) np.testing.assert_almost_equal(penalty.min_bound, -10) From 253946e18f1016128c168afa419ddb4a08b763cf Mon Sep 17 00:00:00 2001 From: Charbie Date: Wed, 12 Jul 2023 18:21:49 +0200 Subject: [PATCH 32/54] blacked --- bioptim/dynamics/configure_problem.py | 21 +- bioptim/dynamics/dynamics_functions.py | 4 +- bioptim/dynamics/integrator.py | 78 +- .../arm_reaching_muscle_driven.py | 680 ++++++++++++------ .../arm_reaching_torque_driven.py | 496 +++++++++---- .../examples/torque_driven_ocp/spring_load.py | 4 +- bioptim/gui/check_conditioning.py | 14 +- bioptim/gui/plot.py | 6 +- bioptim/interfaces/biomodel.py | 1 + bioptim/limits/constraints.py | 5 +- bioptim/limits/multinode_penalty.py | 66 +- bioptim/limits/penalty.py | 30 +- bioptim/limits/penalty_option.py | 39 +- .../optimization/optimal_control_program.py | 349 ++++----- bioptim/optimization/optimization_variable.py | 13 +- bioptim/optimization/optimization_vector.py | 10 +- bioptim/optimization/problem_type.py | 4 +- bioptim/optimization/solution.py | 67 +- .../stochastic_optimal_control_program.py | 287 ++++---- tests/test__global_plots.py | 4 +- tests/test_dynamics.py | 4 +- tests/test_global_stochastic.py | 41 +- tests/test_penalty.py | 10 +- 23 files changed, 1442 insertions(+), 791 deletions(-) diff --git a/bioptim/dynamics/configure_problem.py b/bioptim/dynamics/configure_problem.py index 0ad3c724f..50d58721e 100644 --- a/bioptim/dynamics/configure_problem.py +++ b/bioptim/dynamics/configure_problem.py @@ -1153,7 +1153,9 @@ def define_cx_unscaled(_cx_scaled: list, scaling: np.ndarray) -> list: if n_cx < 3: n_cx = 3 cx_scaled = define_cx_scaled(n_col=n_cx, n_shooting=1, initial_node=node_index) - nlp.stochastic_variables.append(name, cx_scaled[0], cx_scaled[0], mx_stochastic, nlp.variable_mappings[name], node_index) + nlp.stochastic_variables.append( + name, cx_scaled[0], cx_scaled[0], mx_stochastic, nlp.variable_mappings[name], node_index + ) @staticmethod def configure_integrated_value( @@ -1190,11 +1192,15 @@ def configure_integrated_value( dummy_mapping = Mapping(list(range(len(name_elements)))) initial_vector = nlp.integrated_values.reshape_to_vector(initial_matrix) cx_scaled_next_formatted = [initial_vector for _ in range(n_cx)] - nlp.integrated_values.append(name, cx_scaled_next_formatted, cx_scaled_next_formatted, initial_matrix, dummy_mapping, 0) + nlp.integrated_values.append( + name, cx_scaled_next_formatted, cx_scaled_next_formatted, initial_matrix, dummy_mapping, 0 + ) for node_index in range(1, nlp.ns + 1): # cannot use assume_phase_dynamics = True cx_scaled_next = nlp.integrated_value_functions[name](nlp, node_index) cx_scaled_next_formatted = [cx_scaled_next for _ in range(n_cx)] - nlp.integrated_values.append(name, cx_scaled_next_formatted, cx_scaled_next_formatted, cx_scaled_next, dummy_mapping, node_index) + nlp.integrated_values.append( + name, cx_scaled_next_formatted, cx_scaled_next_formatted, cx_scaled_next, dummy_mapping, node_index + ) @staticmethod def configure_q(ocp, nlp, as_states: bool, as_controls: bool, as_states_dot: bool = False): @@ -1287,7 +1293,6 @@ def configure_qdddot(ocp, nlp, as_states: bool, as_controls: bool): axes_idx = ConfigureProblem._apply_phase_mapping(ocp, nlp, name) ConfigureProblem.configure_new_variable(name, name_qdddot, ocp, nlp, as_states, as_controls, axes_idx=axes_idx) - @staticmethod def configure_stochastic_k(ocp, nlp, n_noised_controls: int, n_feedbacks: int): """ @@ -1308,7 +1313,9 @@ def configure_stochastic_k(ocp, nlp, n_noised_controls: int, n_feedbacks: int): for name_1 in control_names: for name_2 in feedback_names: name_k += [name_1 + "_&_" + name_2] - nlp.variable_mappings[name] = BiMapping(list(range(len(control_names)*len(feedback_names))), list(range(len(control_names)*len(feedback_names)))) + nlp.variable_mappings[name] = BiMapping( + list(range(len(control_names) * len(feedback_names))), list(range(len(control_names) * len(feedback_names))) + ) ConfigureProblem.configure_new_variable( name, name_k, @@ -1339,7 +1346,7 @@ def configure_stochastic_c(ocp, nlp, n_noised_states: int): for name_1 in [f"X_{i}" for i in range(n_noised_states)]: for name_2 in [f"X_{i}" for i in range(n_noised_states)]: name_c += [name_1 + "_&_" + name_2] - nlp.variable_mappings[name] = BiMapping(list(range(n_noised_states ** 2)), list(range(n_noised_states ** 2))) + nlp.variable_mappings[name] = BiMapping(list(range(n_noised_states**2)), list(range(n_noised_states**2))) ConfigureProblem.configure_new_variable( name, @@ -1371,7 +1378,7 @@ def configure_stochastic_a(ocp, nlp, n_noised_states: int): for name_1 in [f"X_{i}" for i in range(n_noised_states)]: for name_2 in [f"X_{i}" for i in range(n_noised_states)]: name_a += [name_1 + "_&_" + name_2] - nlp.variable_mappings[name] = BiMapping(list(range(n_noised_states ** 2)), list(range(n_noised_states ** 2))) + nlp.variable_mappings[name] = BiMapping(list(range(n_noised_states**2)), list(range(n_noised_states**2))) ConfigureProblem.configure_new_variable( name, diff --git a/bioptim/dynamics/dynamics_functions.py b/bioptim/dynamics/dynamics_functions.py index 4c1675c6e..1e63d6967 100644 --- a/bioptim/dynamics/dynamics_functions.py +++ b/bioptim/dynamics/dynamics_functions.py @@ -42,7 +42,9 @@ class DynamicsFunctions: """ @staticmethod - def custom(states: MX.sym, controls: MX.sym, parameters: MX.sym, stochastic_variables: MX.sym, nlp) -> DynamicsEvaluation: + def custom( + states: MX.sym, controls: MX.sym, parameters: MX.sym, stochastic_variables: MX.sym, nlp + ) -> DynamicsEvaluation: """ Interface to custom dynamic function provided by the user. diff --git a/bioptim/dynamics/integrator.py b/bioptim/dynamics/integrator.py index a631487f9..2a3a15e16 100644 --- a/bioptim/dynamics/integrator.py +++ b/bioptim/dynamics/integrator.py @@ -127,7 +127,15 @@ def get_u(self, u: np.ndarray, dt_norm: float) -> np.ndarray: else: raise RuntimeError(f"{self.control_type} ControlType not implemented yet") - def dxdt(self, h: float, states: MX | SX, controls: MX | SX, params: MX | SX, param_scaling, stochastic_variables: MX | SX) -> tuple: + def dxdt( + self, + h: float, + states: MX | SX, + controls: MX | SX, + params: MX | SX, + param_scaling, + stochastic_variables: MX | SX, + ) -> tuple: """ The dynamics of the system @@ -161,7 +169,9 @@ def _finish_init(self): self.function = Function( "integrator", [self.x_sym, self.u_sym, self.param_sym, self.stochastic_variables_sym], - self.dxdt(self.h, self.x_sym, self.u_sym, self.param_sym, self.param_scaling, self.stochastic_variables_sym), + self.dxdt( + self.h, self.x_sym, self.u_sym, self.param_sym, self.param_scaling, self.stochastic_variables_sym + ), ["x0", "p", "params", "s"], ["xf", "xall"], ) @@ -229,7 +239,15 @@ def next_x(self, h: float, t: float, x_prev: MX | SX, u: MX | SX, p: MX | SX, s: raise RuntimeError("RK is abstract, please select a specific RK") - def dxdt(self, h: float, states: MX | SX, controls: MX | SX, params: MX | SX, param_scaling, stochastic_variables: MX | SX) -> tuple: + def dxdt( + self, + h: float, + states: MX | SX, + controls: MX | SX, + params: MX | SX, + param_scaling, + stochastic_variables: MX | SX, + ) -> tuple: """ The dynamics of the system @@ -481,23 +499,27 @@ def next_x(self, h: float, t: float, x_prev: MX | SX, u: MX | SX, p: MX | SX, s: k7 = self.fun( x_prev + (h / 4320) * (389 * k1 - 54 * k3 + 966 * k4 - 824 * k5 + 243 * k6), self.get_u(u, t + self.h_norm * (1 / 6)), - p, s, + p, + s, )[:, self.idx] k8 = self.fun( x_prev + (h / 20) * (-234 * k1 + 81 * k3 - 1164 * k4 + 656 * k5 - 122 * k6 + 800 * k7), self.get_u(u, t + self.h_norm), - p, s, + p, + s, )[:, self.idx] k9 = self.fun( x_prev + (h / 288) * (-127 * k1 + 18 * k3 - 678 * k4 + 456 * k5 - 9 * k6 + 576 * k7 + 4 * k8), self.get_u(u, t + self.h_norm * (5 / 6)), - p, s, + p, + s, )[:, self.idx] k10 = self.fun( x_prev + (h / 820) * (1481 * k1 - 81 * k3 + 7104 * k4 - 3376 * k5 + 72 * k6 - 5040 * k7 - 60 * k8 + 720 * k9), self.get_u(u, t + self.h_norm), - p, s, + p, + s, )[:, self.idx] return x_prev + h / 840 * (41 * k1 + 27 * k4 + 272 * k5 + 27 * k6 + 216 * k7 + 216 * k9 + 41 * k10) @@ -597,7 +619,15 @@ def get_u(self, u: np.ndarray, dt_norm: float) -> np.ndarray: else: raise NotImplementedError(f"{self.control_type} ControlType not implemented yet with COLLOCATION") - def dxdt(self, h: float, states: MX | SX, controls: MX | SX, params: MX | SX, param_scaling, stochastic_variables: MX | SX) -> tuple: + def dxdt( + self, + h: float, + states: MX | SX, + controls: MX | SX, + params: MX | SX, + param_scaling, + stochastic_variables: MX | SX, + ) -> tuple: """ The dynamics of the system @@ -631,12 +661,18 @@ def dxdt(self, h: float, states: MX | SX, controls: MX | SX, params: MX | SX, pa xp_j += self._c[r, j] * states[r] if self.defects_type == DefectType.EXPLICIT: - f_j = self.fun(states[j], self.get_u(controls, self.step_time[j]), params * param_scaling, stochastic_variables)[:, self.idx] + f_j = self.fun( + states[j], self.get_u(controls, self.step_time[j]), params * param_scaling, stochastic_variables + )[:, self.idx] defects.append(h * f_j - xp_j) elif self.defects_type == DefectType.IMPLICIT: defects.append( self.implicit_fun( - states[j], self.get_u(controls, self.step_time[j]), params * param_scaling, stochastic_variables, xp_j / h, + states[j], + self.get_u(controls, self.step_time[j]), + params * param_scaling, + stochastic_variables, + xp_j / h, ) ) else: @@ -657,7 +693,9 @@ def _finish_init(self): self.function = Function( "integrator", [horzcat(*self.x_sym), self.u_sym, self.param_sym, self.stochastic_variables_sym], - self.dxdt(self.h, self.x_sym, self.u_sym, self.param_sym, self.param_scaling, self.stochastic_variables_sym), + self.dxdt( + self.h, self.x_sym, self.u_sym, self.param_sym, self.param_scaling, self.stochastic_variables_sym + ), ["x0", "p", "params", "s"], ["xf", "xall", "defects"], ) @@ -687,7 +725,15 @@ def __init__(self, ode: dict, ode_opt: dict): super(IRK, self).__init__(ode, ode_opt) - def dxdt(self, h: float, states: MX | SX, controls: MX | SX, params: MX | SX, param_scaling, stochastic_variables: MX | SX) -> tuple: + def dxdt( + self, + h: float, + states: MX | SX, + controls: MX | SX, + params: MX | SX, + param_scaling, + stochastic_variables: MX | SX, + ) -> tuple: """ The dynamics of the system @@ -715,7 +761,9 @@ def dxdt(self, h: float, states: MX | SX, controls: MX | SX, params: MX | SX, pa _, _, defect = super(IRK, self).dxdt(h, states, controls, params, param_scaling, stochastic_variables) # Root-finding function, implicitly defines x_collocation_points as a function of x0 and p - vfcn = Function("vfcn", [vertcat(*states[1:]), states[0], controls, params, stochastic_variables], [defect]).expand() + vfcn = Function( + "vfcn", [vertcat(*states[1:]), states[0], controls, params, stochastic_variables], [defect] + ).expand() # Create a implicit function instance to solve the system of equations ifcn = rootfinder("ifcn", "newton", vfcn) @@ -737,7 +785,9 @@ def _finish_init(self): self.function = Function( "integrator", [self.x_sym[0], self.u_sym, self.param_sym, self.stochastic_variables_sym], - self.dxdt(self.h, self.x_sym, self.u_sym, self.param_sym, self.param_scaling, self.stochastic_variables_sym), + self.dxdt( + self.h, self.x_sym, self.u_sym, self.param_sym, self.param_scaling, self.stochastic_variables_sym + ), ["x0", "p", "params", "s"], ["xf", "xall"], ) diff --git a/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py b/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py index 84bc4ed1d..b3b32c704 100644 --- a/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py +++ b/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py @@ -49,23 +49,40 @@ class LeuvenArmModel: """ def __init__(self): - self.dM_coefficients = np.array([[0, 0, 0.0100, 0.0300, -0.0110, 1.9000], - [0, 0, 0.0100, -0.0190, 0, 0.0100], - [0.0400, -0.0080, 1.9000, 0, 0, 0.0100], - [-0.0420, 0, 0.0100, 0, 0, 0.0100], - [0.0300, -0.0110, 1.9000, 0.0320, -0.0100, 1.9000], - [-0.0390, 0, 0.0100, -0.0220, 0, 0.0100]]) - self.LMT_coefficients = np.array([[1.1000, -5.206336195535022], - [0.8000, -7.538918356984516], - [1.2000, -3.938098437958920], - [0.7000, -3.031522725559912], - [1.1000, -2.522778221157014], - [0.8500, -1.826368199415192]]) + self.dM_coefficients = np.array( + [ + [0, 0, 0.0100, 0.0300, -0.0110, 1.9000], + [0, 0, 0.0100, -0.0190, 0, 0.0100], + [0.0400, -0.0080, 1.9000, 0, 0, 0.0100], + [-0.0420, 0, 0.0100, 0, 0, 0.0100], + [0.0300, -0.0110, 1.9000, 0.0320, -0.0100, 1.9000], + [-0.0390, 0, 0.0100, -0.0220, 0, 0.0100], + ] + ) + self.LMT_coefficients = np.array( + [ + [1.1000, -5.206336195535022], + [0.8000, -7.538918356984516], + [1.2000, -3.938098437958920], + [0.7000, -3.031522725559912], + [1.1000, -2.522778221157014], + [0.8500, -1.826368199415192], + ] + ) self.vMtilde_max = np.ones((6, 1)) * 10 self.Fiso = np.array([572.4000, 445.2000, 699.6000, 381.6000, 159.0000, 318.0000]) self.Faparam = np.array( - [0.814483478343008, 1.055033428970575, 0.162384573599574, 0.063303448465465, 0.433004984392647, - 0.716775413397760, -0.029947116970696, 0.200356847296188]) + [ + 0.814483478343008, + 1.055033428970575, + 0.162384573599574, + 0.063303448465465, + 0.433004984392647, + 0.716775413397760, + -0.029947116970696, + 0.200356847296188, + ] + ) self.Fvparam = np.array([-0.318323436899127, -8.149156043475250, -0.374121508647863, 0.885644059915004]) self.Fpparam = np.array([-0.995172050006169, 53.598150033144236]) self.muscleDampingCoefficient = np.ones((6, 1)) * 0.01 @@ -112,15 +129,17 @@ def __init__(self): self.friction = np.array([[0.05, 0.025], [0.025, 0.05]]) def serialize(self) -> tuple[Callable, dict]: - return LeuvenArmModel, dict(dM_coefficients=self.dM_coefficients, - LMT_coefficients=self.LMT_coefficients, - vMtilde_max=self.vMtilde_max, - Fiso=self.Fiso, - Faparam=self.Faparam, - Fvparam=self.Fvparam, - Fpparam=self.Fpparam, - muscleDampingCoefficient=self.muscleDampingCoefficient, - friction=self.friction) + return LeuvenArmModel, dict( + dM_coefficients=self.dM_coefficients, + LMT_coefficients=self.LMT_coefficients, + vMtilde_max=self.vMtilde_max, + Fiso=self.Fiso, + Faparam=self.Faparam, + Fvparam=self.Fvparam, + Fpparam=self.Fpparam, + muscleDampingCoefficient=self.muscleDampingCoefficient, + friction=self.friction, + ) @property def nb_muscles(self): @@ -133,13 +152,14 @@ def nb_q(self): @property def nb_qdot(self): return 2 + @property def name_dof(self): - return ['shoulder', 'elbow'] + return ["shoulder", "elbow"] @property def muscle_names(self): - return [f'muscle_{i}' for i in range(self.nb_muscles)] + return [f"muscle_{i}" for i in range(self.nb_muscles)] def get_muscle_force(self, q, qdot): """ @@ -159,37 +179,48 @@ def get_muscle_force(self, q, qdot): dtheta_elbow = qdot[1] # Normalized muscle fiber length (without tendon) - l_full = self.a_shoulder * theta_shoulder + self.b_shoulder * cas.sin( - self.c_shoulder * theta_shoulder) / self.c_shoulder + self.a_elbow * theta_elbow + self.b_elbow * cas.sin( - self.c_elbow * theta_elbow) / self.c_elbow + l_full = ( + self.a_shoulder * theta_shoulder + + self.b_shoulder * cas.sin(self.c_shoulder * theta_shoulder) / self.c_shoulder + + self.a_elbow * theta_elbow + + self.b_elbow * cas.sin(self.c_elbow * theta_elbow) / self.c_elbow + ) lMtilde = l_full * self.l_multiplier + self.l_base # Fiber velocity normalized by the optimal fiber length nCoeff = self.a_shoulder.shape[0] - v_full = self.a_shoulder * dtheta_shoulder + self.b_shoulder * cas.cos(self.c_shoulder * theta_shoulder) * cas.repmat( - dtheta_shoulder, nCoeff, 1) + self.a_elbow * dtheta_elbow + self.b_elbow * cas.cos(self.c_elbow * theta_elbow) * cas.repmat( - dtheta_elbow, nCoeff, 1) + v_full = ( + self.a_shoulder * dtheta_shoulder + + self.b_shoulder * cas.cos(self.c_shoulder * theta_shoulder) * cas.repmat(dtheta_shoulder, nCoeff, 1) + + self.a_elbow * dtheta_elbow + + self.b_elbow * cas.cos(self.c_elbow * theta_elbow) * cas.repmat(dtheta_elbow, nCoeff, 1) + ) vMtilde = self.l_multiplier * v_full vMtilde_normalizedToMaxVelocity = vMtilde / self.vMtilde_max num3 = lMtilde - self.b23 den3 = self.b33 + self.b43 * lMtilde - FMtilde3 = self.b13 * cas.exp(-0.5 * num3 ** 2 / den3 ** 2) + FMtilde3 = self.b13 * cas.exp(-0.5 * num3**2 / den3**2) num1 = lMtilde - self.b21 den1 = self.b31 + self.b41 * lMtilde - FMtilde1 = self.b11 * cas.exp(-0.5 * num1 ** 2 / den1 ** 2) + FMtilde1 = self.b11 * cas.exp(-0.5 * num1**2 / den1**2) num2 = lMtilde - self.b22 den2 = self.b32 + self.b42 * lMtilde - FMtilde2 = self.b12 * cas.exp(-0.5 * num2 ** 2 / den2 ** 2) + FMtilde2 = self.b12 * cas.exp(-0.5 * num2**2 / den2**2) FMltilde = FMtilde1 + FMtilde2 + FMtilde3 - FMvtilde = self.e1 * cas.log( - (self.e2 @ vMtilde_normalizedToMaxVelocity + self.e3) + cas.sqrt( - (self.e2 @ vMtilde_normalizedToMaxVelocity + self.e3) ** 2 + 1)) + self.e4 + FMvtilde = ( + self.e1 + * cas.log( + (self.e2 @ vMtilde_normalizedToMaxVelocity + self.e3) + + cas.sqrt((self.e2 @ vMtilde_normalizedToMaxVelocity + self.e3) ** 2 + 1) + ) + + self.e4 + ) # Active muscle force Fce = FMltilde * FMvtilde @@ -204,12 +235,13 @@ def get_muscle_force(self, q, qdot): return Fa, Fp - def torque_force_relationship(self, Fm, q): theta_shoulder = q[0] theta_elbow = q[1] - dM_matrix = cas.horzcat(self.a_shoulder + self.b_shoulder * cas.cos(self.c_shoulder @ theta_shoulder), - self.a_elbow + self.b_elbow * cas.cos(self.c_elbow @ theta_elbow)).T + dM_matrix = cas.horzcat( + self.a_shoulder + self.b_shoulder * cas.cos(self.c_shoulder @ theta_shoulder), + self.a_elbow + self.b_elbow * cas.cos(self.c_elbow @ theta_elbow), + ).T tau = dM_matrix @ Fm return tau @@ -233,8 +265,10 @@ def get_excitation_with_feedback(self, K, EE, EE_ref, wS): def end_effector_position(self, q): theta_shoulder = q[0] theta_elbow = q[1] - ee_pos = cas.vertcat(cas.cos(theta_shoulder) * self.l1 + cas.cos(theta_shoulder + theta_elbow) * self.l2, - cas.sin(theta_shoulder) * self.l1 + cas.sin(theta_shoulder + theta_elbow) * self.l2) + ee_pos = cas.vertcat( + cas.cos(theta_shoulder) * self.l1 + cas.cos(theta_shoulder + theta_elbow) * self.l2, + cas.sin(theta_shoulder) * self.l1 + cas.sin(theta_shoulder + theta_elbow) * self.l2, + ) return ee_pos def end_effector_velocity(self, q, qdot): @@ -244,8 +278,10 @@ def end_effector_velocity(self, q, qdot): dtheta_shoulder = qdot[0] dtheta_elbow = qdot[1] da = dtheta_shoulder + dtheta_elbow - ee_vel = cas.vertcat(dtheta_shoulder * cas.sin(theta_shoulder) * self.l1 + da * cas.sin(a) * self.l2, - -dtheta_shoulder * cas.cos(theta_shoulder) * self.l1 - da * cas.cos(a) * self.l2) + ee_vel = cas.vertcat( + dtheta_shoulder * cas.sin(theta_shoulder) * self.l1 + da * cas.sin(a) * self.l2, + -dtheta_shoulder * cas.cos(theta_shoulder) * self.l1 - da * cas.cos(a) * self.l2, + ) return ee_vel @@ -260,7 +296,6 @@ def stochastic_forward_dynamics( force_field_magnitude, with_gains, ) -> DynamicsEvaluation: - q = DynamicsFunctions.get(nlp.states["q"], states) qdot = DynamicsFunctions.get(nlp.states["qdot"], states) mus_activations = DynamicsFunctions.get(nlp.states["muscles"], states) @@ -273,7 +308,7 @@ def stochastic_forward_dynamics( K_matrix = cas.MX(4, 6) for s0 in range(4): for s1 in range(6): - K_matrix[s0, s1] = k[s0*6 + s1] + K_matrix[s0, s1] = k[s0 * 6 + s1] K_matrix = K_matrix.T hand_pos = nlp.model.end_effector_position(q) @@ -290,7 +325,7 @@ def stochastic_forward_dynamics( dq_computed = qdot ### Do not use "DynamicsFunctions.compute_qdot(nlp, q, qdot)" it introduces errors!! dactivations_computed = (mus_excitations_fb - mus_activations) / nlp.model.tau_coef - a1 = nlp.model.I1 + nlp.model.I2 + nlp.model.m2 * nlp.model.l1 ** 2 + a1 = nlp.model.I1 + nlp.model.I2 + nlp.model.m2 * nlp.model.l1**2 a2 = nlp.model.m2 * nlp.model.l1 * nlp.model.lc2 a3 = nlp.model.I2 @@ -306,18 +341,20 @@ def stochastic_forward_dynamics( nleffects = cas.MX(2, 1) nleffects[0] = a2 * cas.sin(theta_elbow) * (-dtheta_elbow * (2 * dtheta_shoulder + dtheta_elbow)) - nleffects[1] = a2 * cas.sin(theta_elbow) * dtheta_shoulder ** 2 + nleffects[1] = a2 * cas.sin(theta_elbow) * dtheta_shoulder**2 dqdot_computed = cas.inv(mass_matrix) @ (torques_computed - nleffects - nlp.model.friction @ qdot) return DynamicsEvaluation(dxdt=cas.vertcat(dq_computed, dqdot_computed, dactivations_computed), defects=None) -def configure_stochastic_optimal_control_problem(ocp: OptimalControlProgram, nlp: NonLinearProgram, wM, wS): +def configure_stochastic_optimal_control_problem(ocp: OptimalControlProgram, nlp: NonLinearProgram, wM, wS): ConfigureProblem.configure_q(ocp, nlp, True, False, False) ConfigureProblem.configure_qdot(ocp, nlp, True, False, True) ConfigureProblem.configure_qddot(ocp, nlp, False, False, True) - ConfigureProblem.configure_muscles(ocp, nlp, True, True) # Muscles activations as states + muscles excitations as controls + ConfigureProblem.configure_muscles( + ocp, nlp, True, True + ) # Muscles activations as states + muscles excitations as controls # Stochastic variables ConfigureProblem.configure_stochastic_k(ocp, nlp, n_noised_controls=6, n_feedbacks=4) @@ -325,17 +362,17 @@ def configure_stochastic_optimal_control_problem(ocp: OptimalControlProgram, nlp ConfigureProblem.configure_stochastic_m(ocp, nlp, n_noised_states=10) mat_p_init = cas.DM_eye(10) * np.array([1e-4, 1e-4, 1e-7, 1e-7, 1e-6, 1e-6, 1e-6, 1e-6, 1e-6, 1e-6]) # P ConfigureProblem.configure_stochastic_cov(ocp, nlp, n_noised_states=10, initial_matrix=mat_p_init) - ConfigureProblem.configure_dynamics_function(ocp, nlp, - dyn_func=lambda states, controls, parameters, - stochastic_variables, nlp, wM, wS: nlp.dynamics_type.dynamic_function(states, - controls, - parameters, - stochastic_variables, - nlp, - wM, - wS, - with_gains=False), - wM=wM, wS=wS, expand=False) + ConfigureProblem.configure_dynamics_function( + ocp, + nlp, + dyn_func=lambda states, controls, parameters, stochastic_variables, nlp, wM, wS: nlp.dynamics_type.dynamic_function( + states, controls, parameters, stochastic_variables, nlp, wM, wS, with_gains=False + ), + wM=wM, + wS=wS, + expand=False, + ) + def minimize_uncertainty(controllers: list[PenaltyController], key: str) -> cas.MX: """ @@ -344,18 +381,21 @@ def minimize_uncertainty(controllers: list[PenaltyController], key: str) -> cas. dt = controllers[0].tf / controllers[0].ns out = 0 for i, ctrl in enumerate(controllers): - P_matrix = ctrl.integrated_values["cov"].reshape_to_matrix(ctrl.integrated_values, ctrl.states.cx.shape[0], - ctrl.states.cx.shape[0], Node.START, "cov") + P_matrix = ctrl.integrated_values["cov"].reshape_to_matrix( + ctrl.integrated_values, ctrl.states.cx.shape[0], ctrl.states.cx.shape[0], Node.START, "cov" + ) P_partial = P_matrix[ctrl.states[key].index, ctrl.states[key].index] out += cas.trace(P_partial) * dt return out + def get_ee(controller: PenaltyController, q, qdot) -> cas.MX: hand_pos = controller.model.end_effector_position(q) hand_vel = controller.model.end_effector_velocity(q, qdot) ee = cas.vertcat(hand_pos, hand_vel) return ee + def ee_equals_ee_ref(controller: PenaltyController) -> cas.MX: q = controller.states["q"].cx_start qdot = controller.states["qdot"].cx_start @@ -365,7 +405,6 @@ def ee_equals_ee_ref(controller: PenaltyController) -> cas.MX: def get_p_mat(nlp, node_index, force_field_magnitude, wM_magnitude, wS_magnitude): - dt = nlp.tf / nlp.ns nlp.states.node_index = node_index - 1 @@ -376,36 +415,57 @@ def get_p_mat(nlp, node_index, force_field_magnitude, wM_magnitude, wS_magnitude nx = nlp.states.cx_start.shape[0] M_matrix = nlp.stochastic_variables["m"].reshape_to_matrix(nlp.stochastic_variables, nx, nx, Node.START, "m") - wM = cas.MX.sym("wM", nlp.states['q'].cx_start.shape[0]) - wS = cas.MX.sym("wS", nlp.states['q'].cx_start.shape[0]*2) + wM = cas.MX.sym("wM", nlp.states["q"].cx_start.shape[0]) + wS = cas.MX.sym("wS", nlp.states["q"].cx_start.shape[0] * 2) sigma_w = cas.vertcat(wS, wM) * cas.MX_eye(6) cov_sym = cas.MX.sym("cov", nlp.integrated_values.cx_start.shape[0]) cov_sym_dict = {"cov": cov_sym} cov_sym_dict["cov"].cx_start = cov_sym cov_matrix = nlp.integrated_values.reshape_to_matrix(cov_sym_dict, nx, nx, Node.START, "cov") - dx = stochastic_forward_dynamics(nlp.states.cx_start, nlp.controls.cx_start, - nlp.parameters, nlp.stochastic_variables.cx_start, - nlp, wM, wS, force_field_magnitude=force_field_magnitude, with_gains=True) + dx = stochastic_forward_dynamics( + nlp.states.cx_start, + nlp.controls.cx_start, + nlp.parameters, + nlp.stochastic_variables.cx_start, + nlp, + wM, + wS, + force_field_magnitude=force_field_magnitude, + with_gains=True, + ) ddx_dwM = cas.jacobian(dx.dxdt, cas.vertcat(wS, wM)) - dg_dw = - ddx_dwM * dt + dg_dw = -ddx_dwM * dt ddx_dx = cas.jacobian(dx.dxdt, nlp.states.cx_start) - dg_dx = - (ddx_dx * dt / 2 + cas.MX_eye(ddx_dx.shape[0])) + dg_dx = -(ddx_dx * dt / 2 + cas.MX_eye(ddx_dx.shape[0])) p_next = M_matrix @ (dg_dx @ cov_matrix @ dg_dx.T + dg_dw @ sigma_w @ dg_dw.T) @ M_matrix.T - func_eval = cas.Function("p_next", [nlp.states.cx_start, nlp.controls.cx_start, - nlp.parameters, nlp.stochastic_variables.cx_start, cov_sym, - wM, wS], [p_next])(nlp.states.cx_start, - nlp.controls.cx_start, - nlp.parameters, - nlp.stochastic_variables.cx_start, - nlp.integrated_values["cov"].cx_start, # Should be the right shape to work - wM_magnitude, - wS_magnitude) + func_eval = cas.Function( + "p_next", + [ + nlp.states.cx_start, + nlp.controls.cx_start, + nlp.parameters, + nlp.stochastic_variables.cx_start, + cov_sym, + wM, + wS, + ], + [p_next], + )( + nlp.states.cx_start, + nlp.controls.cx_start, + nlp.parameters, + nlp.stochastic_variables.cx_start, + nlp.integrated_values["cov"].cx_start, # Should be the right shape to work + wM_magnitude, + wS_magnitude, + ) p_vector = nlp.integrated_values.reshape_to_vector(func_eval) return p_vector + def reach_target_consistantly(controllers: list[PenaltyController]) -> cas.MX: """ Constraint the hand to reach the target consistently. @@ -418,7 +478,17 @@ def reach_target_consistantly(controllers: list[PenaltyController]) -> cas.MX: cov_sym = cas.MX.sym("cov", controllers[-1].integrated_values.cx_start.shape[0]) cov_sym_dict = {"cov": cov_sym} cov_sym_dict["cov"].cx_start = cov_sym - cov_matrix = controllers[-1].integrated_values["cov"].reshape_to_matrix(cov_sym_dict, controllers[-1].states.cx_start.shape[0], controllers[-1].states.cx_start.shape[0], Node.START, "cov") + cov_matrix = ( + controllers[-1] + .integrated_values["cov"] + .reshape_to_matrix( + cov_sym_dict, + controllers[-1].states.cx_start.shape[0], + controllers[-1].states.cx_start.shape[0], + Node.START, + "cov", + ) + ) hand_pos = controllers[0].model.end_effector_position(Q) hand_vel = controllers[0].model.end_effector_velocity(Q, Qdot) @@ -435,11 +505,16 @@ def reach_target_consistantly(controllers: list[PenaltyController]) -> cas.MX: out = cas.vertcat(pos_constraint[0, 0], pos_constraint[1, 1], vel_constraint[0, 0], vel_constraint[1, 1]) fun = cas.Function("reach_target_consistantly", [Q, Qdot, cov_sym], [out]) - val = fun(controllers[-1].states["q"].cx_start, controllers[-1].states["qdot"].cx_start, controllers[-1].integrated_values.cx_start) + val = fun( + controllers[-1].states["q"].cx_start, + controllers[-1].states["qdot"].cx_start, + controllers[-1].integrated_values.cx_start, + ) # Since the stochastic variables are defined with ns+1, the cx_start actually refers to the last node (when using node=Node.END) return val + def expected_feedback_effort(controllers: list[PenaltyController], wS_magnitude: cas.DM) -> cas.MX: """ ... @@ -453,7 +528,17 @@ def expected_feedback_effort(controllers: list[PenaltyController], wS_magnitude: cov_sym = cas.MX.sym("cov", controllers[0].integrated_values.cx_start.shape[0]) cov_sym_dict = {"cov": cov_sym} cov_sym_dict["cov"].cx_start = cov_sym - cov_matrix = controllers[0].integrated_values["cov"].reshape_to_matrix(cov_sym_dict, controllers[0].states.cx_start.shape[0], controllers[0].states.cx_start.shape[0], Node.START, "cov") + cov_matrix = ( + controllers[0] + .integrated_values["cov"] + .reshape_to_matrix( + cov_sym_dict, + controllers[0].states.cx_start.shape[0], + controllers[0].states.cx_start.shape[0], + Node.START, + "cov", + ) + ) k = controllers[0].stochastic_variables["k"].cx_start K_matrix = cas.MX(4, 6) @@ -464,16 +549,20 @@ def expected_feedback_effort(controllers: list[PenaltyController], wS_magnitude: # Compute the expected effort hand_pos = controllers[0].model.end_effector_position(controllers[0].states["q"].cx_start) - hand_vel = controllers[0].model.end_effector_velocity(controllers[0].states["q"].cx_start, controllers[0].states["qdot"].cx_start) + hand_vel = controllers[0].model.end_effector_velocity( + controllers[0].states["q"].cx_start, controllers[0].states["qdot"].cx_start + ) trace_k_sensor_k = cas.trace(K_matrix @ sensory_noise_matrix @ K_matrix.T) ee = cas.vertcat(hand_pos, hand_vel) e_fb = K_matrix @ ((ee - ee_ref) + wS_magnitude) jac_e_fb_x = cas.jacobian(e_fb, controllers[0].states.cx_start) trace_jac_p_jack = cas.trace(jac_e_fb_x @ cov_matrix @ jac_e_fb_x.T) expectedEffort_fb_mx = trace_jac_p_jack + trace_k_sensor_k - func = cas.Function('f_expectedEffort_fb', - [controllers[0].states.cx_start, controllers[0].stochastic_variables.cx_start, cov_sym], - [expectedEffort_fb_mx]) + func = cas.Function( + "f_expectedEffort_fb", + [controllers[0].states.cx_start, controllers[0].stochastic_variables.cx_start, cov_sym], + [expectedEffort_fb_mx], + ) f_expectedEffort_fb = 0 for i, ctrl in enumerate(controllers): @@ -484,34 +573,62 @@ def expected_feedback_effort(controllers: list[PenaltyController], wS_magnitude: return f_expectedEffort_fb -def zero_acceleration(controller: PenaltyController, wM: np.ndarray, wS: np.ndarray, force_field_magnitude:float) -> cas.MX: - dx = stochastic_forward_dynamics(controller.states.cx_start, controller.controls.cx_start, - controller.parameters.cx_start, controller.stochastic_variables.cx_start, - controller.get_nlp, wM, wS, force_field_magnitude=force_field_magnitude, with_gains=False) +def zero_acceleration( + controller: PenaltyController, wM: np.ndarray, wS: np.ndarray, force_field_magnitude: float +) -> cas.MX: + dx = stochastic_forward_dynamics( + controller.states.cx_start, + controller.controls.cx_start, + controller.parameters.cx_start, + controller.stochastic_variables.cx_start, + controller.get_nlp, + wM, + wS, + force_field_magnitude=force_field_magnitude, + with_gains=False, + ) return dx.dxdt[2:4] + def track_final_marker(controller: PenaltyController) -> cas.MX: q = controller.states["q"].cx_start ee_pos = controller.model.end_effector_position(q) return ee_pos -def leuven_trapezoidal(controllers: list[PenaltyController], force_field_magnitude) -> cas.MX: +def leuven_trapezoidal(controllers: list[PenaltyController], force_field_magnitude) -> cas.MX: wM = np.zeros((2, 1)) wS = np.zeros((4, 1)) dt = controllers[0].tf / controllers[0].ns - dX_i = stochastic_forward_dynamics(controllers[0].states.cx_start, controllers[0].controls.cx_start, - controllers[0].parameters.cx_start, controllers[0].stochastic_variables.cx_start, - controllers[0].get_nlp, wM, wS, force_field_magnitude=force_field_magnitude, with_gains=False).dxdt - dX_i_plus = stochastic_forward_dynamics(controllers[1].states.cx_start, controllers[1].controls.cx_start, - controllers[1].parameters.cx_start, controllers[1].stochastic_variables.cx_start, - controllers[1].get_nlp, wM, wS, force_field_magnitude=force_field_magnitude, with_gains=False).dxdt + dX_i = stochastic_forward_dynamics( + controllers[0].states.cx_start, + controllers[0].controls.cx_start, + controllers[0].parameters.cx_start, + controllers[0].stochastic_variables.cx_start, + controllers[0].get_nlp, + wM, + wS, + force_field_magnitude=force_field_magnitude, + with_gains=False, + ).dxdt + dX_i_plus = stochastic_forward_dynamics( + controllers[1].states.cx_start, + controllers[1].controls.cx_start, + controllers[1].parameters.cx_start, + controllers[1].stochastic_variables.cx_start, + controllers[1].get_nlp, + wM, + wS, + force_field_magnitude=force_field_magnitude, + with_gains=False, + ).dxdt out = controllers[1].states.cx_start - (controllers[0].states.cx_start + (dX_i + dX_i_plus) / 2 * dt) return out * 1e3 + def prepare_socp( final_time: float, n_shooting: int, @@ -553,35 +670,59 @@ def prepare_socp( # Add objective functions objective_functions = ObjectiveList() - objective_functions.add(ObjectiveFcn.Lagrange.MINIMIZE_CONTROL, node=Node.ALL_SHOOTING, key="muscles", weight=1e3/2, quadratic=True) - objective_functions.add(ObjectiveFcn.Lagrange.MINIMIZE_STATE, node=Node.ALL_SHOOTING, key="muscles", weight=1e3/2, quadratic=True) + objective_functions.add( + ObjectiveFcn.Lagrange.MINIMIZE_CONTROL, node=Node.ALL_SHOOTING, key="muscles", weight=1e3 / 2, quadratic=True + ) + objective_functions.add( + ObjectiveFcn.Lagrange.MINIMIZE_STATE, node=Node.ALL_SHOOTING, key="muscles", weight=1e3 / 2, quadratic=True + ) multinode_objectives = MultinodeObjectiveList() - multinode_objectives.add(minimize_uncertainty, - nodes_phase=[0 for _ in range(n_shooting)], - nodes=[i for i in range(n_shooting)], - key="muscles", - weight=1e3 / 2, - quadratic=False) - multinode_objectives.add(expected_feedback_effort, - nodes_phase=[0 for _ in range(n_shooting)], - nodes=[i for i in range(n_shooting)], - wS_magnitude=wS_magnitude, - weight=1e3 / 2, - quadratic=False) + multinode_objectives.add( + minimize_uncertainty, + nodes_phase=[0 for _ in range(n_shooting)], + nodes=[i for i in range(n_shooting)], + key="muscles", + weight=1e3 / 2, + quadratic=False, + ) + multinode_objectives.add( + expected_feedback_effort, + nodes_phase=[0 for _ in range(n_shooting)], + nodes=[i for i in range(n_shooting)], + wS_magnitude=wS_magnitude, + weight=1e3 / 2, + quadratic=False, + ) # Constraints constraints = ConstraintList() constraints.add(ee_equals_ee_ref, node=Node.ALL_SHOOTING) - constraints.add(ConstraintFcn.TRACK_STATE, key="q", node=Node.START, target=np.array([shoulder_pos_initial, elbow_pos_initial])) + constraints.add( + ConstraintFcn.TRACK_STATE, key="q", node=Node.START, target=np.array([shoulder_pos_initial, elbow_pos_initial]) + ) constraints.add(ConstraintFcn.TRACK_STATE, key="qdot", node=Node.START, target=np.array([0, 0])) - constraints.add(zero_acceleration, node=Node.START, wM=np.zeros((2, 1)), wS=np.zeros((4, 1)), force_field_magnitude=force_field_magnitude) + constraints.add( + zero_acceleration, + node=Node.START, + wM=np.zeros((2, 1)), + wS=np.zeros((4, 1)), + force_field_magnitude=force_field_magnitude, + ) constraints.add(track_final_marker, node=Node.PENULTIMATE, target=ee_final_position) constraints.add(ConstraintFcn.TRACK_STATE, key="qdot", node=Node.PENULTIMATE, target=np.array([0, 0])) - constraints.add(zero_acceleration, node=Node.PENULTIMATE, wM=np.zeros((2, 1)), wS=np.zeros((4, 1)), force_field_magnitude=force_field_magnitude) # Not possible sice the control on the last node is NaN + constraints.add( + zero_acceleration, + node=Node.PENULTIMATE, + wM=np.zeros((2, 1)), + wS=np.zeros((4, 1)), + force_field_magnitude=force_field_magnitude, + ) # Not possible sice the control on the last node is NaN constraints.add(ConstraintFcn.TRACK_CONTROL, key="muscles", node=Node.ALL_SHOOTING, min_bound=0.001, max_bound=1) constraints.add(ConstraintFcn.TRACK_STATE, key="muscles", node=Node.ALL, min_bound=0.001, max_bound=1) - constraints.add(ConstraintFcn.TRACK_STATE, key="q", node=Node.ALL, min_bound=0, max_bound=180) # This is a bug, it should be in radians + constraints.add( + ConstraintFcn.TRACK_STATE, key="q", node=Node.ALL, min_bound=0, max_bound=180 + ) # This is a bug, it should be in radians if problem_type == "BAR": max_bounds_lateral_variation = cas.inf @@ -591,39 +732,61 @@ def prepare_socp( raise NotImplementedError("Wrong problem type") multinode_constraints = MultinodeConstraintList() - multinode_constraints.add(reach_target_consistantly, - nodes_phase=[0 for _ in range(n_shooting)], - nodes=[i for i in range(n_shooting)], - min_bound=np.array([-cas.inf, -cas.inf, -cas.inf, -cas.inf]), - max_bound=np.array([max_bounds_lateral_variation**2, 0.004**2, 0.05**2, 0.05**2])) - for i in range(n_shooting-1): - multinode_constraints.add(leuven_trapezoidal, - nodes_phase=[0, 0], - nodes=[i, i+1], - force_field_magnitude=force_field_magnitude) + multinode_constraints.add( + reach_target_consistantly, + nodes_phase=[0 for _ in range(n_shooting)], + nodes=[i for i in range(n_shooting)], + min_bound=np.array([-cas.inf, -cas.inf, -cas.inf, -cas.inf]), + max_bound=np.array([max_bounds_lateral_variation**2, 0.004**2, 0.05**2, 0.05**2]), + ) + for i in range(n_shooting - 1): + multinode_constraints.add( + leuven_trapezoidal, nodes_phase=[0, 0], nodes=[i, i + 1], force_field_magnitude=force_field_magnitude + ) # Dynamics dynamics = DynamicsList() - dynamics.add(configure_stochastic_optimal_control_problem, - dynamic_function=lambda states, controls, parameters, stochastic_variables, nlp, wM, wS, - with_gains: stochastic_forward_dynamics(states, controls, parameters, - stochastic_variables, nlp, wM, wS, - force_field_magnitude=force_field_magnitude, - with_gains=with_gains), - wM=np.zeros((2, 1)), wS=np.zeros((4, 1))) + dynamics.add( + configure_stochastic_optimal_control_problem, + dynamic_function=lambda states, controls, parameters, stochastic_variables, nlp, wM, wS, with_gains: stochastic_forward_dynamics( + states, + controls, + parameters, + stochastic_variables, + nlp, + wM, + wS, + force_field_magnitude=force_field_magnitude, + with_gains=with_gains, + ), + wM=np.zeros((2, 1)), + wS=np.zeros((4, 1)), + ) n_muscles = 6 n_q = bio_model.nb_q n_qdot = bio_model.nb_qdot n_states = n_q + n_qdot + n_muscles - states_min = np.ones((n_states, n_shooting+1)) * -cas.inf - states_max = np.ones((n_states, n_shooting+1)) * cas.inf + states_min = np.ones((n_states, n_shooting + 1)) * -cas.inf + states_max = np.ones((n_states, n_shooting + 1)) * cas.inf x_bounds = BoundsList() - x_bounds.add("q", min_bound=states_min[:n_q, :], max_bound=states_max[:n_q, :], interpolation=InterpolationType.EACH_FRAME) - x_bounds.add("qdot", min_bound=states_min[n_q:n_q+n_qdot, :], max_bound=states_max[n_q:n_q+n_qdot, :], interpolation=InterpolationType.EACH_FRAME) - x_bounds.add("muscles", min_bound=states_min[n_q+n_qdot:, :], max_bound=states_max[n_q+n_qdot:, :], interpolation=InterpolationType.EACH_FRAME) + x_bounds.add( + "q", min_bound=states_min[:n_q, :], max_bound=states_max[:n_q, :], interpolation=InterpolationType.EACH_FRAME + ) + x_bounds.add( + "qdot", + min_bound=states_min[n_q : n_q + n_qdot, :], + max_bound=states_max[n_q : n_q + n_qdot, :], + interpolation=InterpolationType.EACH_FRAME, + ) + x_bounds.add( + "muscles", + min_bound=states_min[n_q + n_qdot :, :], + max_bound=states_max[n_q + n_qdot :, :], + interpolation=InterpolationType.EACH_FRAME, + ) u_bounds = BoundsList() controls_min = np.ones((n_muscles, 3)) * -cas.inf @@ -632,8 +795,8 @@ def prepare_socp( input_sol_FLAG = False # True if input_sol_FLAG: - #load pickle - with open(f"leuvenarm_muscle_driven_socp_{problem_type}_forcefield{force_field_magnitude}.pkl", 'rb') as f: + # load pickle + with open(f"leuvenarm_muscle_driven_socp_{problem_type}_forcefield{force_field_magnitude}.pkl", "rb") as f: data = pickle.load(f) q_sol = data["q_sol"] qdot_sol = data["qdot_sol"] @@ -652,13 +815,13 @@ def prepare_socp( states_init[0, -1] = shoulder_pos_final states_init[1, :-1] = np.linspace(elbow_pos_initial, elbow_pos_final, n_shooting) states_init[1, -1] = elbow_pos_final - states_init[n_q + n_qdot:, :] = 0.01 + states_init[n_q + n_qdot :, :] = 0.01 else: states_init = cas.vertcat(q_sol, qdot_sol, activations_sol) x_init = InitialGuessList() x_init.add("q", initial_guess=states_init[:n_q, :], interpolation=InterpolationType.EACH_FRAME) - x_init.add("qdot", initial_guess=states_init[n_q:n_q+n_qdot, :], interpolation=InterpolationType.EACH_FRAME) - x_init.add("muscles", initial_guess=states_init[n_q+n_qdot:, :], interpolation=InterpolationType.EACH_FRAME) + x_init.add("qdot", initial_guess=states_init[n_q : n_q + n_qdot, :], interpolation=InterpolationType.EACH_FRAME) + x_init.add("muscles", initial_guess=states_init[n_q + n_qdot :, :], interpolation=InterpolationType.EACH_FRAME) if not input_sol_FLAG: controls_init = np.ones((n_muscles, n_shooting)) * 0.01 @@ -668,7 +831,7 @@ def prepare_socp( u_init.add("muscles", initial_guess=controls_init, interpolation=InterpolationType.EACH_FRAME) # TODO: This should probably be done automatically, not defined by the user - n_stochastic = n_muscles*(n_q + n_qdot) + n_q+n_qdot + n_states*n_states # K(6x4) + ee_ref(4x1) + M(10x10) + n_stochastic = n_muscles * (n_q + n_qdot) + n_q + n_qdot + n_states * n_states # K(6x4) + ee_ref(4x1) + M(10x10) s_init = InitialGuessList() s_bounds = BoundsList() stochastic_min = np.ones((n_stochastic, 3)) * -cas.inf @@ -676,40 +839,89 @@ def prepare_socp( if not input_sol_FLAG: stochastic_init = np.zeros((n_stochastic, n_shooting + 1)) curent_index = 0 - stochastic_init[:n_muscles * (n_q + n_qdot), :] = 0.01 # K - s_init.add("k", initial_guess=stochastic_init[:n_muscles * (n_q + n_qdot), :], interpolation=InterpolationType.EACH_FRAME) - s_bounds.add("k", min_bound=stochastic_min[:n_muscles * (n_q + n_qdot), :], max_bound=stochastic_max[:n_muscles * (n_q + n_qdot), :]) + stochastic_init[: n_muscles * (n_q + n_qdot), :] = 0.01 # K + s_init.add( + "k", + initial_guess=stochastic_init[: n_muscles * (n_q + n_qdot), :], + interpolation=InterpolationType.EACH_FRAME, + ) + s_bounds.add( + "k", + min_bound=stochastic_min[: n_muscles * (n_q + n_qdot), :], + max_bound=stochastic_max[: n_muscles * (n_q + n_qdot), :], + ) curent_index += n_muscles * (n_q + n_qdot) - stochastic_init[curent_index: curent_index + n_q + n_qdot, :] = 0.01 # ee_ref + stochastic_init[curent_index : curent_index + n_q + n_qdot, :] = 0.01 # ee_ref # stochastic_init[curent_index : curent_index + n_q+n_qdot, 0] = np.array([ee_initial_position[0], ee_initial_position[1], 0, 0]) # ee_ref # stochastic_init[curent_index : curent_index + n_q+n_qdot, 1] = np.array([ee_final_position[0], ee_final_position[1], 0, 0]) - s_init.add("ee_ref", initial_guess=stochastic_init[curent_index: curent_index + n_q + n_qdot, :], - interpolation=InterpolationType.EACH_FRAME) - s_bounds.add("ee_ref", min_bound=stochastic_min[curent_index: curent_index + n_q + n_qdot, :], max_bound=stochastic_max[curent_index: curent_index + n_q + n_qdot, :]) + s_init.add( + "ee_ref", + initial_guess=stochastic_init[curent_index : curent_index + n_q + n_qdot, :], + interpolation=InterpolationType.EACH_FRAME, + ) + s_bounds.add( + "ee_ref", + min_bound=stochastic_min[curent_index : curent_index + n_q + n_qdot, :], + max_bound=stochastic_max[curent_index : curent_index + n_q + n_qdot, :], + ) curent_index += n_q + n_qdot - stochastic_init[curent_index: curent_index + n_states * n_states, :] = 0.01 # M - s_init.add("m", initial_guess=stochastic_init[curent_index: curent_index + n_states * n_states, :], interpolation=InterpolationType.EACH_FRAME) - s_bounds.add("m", min_bound=stochastic_min[curent_index: curent_index + n_states * n_states, :], - max_bound=stochastic_max[curent_index: curent_index + n_states * n_states, :]) + stochastic_init[curent_index : curent_index + n_states * n_states, :] = 0.01 # M + s_init.add( + "m", + initial_guess=stochastic_init[curent_index : curent_index + n_states * n_states, :], + interpolation=InterpolationType.EACH_FRAME, + ) + s_bounds.add( + "m", + min_bound=stochastic_min[curent_index : curent_index + n_states * n_states, :], + max_bound=stochastic_max[curent_index : curent_index + n_states * n_states, :], + ) else: stochastic_init = stochastic_variables_sol curent_index = 0 - s_init.add("k", initial_guess=stochastic_init[:n_muscles * (n_q + n_qdot), :], interpolation=InterpolationType.EACH_FRAME) - s_bounds.add("k", min_bound=stochastic_min[:n_muscles * (n_q + n_qdot), :], - max_bound=stochastic_max[:n_muscles * (n_q + n_qdot), :]) + s_init.add( + "k", + initial_guess=stochastic_init[: n_muscles * (n_q + n_qdot), :], + interpolation=InterpolationType.EACH_FRAME, + ) + s_bounds.add( + "k", + min_bound=stochastic_min[: n_muscles * (n_q + n_qdot), :], + max_bound=stochastic_max[: n_muscles * (n_q + n_qdot), :], + ) curent_index += n_muscles * (n_q + n_qdot) - s_init.add("ee_ref", initial_guess=stochastic_init[curent_index: curent_index + n_q + n_qdot, :], - interpolation=InterpolationType.EACH_FRAME) - s_bounds.add("ee_ref", min_bound=stochastic_min[curent_index: curent_index + n_q + n_qdot, :], - max_bound=stochastic_max[curent_index: curent_index + n_q + n_qdot, :]) + s_init.add( + "ee_ref", + initial_guess=stochastic_init[curent_index : curent_index + n_q + n_qdot, :], + interpolation=InterpolationType.EACH_FRAME, + ) + s_bounds.add( + "ee_ref", + min_bound=stochastic_min[curent_index : curent_index + n_q + n_qdot, :], + max_bound=stochastic_max[curent_index : curent_index + n_q + n_qdot, :], + ) curent_index += n_q + n_qdot - s_init.add("m", initial_guess=stochastic_init[curent_index: curent_index + n_states * n_states, :], - interpolation=InterpolationType.EACH_FRAME) - s_bounds.add("m", min_bound=stochastic_min[curent_index: curent_index + n_states * n_states, :], - max_bound=stochastic_max[curent_index: curent_index + n_states * n_states, :]) + s_init.add( + "m", + initial_guess=stochastic_init[curent_index : curent_index + n_states * n_states, :], + interpolation=InterpolationType.EACH_FRAME, + ) + s_bounds.add( + "m", + min_bound=stochastic_min[curent_index : curent_index + n_states * n_states, :], + max_bound=stochastic_max[curent_index : curent_index + n_states * n_states, :], + ) # TODO: we should probably change the name stochastic_variables -> helper_variables ? - integrated_value_functions = {"cov": lambda nlp, node_index: get_p_mat(nlp, node_index, force_field_magnitude=force_field_magnitude, wM_magnitude=wM_magnitude, wS_magnitude=wS_magnitude)} + integrated_value_functions = { + "cov": lambda nlp, node_index: get_p_mat( + nlp, + node_index, + force_field_magnitude=force_field_magnitude, + wM_magnitude=wM_magnitude, + wS_magnitude=wS_magnitude, + ) + } return StochasticOptimalControlProgram( bio_model, @@ -731,11 +943,11 @@ def prepare_socp( n_threads=1, assume_phase_dynamics=False, problem_type=OcpType.SOCP_EXPLICIT(wM_magnitude, wS_magnitude), - integrated_value_functions=integrated_value_functions + integrated_value_functions=integrated_value_functions, ) -def main(): +def main(): RUN_OPTIM_FLAG = True # False PLOT_SOL_FLAG = False # True VIZUALIZE_SOL_FLAG = False # True @@ -758,39 +970,40 @@ def main(): wPq_std = 3e-4 wPqdot_std = 0.0024 - wM_magnitude = cas.DM(np.array([wM_std ** 2 / dt, wM_std ** 2 / dt])) - wPq_magnitude = cas.DM(np.array([wPq_std ** 2 / dt, wPq_std ** 2 / dt])) - wPqdot_magnitude = cas.DM(np.array([wPqdot_std ** 2 / dt, wPqdot_std ** 2 / dt])) + wM_magnitude = cas.DM(np.array([wM_std**2 / dt, wM_std**2 / dt])) + wPq_magnitude = cas.DM(np.array([wPq_std**2 / dt, wPq_std**2 / dt])) + wPqdot_magnitude = cas.DM(np.array([wPqdot_std**2 / dt, wPqdot_std**2 / dt])) wS_magnitude = cas.vertcat(wPq_magnitude, wPqdot_magnitude) - # Solver parameters solver = Solver.IPOPT(show_online_optim=False) - solver.set_linear_solver('mumps') + solver.set_linear_solver("mumps") # solver.set_linear_solver('ma57') solver.set_tol(1e-3) solver.set_dual_inf_tol(3e-4) solver.set_constr_viol_tol(1e-7) # solver.set_maximum_iterations(10000) solver.set_maximum_iterations(4) - solver.set_hessian_approximation('limited-memory') + solver.set_hessian_approximation("limited-memory") solver.set_bound_frac(1e-8) solver.set_bound_push(1e-8) - solver.set_nlp_scaling_method('none') + solver.set_nlp_scaling_method("none") problem_type = "CIRCLE" force_field_magnitude = 0 - socp = prepare_socp(final_time=final_time, - n_shooting=n_shooting, - ee_final_position=ee_final_position, - wM_magnitude=wM_magnitude, - wS_magnitude=wS_magnitude, - problem_type=problem_type, - force_field_magnitude=force_field_magnitude) + socp = prepare_socp( + final_time=final_time, + n_shooting=n_shooting, + ee_final_position=ee_final_position, + wM_magnitude=wM_magnitude, + wS_magnitude=wS_magnitude, + problem_type=problem_type, + force_field_magnitude=force_field_magnitude, + ) if RUN_OPTIM_FLAG: sol_socp = socp.solve(solver) - print('ici') + print("ici") # iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls # 0 1.3548521e+00 2.05e+03 1.19e+00 0.0 0.00e+00 - 0.00e+00 0.00e+00 0 # 1 2.2407650e+00 2.04e+03 6.94e+04 -0.9 1.03e+02 - 3.22e-03 9.61e-03f 1 @@ -812,15 +1025,17 @@ def main(): for k in range(10): cov_sol[j, k, i] = cov_sol_vect[j * 10 + k, i] stochastic_variables_sol = np.vstack((k_sol, ee_ref_sol, m_sol)) - data = {"q_sol": q_sol, - "qdot_sol": qdot_sol, - "activations_sol": activations_sol, - "excitations_sol": excitations_sol, - "k_sol": k_sol, - "ee_ref_sol": ee_ref_sol, - "m_sol": m_sol, - "cov_sol": cov_sol, - "stochastic_variables_sol": stochastic_variables_sol} + data = { + "q_sol": q_sol, + "qdot_sol": qdot_sol, + "activations_sol": activations_sol, + "excitations_sol": excitations_sol, + "k_sol": k_sol, + "ee_ref_sol": ee_ref_sol, + "m_sol": m_sol, + "cov_sol": cov_sol, + "stochastic_variables_sol": stochastic_variables_sol, + } # # --- Save the results --- # # with open(f"leuvenarm_muscle_driven_socp_{problem_type}_forcefield{force_field_magnitude}.pkl", "wb") as file: @@ -839,28 +1054,32 @@ def main(): stochastic_variables_sol = np.vstack((k_sol, ee_ref_sol, m_sol)) # Save .mat files - sio.savemat(f"leuvenarm_muscle_driven_socp_{problem_type}_forcefield{force_field_magnitude}.mat", - {"q_sol": q_sol, - "qdot_sol": qdot_sol, - "activations_sol": activations_sol, - "excitations_sol": excitations_sol, - "k_sol": k_sol, - "ee_ref_sol": ee_ref_sol, - "m_sol": m_sol, - "stochastic_variables_sol": stochastic_variables_sol}) + sio.savemat( + f"leuvenarm_muscle_driven_socp_{problem_type}_forcefield{force_field_magnitude}.mat", + { + "q_sol": q_sol, + "qdot_sol": qdot_sol, + "activations_sol": activations_sol, + "excitations_sol": excitations_sol, + "k_sol": k_sol, + "ee_ref_sol": ee_ref_sol, + "m_sol": m_sol, + "stochastic_variables_sol": stochastic_variables_sol, + }, + ) if VIZUALIZE_SOL_FLAG: import bioviz + b = bioviz.Viz(model_path=biorbd_model_path) b.load_movement(q_sol[:, :-1]) b.exec() - # --- Plot the results --- # if PLOT_SOL_FLAG: model = LeuvenArmModel() - Q_sym = cas.MX.sym('Q', 2, 1) - Qdot_sym = cas.MX.sym('Qdot', 2, 1) + Q_sym = cas.MX.sym("Q", 2, 1) + Qdot_sym = cas.MX.sym("Qdot", 2, 1) hand_pos_fcn = cas.Function("hand_pos", [Q_sym], [model.end_effector_position(Q_sym)]) hand_vel_fcn = cas.Function("hand_vel", [Q_sym, Qdot_sym], [model.end_effector_velocity(Q_sym, Qdot_sym)]) @@ -869,10 +1088,22 @@ def main(): parameters = socp.nlp[0].parameters.cx_start stochastic_variables = socp.nlp[0].stochastic_variables.cx_start nlp = socp.nlp[0] - wM_sym = cas.MX.sym('wM', 2, 1) - wS_sym = cas.MX.sym('wS', 4, 1) - out = stochastic_forward_dynamics(states, controls, parameters, stochastic_variables, nlp, wM_sym, wS_sym, force_field_magnitude=force_field_magnitude, with_gains=True) - dyn_fun = cas.Function("dyn_fun", [states, controls, parameters, stochastic_variables, wM_sym, wS_sym], [out.dxdt]) + wM_sym = cas.MX.sym("wM", 2, 1) + wS_sym = cas.MX.sym("wS", 4, 1) + out = stochastic_forward_dynamics( + states, + controls, + parameters, + stochastic_variables, + nlp, + wM_sym, + wS_sym, + force_field_magnitude=force_field_magnitude, + with_gains=True, + ) + dyn_fun = cas.Function( + "dyn_fun", [states, controls, parameters, stochastic_variables, wM_sym, wS_sym], [out.dxdt] + ) fig, axs = plt.subplots(3, 2) n_simulations = 30 @@ -890,22 +1121,34 @@ def main(): qdot_simulated[i_simulation, :, 0] = qdot_sol[:, 0] mus_activation_simulated[i_simulation, :, 0] = activations_sol[:, 0] for i_node in range(n_shooting): - x_prev = cas.vertcat(q_simulated[i_simulation, :, i_node], qdot_simulated[i_simulation, :, i_node], mus_activation_simulated[i_simulation, :, i_node]) + x_prev = cas.vertcat( + q_simulated[i_simulation, :, i_node], + qdot_simulated[i_simulation, :, i_node], + mus_activation_simulated[i_simulation, :, i_node], + ) hand_pos_simulated[i_simulation, :, i_node] = np.reshape(hand_pos_fcn(x_prev[:2])[:2], (2,)) - hand_vel_simulated[i_simulation, :, i_node] = np.reshape(hand_vel_fcn(x_prev[:2], x_prev[2:4])[:2], (2,)) + hand_vel_simulated[i_simulation, :, i_node] = np.reshape( + hand_vel_fcn(x_prev[:2], x_prev[2:4])[:2], (2,) + ) u = excitations_sol[:, i_node] s = stochastic_variables_sol[:, i_node] k1 = dyn_fun(x_prev, u, [], s, wM[:, i_node], wS[:, i_node]) x_next = x_prev + dt * dyn_fun(x_prev + dt / 2 * k1, u, [], s, wM[:, i_node], wS[:, i_node]) - q_simulated[i_simulation, :, i_node + 1] = np.reshape(x_next[:2], (2, )) - qdot_simulated[i_simulation, :, i_node + 1] = np.reshape(x_next[2:4], (2, )) - mus_activation_simulated[i_simulation, :, i_node + 1] = np.reshape(x_next[4:], (6, )) + q_simulated[i_simulation, :, i_node + 1] = np.reshape(x_next[:2], (2,)) + qdot_simulated[i_simulation, :, i_node + 1] = np.reshape(x_next[2:4], (2,)) + mus_activation_simulated[i_simulation, :, i_node + 1] = np.reshape(x_next[4:], (6,)) hand_pos_simulated[i_simulation, :, i_node + 1] = np.reshape(hand_pos_fcn(x_next[:2])[:2], (2,)) - hand_vel_simulated[i_simulation, :, i_node + 1] = np.reshape(hand_vel_fcn(x_next[:2], x_next[2:4])[:2], (2, )) - axs[0, 0].plot(hand_pos_simulated[i_simulation, 0, :], hand_pos_simulated[i_simulation, 1, :], color="tab:red") + hand_vel_simulated[i_simulation, :, i_node + 1] = np.reshape( + hand_vel_fcn(x_next[:2], x_next[2:4])[:2], (2,) + ) + axs[0, 0].plot( + hand_pos_simulated[i_simulation, 0, :], hand_pos_simulated[i_simulation, 1, :], color="tab:red" + ) axs[1, 0].plot(np.linspace(0, final_time, n_shooting + 1), q_simulated[i_simulation, 0, :], color="k") axs[2, 0].plot(np.linspace(0, final_time, n_shooting + 1), q_simulated[i_simulation, 1, :], color="k") - axs[0, 1].plot(hand_vel_simulated[i_simulation, 0, :], hand_vel_simulated[i_simulation, 1, :], color="tab:red") + axs[0, 1].plot( + hand_vel_simulated[i_simulation, 0, :], hand_vel_simulated[i_simulation, 1, :], color="tab:red" + ) axs[1, 1].plot(np.linspace(0, final_time, n_shooting + 1), qdot_simulated[i_simulation, 0, :], color="k") axs[2, 1].plot(np.linspace(0, final_time, n_shooting + 1), qdot_simulated[i_simulation, 1, :], color="k") hand_pos_without_noise = np.zeros((2, n_shooting + 1)) @@ -935,5 +1178,6 @@ def main(): # TODO: integrate to see the error they commit with the trapezoidal + if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py b/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py index 6e7755878..a5d004ea8 100644 --- a/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py +++ b/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py @@ -13,6 +13,7 @@ import scipy.io as sio import sys + # sys.path.append("/home/charbie/Documents/Programmation/BiorbdOptim") from bioptim import ( OptimalControlProgram, @@ -38,6 +39,7 @@ InitialGuessList, ) + def get_force_field(q, force_field_magnitude): l1 = 0.3 l2 = 0.33 @@ -48,9 +50,11 @@ def get_force_field(q, force_field_magnitude): tau_force_field = -F_forceField @ hand_pos return tau_force_field + def get_excitation_with_feedback(K, EE, EE_ref, wS): return K @ ((EE - EE_ref) + wS) + def stochastic_forward_dynamics( states: cas.MX | cas.SX, controls: cas.MX | cas.SX, @@ -62,7 +66,6 @@ def stochastic_forward_dynamics( force_field_magnitude, with_gains, ) -> DynamicsEvaluation: - q = DynamicsFunctions.get(nlp.states["q"], states) qdot = DynamicsFunctions.get(nlp.states["qdot"], states) qddot = DynamicsFunctions.get(nlp.states["qddot"], states) @@ -78,10 +81,10 @@ def stochastic_forward_dynamics( if with_gains: ee_ref = DynamicsFunctions.get(nlp.stochastic_variables["ee_ref"], stochastic_variables) k = DynamicsFunctions.get(nlp.stochastic_variables["k"], stochastic_variables) - K_matrix = cas.MX(n_q+n_qdot, n_tau) - for s0 in range(n_q+n_qdot): + K_matrix = cas.MX(n_q + n_qdot, n_tau) + for s0 in range(n_q + n_qdot): for s1 in range(n_tau): - K_matrix[s0, s1] = k[s0*n_tau + s1] + K_matrix[s0, s1] = k[s0 * n_tau + s1] K_matrix = K_matrix.T hand_pos = nlp.model.markers(q)[2][:2] @@ -109,8 +112,8 @@ def stochastic_forward_dynamics( return DynamicsEvaluation(dxdt=cas.vertcat(dq_computed, dqdot_computed, dqddot_computed), defects=defects) -def configure_stochastic_optimal_control_problem(ocp: OptimalControlProgram, nlp: NonLinearProgram, wM, wS): +def configure_stochastic_optimal_control_problem(ocp: OptimalControlProgram, nlp: NonLinearProgram, wM, wS): ConfigureProblem.configure_q(ocp, nlp, True, False, False) ConfigureProblem.configure_qdot(ocp, nlp, True, False, True) ConfigureProblem.configure_qddot(ocp, nlp, True, False, True) @@ -121,21 +124,23 @@ def configure_stochastic_optimal_control_problem(ocp: OptimalControlProgram, nlp ConfigureProblem.configure_stochastic_k(ocp, nlp, n_noised_controls=2, n_feedbacks=4) ConfigureProblem.configure_stochastic_ee_ref(ocp, nlp, n_references=4) ConfigureProblem.configure_stochastic_m(ocp, nlp, n_noised_states=6) - mat_p_init = cas.DM_eye(6) * np.array([1e-4, 1e-4, 1e-7, 1e-7, 1e-6, 1e-6]) # P, the oise on the acceleration should be chosen carefully (here arbitrary) + mat_p_init = cas.DM_eye(6) * np.array( + [1e-4, 1e-4, 1e-7, 1e-7, 1e-6, 1e-6] + ) # P, the oise on the acceleration should be chosen carefully (here arbitrary) ConfigureProblem.configure_stochastic_cov(ocp, nlp, n_noised_states=6, initial_matrix=mat_p_init) - ConfigureProblem.configure_dynamics_function(ocp, nlp, - dyn_func=lambda states, controls, parameters, - stochastic_variables, nlp, wM, wS: nlp.dynamics_type.dynamic_function(states, - controls, - parameters, - stochastic_variables, - nlp, - wM, - wS, - with_gains=False), - wM=wM, wS=wS, expand=False) + ConfigureProblem.configure_dynamics_function( + ocp, + nlp, + dyn_func=lambda states, controls, parameters, stochastic_variables, nlp, wM, wS: nlp.dynamics_type.dynamic_function( + states, controls, parameters, stochastic_variables, nlp, wM, wS, with_gains=False + ), + wM=wM, + wS=wS, + expand=False, + ) return + def minimize_uncertainty(controllers: list[PenaltyController], key: str) -> cas.MX: """ Minimize the uncertainty (covariance matrix) of the states. @@ -143,18 +148,21 @@ def minimize_uncertainty(controllers: list[PenaltyController], key: str) -> cas. dt = controllers[0].tf / controllers[0].ns out = 0 for i, ctrl in enumerate(controllers): - P_matrix = ctrl.integrated_values["cov"].reshape_to_matrix(ctrl.integrated_values, ctrl.states.cx.shape[0], - ctrl.states.cx.shape[0], Node.START, "cov") + P_matrix = ctrl.integrated_values["cov"].reshape_to_matrix( + ctrl.integrated_values, ctrl.states.cx.shape[0], ctrl.states.cx.shape[0], Node.START, "cov" + ) P_partial = P_matrix[ctrl.states[key].index, ctrl.states[key].index] out += cas.trace(P_partial) * dt return out + def get_ee(controller: PenaltyController, q, qdot) -> cas.MX: hand_pos = controller.model.markers(q)[2][:2] hand_vel = controller.model.marker_velocities(q, qdot)[2][:2] ee = cas.vertcat(hand_pos, hand_vel) return ee + def ee_equals_ee_ref(controller: PenaltyController) -> cas.MX: q = controller.states["q"].cx_start qdot = controller.states["qdot"].cx_start @@ -164,7 +172,6 @@ def ee_equals_ee_ref(controller: PenaltyController) -> cas.MX: def get_p_mat(nlp, node_index, force_field_magnitude, wM_magnitude, wS_magnitude): - dt = nlp.tf / nlp.ns nlp.states.node_index = node_index - 1 @@ -180,35 +187,56 @@ def get_p_mat(nlp, node_index, force_field_magnitude, wM_magnitude, wS_magnitude M_matrix = nlp.stochastic_variables.reshape_to_matrix(nlp.stochastic_variables, nx, nx, Node.START, "m") wM = cas.MX.sym("wM", n_tau) - wS = cas.MX.sym("wS", n_q+n_qdot) + wS = cas.MX.sym("wS", n_q + n_qdot) sigma_w = cas.vertcat(wS, wM) * cas.MX_eye(cas.vertcat(wS, wM).shape[0]) cov_sym = cas.MX.sym("cov", nlp.integrated_values.cx_start.shape[0]) cov_sym_dict = {"cov": cov_sym} cov_sym_dict["cov"].cx_start = cov_sym cov_matrix = nlp.integrated_values.reshape_to_matrix(cov_sym_dict, nx, nx, Node.START, "cov") - dx = stochastic_forward_dynamics(nlp.states.cx_start, nlp.controls.cx_start, - nlp.parameters, nlp.stochastic_variables.cx_start, - nlp, wM, wS, force_field_magnitude=force_field_magnitude, with_gains=True) + dx = stochastic_forward_dynamics( + nlp.states.cx_start, + nlp.controls.cx_start, + nlp.parameters, + nlp.stochastic_variables.cx_start, + nlp, + wM, + wS, + force_field_magnitude=force_field_magnitude, + with_gains=True, + ) ddx_dwM = cas.jacobian(dx.dxdt, cas.vertcat(wS, wM)) - dg_dw = - ddx_dwM * dt + dg_dw = -ddx_dwM * dt ddx_dx = cas.jacobian(dx.dxdt, nlp.states.cx_start) - dg_dx = - (ddx_dx * dt / 2 + cas.MX_eye(ddx_dx.shape[0])) + dg_dx = -(ddx_dx * dt / 2 + cas.MX_eye(ddx_dx.shape[0])) p_next = M_matrix @ (dg_dx @ cov_matrix @ dg_dx.T + dg_dw @ sigma_w @ dg_dw.T) @ M_matrix.T - func_eval = cas.Function("p_next", [nlp.states.cx_start, nlp.controls.cx_start, - nlp.parameters, nlp.stochastic_variables.cx_start, cov_sym, - wM, wS], [p_next])(nlp.states.cx_start, - nlp.controls.cx_start, - nlp.parameters, - nlp.stochastic_variables.cx_start, - nlp.integrated_values["cov"].cx_start, # Should be the right shape to work - wM_magnitude, - wS_magnitude) + func_eval = cas.Function( + "p_next", + [ + nlp.states.cx_start, + nlp.controls.cx_start, + nlp.parameters, + nlp.stochastic_variables.cx_start, + cov_sym, + wM, + wS, + ], + [p_next], + )( + nlp.states.cx_start, + nlp.controls.cx_start, + nlp.parameters, + nlp.stochastic_variables.cx_start, + nlp.integrated_values["cov"].cx_start, # Should be the right shape to work + wM_magnitude, + wS_magnitude, + ) p_vector = nlp.integrated_values.reshape_to_vector(func_eval) return p_vector + def reach_target_consistantly(controllers: list[PenaltyController]) -> cas.MX: """ Constraint the hand to reach the target consistently. @@ -221,7 +249,17 @@ def reach_target_consistantly(controllers: list[PenaltyController]) -> cas.MX: cov_sym = cas.MX.sym("cov", controllers[-1].integrated_values.cx_start.shape[0]) cov_sym_dict = {"cov": cov_sym} cov_sym_dict["cov"].cx_start = cov_sym - cov_matrix = controllers[-1].integrated_values["cov"].reshape_to_matrix(cov_sym_dict, controllers[-1].states.cx_start.shape[0], controllers[-1].states.cx_start.shape[0], Node.START, "cov") + cov_matrix = ( + controllers[-1] + .integrated_values["cov"] + .reshape_to_matrix( + cov_sym_dict, + controllers[-1].states.cx_start.shape[0], + controllers[-1].states.cx_start.shape[0], + Node.START, + "cov", + ) + ) hand_pos = controllers[0].model.markers(Q)[2][:2] hand_vel = controllers[0].model.marker_velocities(Q, Qdot)[2][:2] @@ -238,11 +276,16 @@ def reach_target_consistantly(controllers: list[PenaltyController]) -> cas.MX: out = cas.vertcat(pos_constraint[0, 0], pos_constraint[1, 1], vel_constraint[0, 0], vel_constraint[1, 1]) fun = cas.Function("reach_target_consistantly", [Q, Qdot, cov_sym], [out]) - val = fun(controllers[-1].states["q"].cx_start, controllers[-1].states["qdot"].cx_start, controllers[-1].integrated_values.cx_start) + val = fun( + controllers[-1].states["q"].cx_start, + controllers[-1].states["qdot"].cx_start, + controllers[-1].integrated_values.cx_start, + ) # Since the stochastic variables are defined with ns+1, the cx_start actually refers to the last node (when using node=Node.END) return val + def expected_feedback_effort(controllers: list[PenaltyController], wS_magnitude: cas.DM) -> cas.MX: """ ... @@ -260,27 +303,41 @@ def expected_feedback_effort(controllers: list[PenaltyController], wS_magnitude: cov_sym = cas.MX.sym("cov", controllers[0].integrated_values.cx_start.shape[0]) cov_sym_dict = {"cov": cov_sym} cov_sym_dict["cov"].cx_start = cov_sym - cov_matrix = controllers[0].integrated_values["cov"].reshape_to_matrix(cov_sym_dict, controllers[0].states.cx_start.shape[0], controllers[0].states.cx_start.shape[0], Node.START, "cov") + cov_matrix = ( + controllers[0] + .integrated_values["cov"] + .reshape_to_matrix( + cov_sym_dict, + controllers[0].states.cx_start.shape[0], + controllers[0].states.cx_start.shape[0], + Node.START, + "cov", + ) + ) k = controllers[0].stochastic_variables["k"].cx_start - K_matrix = cas.MX(n_q+n_qdot, n_tau) - for s0 in range(n_q+n_qdot): + K_matrix = cas.MX(n_q + n_qdot, n_tau) + for s0 in range(n_q + n_qdot): for s1 in range(n_tau): K_matrix[s0, s1] = k[s0 * n_tau + s1] K_matrix = K_matrix.T # Compute the expected effort hand_pos = controllers[0].model.markers(controllers[0].states["q"].cx_start)[2][:2] - hand_vel = controllers[0].model.marker_velocities(controllers[0].states["q"].cx_start, controllers[0].states["qdot"].cx_start)[2][:2] + hand_vel = controllers[0].model.marker_velocities( + controllers[0].states["q"].cx_start, controllers[0].states["qdot"].cx_start + )[2][:2] trace_k_sensor_k = cas.trace(K_matrix @ sensory_noise_matrix @ K_matrix.T) ee = cas.vertcat(hand_pos, hand_vel) e_fb = K_matrix @ ((ee - ee_ref) + wS_magnitude) jac_e_fb_x = cas.jacobian(e_fb, controllers[0].states.cx_start) trace_jac_p_jack = cas.trace(jac_e_fb_x @ cov_matrix @ jac_e_fb_x.T) expectedEffort_fb_mx = trace_jac_p_jack + trace_k_sensor_k - func = cas.Function('f_expectedEffort_fb', - [controllers[0].states.cx_start, controllers[0].stochastic_variables.cx_start, cov_sym], - [expectedEffort_fb_mx]) + func = cas.Function( + "f_expectedEffort_fb", + [controllers[0].states.cx_start, controllers[0].stochastic_variables.cx_start, cov_sym], + [expectedEffort_fb_mx], + ) f_expectedEffort_fb = 0 for i, ctrl in enumerate(controllers): @@ -291,40 +348,66 @@ def expected_feedback_effort(controllers: list[PenaltyController], wS_magnitude: return f_expectedEffort_fb -def zero_acceleration(controller: PenaltyController, wM: np.ndarray, wS: np.ndarray, force_field_magnitude:float) -> cas.MX: - dx = stochastic_forward_dynamics(controller.states.cx_start, controller.controls.cx_start, - controller.parameters.cx_start, controller.stochastic_variables.cx_start, - controller.get_nlp, wM, wS, force_field_magnitude=force_field_magnitude, with_gains=False) +def zero_acceleration( + controller: PenaltyController, wM: np.ndarray, wS: np.ndarray, force_field_magnitude: float +) -> cas.MX: + dx = stochastic_forward_dynamics( + controller.states.cx_start, + controller.controls.cx_start, + controller.parameters.cx_start, + controller.stochastic_variables.cx_start, + controller.get_nlp, + wM, + wS, + force_field_magnitude=force_field_magnitude, + with_gains=False, + ) return dx.dxdt[2:4] + def track_final_marker(controller: PenaltyController) -> cas.MX: q = controller.states["q"].cx_start ee_pos = controller.model.markers(q)[2][:2] return ee_pos -def leuven_trapezoidal(controllers: list[PenaltyController], force_field_magnitude) -> cas.MX: +def leuven_trapezoidal(controllers: list[PenaltyController], force_field_magnitude) -> cas.MX: n_q = controllers[0].model.nb_q n_qdot = controllers[0].model.nb_qdot n_tau = controllers[0].model.nb_tau wM = np.zeros((n_tau, 1)) - wS = np.zeros((n_q+n_qdot, 1)) + wS = np.zeros((n_q + n_qdot, 1)) dt = controllers[0].tf / controllers[0].ns - dyn = stochastic_forward_dynamics(controllers[0].states.cx_start, controllers[0].controls.cx_start, - controllers[0].parameters.cx_start, controllers[0].stochastic_variables.cx_start, - controllers[0].get_nlp, wM, wS, force_field_magnitude=force_field_magnitude, - with_gains=False) + dyn = stochastic_forward_dynamics( + controllers[0].states.cx_start, + controllers[0].controls.cx_start, + controllers[0].parameters.cx_start, + controllers[0].stochastic_variables.cx_start, + controllers[0].get_nlp, + wM, + wS, + force_field_magnitude=force_field_magnitude, + with_gains=False, + ) dX_i = dyn.dxdt if controllers[1].node_index != controllers[0].ns: - dX_i_plus = stochastic_forward_dynamics(controllers[1].states.cx_start, controllers[1].controls.cx_start, - controllers[1].parameters.cx_start, controllers[1].stochastic_variables.cx_start, - controllers[1].get_nlp, wM, wS, force_field_magnitude=force_field_magnitude, with_gains=False).dxdt + dX_i_plus = stochastic_forward_dynamics( + controllers[1].states.cx_start, + controllers[1].controls.cx_start, + controllers[1].parameters.cx_start, + controllers[1].stochastic_variables.cx_start, + controllers[1].get_nlp, + wM, + wS, + force_field_magnitude=force_field_magnitude, + with_gains=False, + ).dxdt continuity = controllers[1].states.cx_start - (controllers[0].states.cx_start + (dX_i + dX_i_plus) / 2 * dt) - continuity*=1e3 + continuity *= 1e3 else: continuity = 0 @@ -332,6 +415,7 @@ def leuven_trapezoidal(controllers: list[PenaltyController], force_field_magnitu return cas.vertcat(continuity, implicit_dynamics) + def prepare_socp( biorbd_model_path: str, final_time: float, @@ -380,32 +464,54 @@ def prepare_socp( # Add objective functions objective_functions = ObjectiveList() - objective_functions.add(ObjectiveFcn.Lagrange.MINIMIZE_CONTROL, node=Node.ALL_SHOOTING, key="tau", weight=1e3/2, quadratic=True) + objective_functions.add( + ObjectiveFcn.Lagrange.MINIMIZE_CONTROL, node=Node.ALL_SHOOTING, key="tau", weight=1e3 / 2, quadratic=True + ) multinode_objectives = MultinodeObjectiveList() - multinode_objectives.add(minimize_uncertainty, - nodes_phase=[0 for _ in range(n_shooting)], - nodes=[i for i in range(n_shooting)], - key="qddot", - weight=1e3 / 2, - quadratic=False) - multinode_objectives.add(expected_feedback_effort, - nodes_phase=[0 for _ in range(n_shooting)], - nodes=[i for i in range(n_shooting)], - wS_magnitude=wS_magnitude, - weight=1e3 / 2, - quadratic=False) + multinode_objectives.add( + minimize_uncertainty, + nodes_phase=[0 for _ in range(n_shooting)], + nodes=[i for i in range(n_shooting)], + key="qddot", + weight=1e3 / 2, + quadratic=False, + ) + multinode_objectives.add( + expected_feedback_effort, + nodes_phase=[0 for _ in range(n_shooting)], + nodes=[i for i in range(n_shooting)], + wS_magnitude=wS_magnitude, + weight=1e3 / 2, + quadratic=False, + ) # Constraints constraints = ConstraintList() constraints.add(ee_equals_ee_ref, node=Node.ALL_SHOOTING) - constraints.add(ConstraintFcn.TRACK_STATE, key="q", node=Node.START, target=np.array([shoulder_pos_initial, elbow_pos_initial])) + constraints.add( + ConstraintFcn.TRACK_STATE, key="q", node=Node.START, target=np.array([shoulder_pos_initial, elbow_pos_initial]) + ) constraints.add(ConstraintFcn.TRACK_STATE, key="qdot", node=Node.START, target=np.array([0, 0])) - constraints.add(zero_acceleration, node=Node.START, wM=np.zeros((n_tau, 1)), wS=np.zeros((n_q+n_qdot, 1)), force_field_magnitude=force_field_magnitude) + constraints.add( + zero_acceleration, + node=Node.START, + wM=np.zeros((n_tau, 1)), + wS=np.zeros((n_q + n_qdot, 1)), + force_field_magnitude=force_field_magnitude, + ) constraints.add(track_final_marker, node=Node.PENULTIMATE, target=ee_final_position) constraints.add(ConstraintFcn.TRACK_STATE, key="qdot", node=Node.PENULTIMATE, target=np.array([0, 0])) - constraints.add(zero_acceleration, node=Node.PENULTIMATE, wM=np.zeros((n_tau, 1)), wS=np.zeros((n_q+n_qdot, 1)), force_field_magnitude=force_field_magnitude) # Not possible sice the control on the last node is NaN - constraints.add(ConstraintFcn.TRACK_STATE, key="q", node=Node.ALL, min_bound=0, max_bound=180) # This is a bug, it should be in radians + constraints.add( + zero_acceleration, + node=Node.PENULTIMATE, + wM=np.zeros((n_tau, 1)), + wS=np.zeros((n_q + n_qdot, 1)), + force_field_magnitude=force_field_magnitude, + ) # Not possible sice the control on the last node is NaN + constraints.add( + ConstraintFcn.TRACK_STATE, key="q", node=Node.ALL, min_bound=0, max_bound=180 + ) # This is a bug, it should be in radians if problem_type == "BAR": max_bounds_lateral_variation = cas.inf @@ -415,34 +521,56 @@ def prepare_socp( raise NotImplementedError("Wrong problem type") multinode_constraints = MultinodeConstraintList() - multinode_constraints.add(reach_target_consistantly, - nodes_phase=[0 for _ in range(n_shooting)], - nodes=[i for i in range(n_shooting)], - min_bound=np.array([-cas.inf, -cas.inf, -cas.inf, -cas.inf]), - max_bound=np.array([max_bounds_lateral_variation**2, 0.004**2, 0.05**2, 0.05**2])) + multinode_constraints.add( + reach_target_consistantly, + nodes_phase=[0 for _ in range(n_shooting)], + nodes=[i for i in range(n_shooting)], + min_bound=np.array([-cas.inf, -cas.inf, -cas.inf, -cas.inf]), + max_bound=np.array([max_bounds_lateral_variation**2, 0.004**2, 0.05**2, 0.05**2]), + ) for i in range(n_shooting): - multinode_constraints.add(leuven_trapezoidal, - nodes_phase=[0, 0], - nodes=[i, i+1], - force_field_magnitude=force_field_magnitude) + multinode_constraints.add( + leuven_trapezoidal, nodes_phase=[0, 0], nodes=[i, i + 1], force_field_magnitude=force_field_magnitude + ) # Dynamics dynamics = DynamicsList() - dynamics.add(configure_stochastic_optimal_control_problem, - dynamic_function=lambda states, controls, parameters, stochastic_variables, nlp, wM, wS, - with_gains: stochastic_forward_dynamics(states, controls, parameters, - stochastic_variables, nlp, wM, wS, - force_field_magnitude=force_field_magnitude, - with_gains=with_gains), - wM=np.zeros((n_tau, 1)), wS=np.zeros((n_q+n_qdot, 1))) # expand=False - - states_min = np.ones((n_states, n_shooting+1)) * -cas.inf - states_max = np.ones((n_states, n_shooting+1)) * cas.inf + dynamics.add( + configure_stochastic_optimal_control_problem, + dynamic_function=lambda states, controls, parameters, stochastic_variables, nlp, wM, wS, with_gains: stochastic_forward_dynamics( + states, + controls, + parameters, + stochastic_variables, + nlp, + wM, + wS, + force_field_magnitude=force_field_magnitude, + with_gains=with_gains, + ), + wM=np.zeros((n_tau, 1)), + wS=np.zeros((n_q + n_qdot, 1)), + ) # expand=False + + states_min = np.ones((n_states, n_shooting + 1)) * -cas.inf + states_max = np.ones((n_states, n_shooting + 1)) * cas.inf x_bounds = BoundsList() - x_bounds.add("q", min_bound=states_min[:n_q, :], max_bound=states_max[:n_q, :], interpolation=InterpolationType.EACH_FRAME) - x_bounds.add("qdot", min_bound=states_min[n_q:n_q+n_qdot, :], max_bound=states_max[n_q:n_q+n_qdot, :], interpolation=InterpolationType.EACH_FRAME) - x_bounds.add("qddot", min_bound=states_min[n_q+n_qdot:n_q+n_qdot*2, :], max_bound=states_max[n_q+n_qdot:n_q+n_qdot*2, :], interpolation=InterpolationType.EACH_FRAME) + x_bounds.add( + "q", min_bound=states_min[:n_q, :], max_bound=states_max[:n_q, :], interpolation=InterpolationType.EACH_FRAME + ) + x_bounds.add( + "qdot", + min_bound=states_min[n_q : n_q + n_qdot, :], + max_bound=states_max[n_q : n_q + n_qdot, :], + interpolation=InterpolationType.EACH_FRAME, + ) + x_bounds.add( + "qddot", + min_bound=states_min[n_q + n_qdot : n_q + n_qdot * 2, :], + max_bound=states_max[n_q + n_qdot : n_q + n_qdot * 2, :], + interpolation=InterpolationType.EACH_FRAME, + ) controls_min = np.ones((n_controls, 3)) * -cas.inf controls_max = np.ones((n_controls, 3)) * cas.inf @@ -461,8 +589,12 @@ def prepare_socp( x_init = InitialGuessList() x_init.add("q", initial_guess=states_init[:n_q, :], interpolation=InterpolationType.EACH_FRAME) - x_init.add("qdot", initial_guess=states_init[n_q:n_q+n_qdot, :], interpolation=InterpolationType.EACH_FRAME) - x_init.add("qddot", initial_guess=states_init[n_q+n_qdot:n_q+n_qdot*2, :], interpolation=InterpolationType.EACH_FRAME) + x_init.add("qdot", initial_guess=states_init[n_q : n_q + n_qdot, :], interpolation=InterpolationType.EACH_FRAME) + x_init.add( + "qddot", + initial_guess=states_init[n_q + n_qdot : n_q + n_qdot * 2, :], + interpolation=InterpolationType.EACH_FRAME, + ) controls_init = np.ones((n_controls, n_shooting)) * 0.01 @@ -473,26 +605,56 @@ def prepare_socp( # TODO: This should probably be done automatically, not defined by the user s_init = InitialGuessList() s_bounds = BoundsList() - n_stochastic = n_tau*(n_q+n_qdot) + n_q+n_qdot + n_states*n_states # K(2x4) + ee_ref(4x1) + M(6x6) + n_stochastic = n_tau * (n_q + n_qdot) + n_q + n_qdot + n_states * n_states # K(2x4) + ee_ref(4x1) + M(6x6) stochastic_init = np.zeros((n_stochastic, n_shooting + 1)) stochastic_min = np.ones((n_stochastic, 3)) * -cas.inf stochastic_max = np.ones((n_stochastic, 3)) * cas.inf curent_index = 0 - stochastic_init[:n_tau*(n_q+n_qdot), :] = 0.01 # K - s_init.add("k", initial_guess=stochastic_init[:n_tau*(n_q+n_qdot), :], interpolation=InterpolationType.EACH_FRAME) - s_bounds.add("k", min_bound=stochastic_min[:n_tau*(n_q+n_qdot), :], max_bound=stochastic_max[:n_tau*(n_q+n_qdot), :]) - curent_index += n_tau*(n_q+n_qdot) - stochastic_init[curent_index: curent_index + n_q + n_qdot, :] = 0.01 # ee_ref + stochastic_init[: n_tau * (n_q + n_qdot), :] = 0.01 # K + s_init.add( + "k", initial_guess=stochastic_init[: n_tau * (n_q + n_qdot), :], interpolation=InterpolationType.EACH_FRAME + ) + s_bounds.add( + "k", + min_bound=stochastic_min[: n_tau * (n_q + n_qdot), :], + max_bound=stochastic_max[: n_tau * (n_q + n_qdot), :], + ) + curent_index += n_tau * (n_q + n_qdot) + stochastic_init[curent_index : curent_index + n_q + n_qdot, :] = 0.01 # ee_ref # stochastic_init[curent_index : curent_index + n_q+n_qdot, 0] = np.array([ee_initial_position[0], ee_initial_position[1], 0, 0]) # ee_ref # stochastic_init[curent_index : curent_index + n_q+n_qdot, 1] = np.array([ee_final_position[0], ee_final_position[1], 0, 0]) - s_init.add("ee_ref", initial_guess=stochastic_init[curent_index: curent_index + n_q + n_qdot, :], interpolation=InterpolationType.EACH_FRAME) - s_bounds.add("ee_ref", min_bound=stochastic_min[curent_index: curent_index + n_q + n_qdot, :], max_bound=stochastic_max[curent_index: curent_index + n_q + n_qdot, :]) + s_init.add( + "ee_ref", + initial_guess=stochastic_init[curent_index : curent_index + n_q + n_qdot, :], + interpolation=InterpolationType.EACH_FRAME, + ) + s_bounds.add( + "ee_ref", + min_bound=stochastic_min[curent_index : curent_index + n_q + n_qdot, :], + max_bound=stochastic_max[curent_index : curent_index + n_q + n_qdot, :], + ) curent_index += n_q + n_qdot - stochastic_init[curent_index: curent_index + n_states * n_states, :] = 0.01 # M - s_init.add("m", initial_guess=stochastic_init[curent_index: curent_index + n_states * n_states, :], interpolation=InterpolationType.EACH_FRAME) - s_bounds.add("m", min_bound=stochastic_min[curent_index: curent_index + n_states * n_states, :], max_bound=stochastic_max[curent_index: curent_index + n_states * n_states, :]) + stochastic_init[curent_index : curent_index + n_states * n_states, :] = 0.01 # M + s_init.add( + "m", + initial_guess=stochastic_init[curent_index : curent_index + n_states * n_states, :], + interpolation=InterpolationType.EACH_FRAME, + ) + s_bounds.add( + "m", + min_bound=stochastic_min[curent_index : curent_index + n_states * n_states, :], + max_bound=stochastic_max[curent_index : curent_index + n_states * n_states, :], + ) - integrated_value_functions = {"cov": lambda nlp, node_index: get_p_mat(nlp, node_index, force_field_magnitude=force_field_magnitude, wM_magnitude=wM_magnitude, wS_magnitude=wS_magnitude)} + integrated_value_functions = { + "cov": lambda nlp, node_index: get_p_mat( + nlp, + node_index, + force_field_magnitude=force_field_magnitude, + wM_magnitude=wM_magnitude, + wS_magnitude=wS_magnitude, + ) + } return StochasticOptimalControlProgram( bio_model, @@ -517,8 +679,8 @@ def prepare_socp( integrated_value_functions=integrated_value_functions, ) -def main(): +def main(): RUN_OPTIM_FLAG = True # False PLOT_SOL_FLAG = True VIZUALIZE_SOL_FLAG = True @@ -541,36 +703,37 @@ def main(): wPq_std = 3e-4 wPqdot_std = 0.0024 - wM_magnitude = cas.DM(np.array([wM_std ** 2 / dt, wM_std ** 2 / dt])) - wPq_magnitude = cas.DM(np.array([wPq_std ** 2 / dt, wPq_std ** 2 / dt])) - wPqdot_magnitude = cas.DM(np.array([wPqdot_std ** 2 / dt, wPqdot_std ** 2 / dt])) + wM_magnitude = cas.DM(np.array([wM_std**2 / dt, wM_std**2 / dt])) + wPq_magnitude = cas.DM(np.array([wPq_std**2 / dt, wPq_std**2 / dt])) + wPqdot_magnitude = cas.DM(np.array([wPqdot_std**2 / dt, wPqdot_std**2 / dt])) wS_magnitude = cas.vertcat(wPq_magnitude, wPqdot_magnitude) - # Solver parameters solver = Solver.IPOPT(show_online_optim=False) - solver.set_linear_solver('mumps') + solver.set_linear_solver("mumps") # solver.set_linear_solver('ma57') solver.set_tol(1e-3) solver.set_dual_inf_tol(3e-4) solver.set_constr_viol_tol(1e-7) # solver.set_maximum_iterations(10000) solver.set_maximum_iterations(4) - solver.set_hessian_approximation('limited-memory') + solver.set_hessian_approximation("limited-memory") solver.set_bound_frac(1e-8) solver.set_bound_push(1e-8) - solver.set_nlp_scaling_method('none') + solver.set_nlp_scaling_method("none") problem_type = "CIRCLE" force_field_magnitude = 0 - socp = prepare_socp(biorbd_model_path=biorbd_model_path, - final_time=final_time, - n_shooting=n_shooting, - ee_final_position=ee_final_position, - wM_magnitude=wM_magnitude, - wS_magnitude=wS_magnitude, - problem_type=problem_type, - force_field_magnitude=force_field_magnitude) + socp = prepare_socp( + biorbd_model_path=biorbd_model_path, + final_time=final_time, + n_shooting=n_shooting, + ee_final_position=ee_final_position, + wM_magnitude=wM_magnitude, + wS_magnitude=wS_magnitude, + problem_type=problem_type, + force_field_magnitude=force_field_magnitude, + ) if RUN_OPTIM_FLAG: sol_socp = socp.solve(solver) @@ -589,18 +752,20 @@ def main(): for i in range(n_shooting): for j in range(6): for k in range(6): - cov_sol[j, k, i] = cov_sol_vect[j*6 + k, i] + cov_sol[j, k, i] = cov_sol_vect[j * 6 + k, i] stochastic_variables_sol = np.vstack((k_sol, ee_ref_sol, m_sol)) - data = {"q_sol": q_sol, - "qdot_sol": qdot_sol, - "qddot_sol": qddot_sol, - "qdddot_sol": qdddot_sol, - "tau_sol": tau_sol, - "k_sol": k_sol, - "ee_ref_sol": ee_ref_sol, - "m_sol": m_sol, - "cov_sol": cov_sol, - "stochastic_variables_sol": stochastic_variables_sol} + data = { + "q_sol": q_sol, + "qdot_sol": qdot_sol, + "qddot_sol": qddot_sol, + "qdddot_sol": qdddot_sol, + "tau_sol": tau_sol, + "k_sol": k_sol, + "ee_ref_sol": ee_ref_sol, + "m_sol": m_sol, + "cov_sol": cov_sol, + "stochastic_variables_sol": stochastic_variables_sol, + } # --- Save the results --- # with open(f"leuvenarm_torque_driven_socp_{problem_type}_forcefield{force_field_magnitude}.pkl", "wb") as file: @@ -621,16 +786,16 @@ def main(): if VIZUALIZE_SOL_FLAG: import bioviz + b = bioviz.Viz(model_path=biorbd_model_path) b.load_movement(q_sol[:, :-1]) b.exec() - # --- Plot the results --- # if PLOT_SOL_FLAG: model = biorbd.Model(biorbd_model_path) - Q_sym = cas.MX.sym('Q', 2, 1) - Qdot_sym = cas.MX.sym('Qdot', 2, 1) + Q_sym = cas.MX.sym("Q", 2, 1) + Qdot_sym = cas.MX.sym("Qdot", 2, 1) hand_pos_fcn = cas.Function("hand_pos", [Q_sym], [model.markers(Q_sym)[2].to_mx()]) hand_vel_fcn = cas.Function("hand_vel", [Q_sym, Qdot_sym], [model.markersVelocity(Q_sym, Qdot_sym)[2].to_mx()]) @@ -639,10 +804,22 @@ def main(): parameters = socp.nlp[0].parameters.cx_start stochastic_variables = socp.nlp[0].stochastic_variables.cx_start nlp = socp.nlp[0] - wM_sym = cas.MX.sym('wM', 2, 1) - wS_sym = cas.MX.sym('wS', 4, 1) - out = stochastic_forward_dynamics(states, controls, parameters, stochastic_variables, nlp, wM_sym, wS_sym, force_field_magnitude=force_field_magnitude, with_gains=True) - dyn_fun = cas.Function("dyn_fun", [states, controls, parameters, stochastic_variables, wM_sym, wS_sym], [out.dxdt]) + wM_sym = cas.MX.sym("wM", 2, 1) + wS_sym = cas.MX.sym("wS", 4, 1) + out = stochastic_forward_dynamics( + states, + controls, + parameters, + stochastic_variables, + nlp, + wM_sym, + wS_sym, + force_field_magnitude=force_field_magnitude, + with_gains=True, + ) + dyn_fun = cas.Function( + "dyn_fun", [states, controls, parameters, stochastic_variables, wM_sym, wS_sym], [out.dxdt] + ) fig, axs = plt.subplots(3, 2) n_simulations = 30 @@ -660,22 +837,34 @@ def main(): qdot_simulated[i_simulation, :, 0] = qdot_sol[:, 0] qddot_simulated[i_simulation, :, 0] = qddot_sol[:, 0] for i_node in range(n_shooting): - x_prev = cas.vertcat(q_simulated[i_simulation, :, i_node], qdot_simulated[i_simulation, :, i_node], qddot_simulated[i_simulation, :, i_node]) + x_prev = cas.vertcat( + q_simulated[i_simulation, :, i_node], + qdot_simulated[i_simulation, :, i_node], + qddot_simulated[i_simulation, :, i_node], + ) hand_pos_simulated[i_simulation, :, i_node] = np.reshape(hand_pos_fcn(x_prev[:2])[:2], (2,)) - hand_vel_simulated[i_simulation, :, i_node] = np.reshape(hand_vel_fcn(x_prev[:2], x_prev[2:4])[:2], (2,)) + hand_vel_simulated[i_simulation, :, i_node] = np.reshape( + hand_vel_fcn(x_prev[:2], x_prev[2:4])[:2], (2,) + ) u = cas.vertcat(qdddot_sol[:, i_node], tau_sol[:, i_node]) s = stochastic_variables_sol[:, i_node] k1 = dyn_fun(x_prev, u, [], s, wM[:, i_node], wS[:, i_node]) x_next = x_prev + dt * dyn_fun(x_prev + dt / 2 * k1, u, [], s, wM[:, i_node], wS[:, i_node]) - q_simulated[i_simulation, :, i_node + 1] = np.reshape(x_next[:2], (2, )) - qdot_simulated[i_simulation, :, i_node + 1] = np.reshape(x_next[2:4], (2, )) - qddot_simulated[i_simulation, :, i_node + 1] = np.reshape(x_next[4:], (2, )) + q_simulated[i_simulation, :, i_node + 1] = np.reshape(x_next[:2], (2,)) + qdot_simulated[i_simulation, :, i_node + 1] = np.reshape(x_next[2:4], (2,)) + qddot_simulated[i_simulation, :, i_node + 1] = np.reshape(x_next[4:], (2,)) hand_pos_simulated[i_simulation, :, i_node + 1] = np.reshape(hand_pos_fcn(x_next[:2])[:2], (2,)) - hand_vel_simulated[i_simulation, :, i_node + 1] = np.reshape(hand_vel_fcn(x_next[:2], x_next[2:4])[:2], (2, )) - axs[0, 0].plot(hand_pos_simulated[i_simulation, 0, :], hand_pos_simulated[i_simulation, 1, :], color="tab:red") + hand_vel_simulated[i_simulation, :, i_node + 1] = np.reshape( + hand_vel_fcn(x_next[:2], x_next[2:4])[:2], (2,) + ) + axs[0, 0].plot( + hand_pos_simulated[i_simulation, 0, :], hand_pos_simulated[i_simulation, 1, :], color="tab:red" + ) axs[1, 0].plot(np.linspace(0, final_time, n_shooting + 1), q_simulated[i_simulation, 0, :], color="k") axs[2, 0].plot(np.linspace(0, final_time, n_shooting + 1), q_simulated[i_simulation, 1, :], color="k") - axs[0, 1].plot(hand_vel_simulated[i_simulation, 0, :], hand_vel_simulated[i_simulation, 1, :], color="tab:red") + axs[0, 1].plot( + hand_vel_simulated[i_simulation, 0, :], hand_vel_simulated[i_simulation, 1, :], color="tab:red" + ) axs[1, 1].plot(np.linspace(0, final_time, n_shooting + 1), qdot_simulated[i_simulation, 0, :], color="k") axs[2, 1].plot(np.linspace(0, final_time, n_shooting + 1), qdot_simulated[i_simulation, 1, :], color="k") hand_pos_without_noise = np.zeros((2, n_shooting + 1)) @@ -705,5 +894,6 @@ def main(): # TODO: integrate to see the error they commit with the trapezoidal + if __name__ == "__main__": main() diff --git a/bioptim/examples/torque_driven_ocp/spring_load.py b/bioptim/examples/torque_driven_ocp/spring_load.py index 48c4b3c82..3c0f843d0 100644 --- a/bioptim/examples/torque_driven_ocp/spring_load.py +++ b/bioptim/examples/torque_driven_ocp/spring_load.py @@ -23,7 +23,9 @@ ) -def custom_dynamic(states: MX, controls: MX, parameters: MX, stochastic_variables: MX, nlp: NonLinearProgram) -> DynamicsEvaluation: +def custom_dynamic( + states: MX, controls: MX, parameters: MX, stochastic_variables: MX, nlp: NonLinearProgram +) -> DynamicsEvaluation: """ The dynamics of the system using an external force (see custom_dynamics for more explanation) diff --git a/bioptim/gui/check_conditioning.py b/bioptim/gui/check_conditioning.py index 139bc8db9..a54b0df0d 100644 --- a/bioptim/gui/check_conditioning.py +++ b/bioptim/gui/check_conditioning.py @@ -79,8 +79,10 @@ def jacobian_hessian_constraints(): list_constraints.append( jacobian( constraints.function[constraints.node_idx[0]]( - nlp.states.cx_start, nlp.controls.cx_start, nlp.parameters.cx, - nlp.stochastic_variables.cx_start + nlp.states.cx_start, + nlp.controls.cx_start, + nlp.parameters.cx, + nlp.stochastic_variables.cx_start, )[axis], vertcat_obj, ) @@ -124,7 +126,9 @@ def jacobian_hessian_constraints(): nlp.s_init[key].check_and_adjust_dimensions(len(nlp.stochastic_variables[key]), nlp.ns) for node_index in range(nlp.ns): nlp.stochastic_variables.node_index = node_index - s_init[node_index, nlp.stochastic_variables[key].index] = np.array(nlp.s_init[key].init.evaluate_at(node_index)) + s_init[node_index, nlp.stochastic_variables[key].index] = np.array( + nlp.s_init[key].init.evaluate_at(node_index) + ) x_init = x_init.reshape((x_init.size, 1)) u_init = u_init.reshape((u_init.size, 1)) @@ -424,7 +428,9 @@ def hessian_objective(): nlp.s_init[key].check_and_adjust_dimensions(len(nlp.stochastic_variables[key]), nlp.ns) for node_index in range(nlp.ns): nlp.stochastic_variables.node_index = node_index - s_init[node_index, nlp.stochastic_variables[key].index] = np.array(nlp.s_init[key].init.evaluate_at(node_index)) + s_init[node_index, nlp.stochastic_variables[key].index] = np.array( + nlp.s_init[key].init.evaluate_at(node_index) + ) x_init = x_init.reshape((x_init.size, 1)) u_init = u_init.reshape((u_init.size, 1)) diff --git a/bioptim/gui/plot.py b/bioptim/gui/plot.py index 438f8f57e..de35483ff 100644 --- a/bioptim/gui/plot.py +++ b/bioptim/gui/plot.py @@ -748,7 +748,7 @@ def update_data(self, v: dict): state[:, step_size * idx : step_size * (idx + 1) + x_mod], control[:, idx : idx + u_mod + 1], data_params_in_dyn, - stochastic[:, idx: idx + 1 + 1], + stochastic[:, idx : idx + 1 + 1], **self.plot_func[key][i].parameters, ) @@ -878,7 +878,7 @@ def update_data(self, v: dict): control_tp = control[:, node_idx : node_idx + 1 + u_mod] if np.isnan(control_tp).any(): control_tp = np.array(()) - stochastic_tp = stochastic[:, node_idx: node_idx + 1 + 1] + stochastic_tp = stochastic[:, node_idx : node_idx + 1 + 1] val = self.plot_func[key][i].function( node_idx, states, @@ -902,7 +902,7 @@ def update_data(self, v: dict): state[:, node_idx * step_size : (node_idx + 1) * step_size + 1 : step_size], control[:, node_idx : node_idx + 1 + 1], data_params_in_dyn, - stochastic[:, node_idx: node_idx + 1 + 1], + stochastic[:, node_idx : node_idx + 1 + 1], **self.plot_func[key][i].parameters, ) for ctr, axe_index in enumerate(self.plot_func[key][i].phase_mappings.to_first.map_idx): diff --git a/bioptim/interfaces/biomodel.py b/bioptim/interfaces/biomodel.py index e7d4dcf48..2f87f4c2c 100644 --- a/bioptim/interfaces/biomodel.py +++ b/bioptim/interfaces/biomodel.py @@ -11,6 +11,7 @@ class BioModel(Protocol): bioptim. As a reminder for developers: only necessary attributes and methods should appear here. """ + def copy(self): """copy the model by reloading one""" diff --git a/bioptim/limits/constraints.py b/bioptim/limits/constraints.py index 7ee9fcf2f..d828524b9 100644 --- a/bioptim/limits/constraints.py +++ b/bioptim/limits/constraints.py @@ -244,7 +244,10 @@ def non_slipping( constraint.max_bound = np.array([np.inf, np.inf]) contact = controller.get_nlp.contact_forces_func( - controller.states.cx_start, controller.controls.cx_start, controller.parameters.cx, controller.stochastic_variables.cx_start + controller.states.cx_start, + controller.controls.cx_start, + controller.parameters.cx, + controller.stochastic_variables.cx_start, ) normal_contact_force_squared = sum1(contact[normal_component_idx, 0]) ** 2 if len(tangential_component_idx) == 1: diff --git a/bioptim/limits/multinode_penalty.py b/bioptim/limits/multinode_penalty.py index ffe4e91ff..917d86f4c 100644 --- a/bioptim/limits/multinode_penalty.py +++ b/bioptim/limits/multinode_penalty.py @@ -305,7 +305,14 @@ def get_time_parameter_idx(controller: PenaltyController, i_phase): return out @staticmethod - def m_equals_inverse_of_dg_dz(penalty, controllers: list[PenaltyController, PenaltyController], dynamics: Callable, wM_magnitude: DM, wS_magnitude: DM, **unused_param): + def m_equals_inverse_of_dg_dz( + penalty, + controllers: list[PenaltyController, PenaltyController], + dynamics: Callable, + wM_magnitude: DM, + wS_magnitude: DM, + **unused_param, + ): """ ... """ @@ -318,25 +325,44 @@ def m_equals_inverse_of_dg_dz(penalty, controllers: list[PenaltyController, Pena wS = MX.sym("wS", wS_magnitude.shape[0], 1) nx = controllers[0].states.cx.shape[0] - M_matrix = controllers[0].stochastic_variables["m"].reshape_to_matrix(controllers[0].stochastic_variables, nx, nx, Node.START, "m") - - dx = dynamics(controllers[0].states.cx_start, controllers[0].controls.cx_start, - controllers[0].parameters.cx_start, controllers[0].stochastic_variables.cx_start, - controllers[0].get_nlp, wM, wS, - with_gains=True) - - DdZ_DX_fun = Function("DdZ_DX_fun", [controllers[0].states.cx_start, - controllers[0].controls.cx_start, - controllers[0].parameters.cx_start, - controllers[0].stochastic_variables.cx_start, - wM, wS], - [jacobian(dx.dxdt, controllers[0].states.cx_start)]) - - DdZ_DX = DdZ_DX_fun(controllers[1].states.cx_start, - controllers[1].controls.cx_start, - controllers[1].parameters.cx_start, - controllers[1].stochastic_variables.cx_start, - wM_magnitude, wS_magnitude) + M_matrix = ( + controllers[0] + .stochastic_variables["m"] + .reshape_to_matrix(controllers[0].stochastic_variables, nx, nx, Node.START, "m") + ) + + dx = dynamics( + controllers[0].states.cx_start, + controllers[0].controls.cx_start, + controllers[0].parameters.cx_start, + controllers[0].stochastic_variables.cx_start, + controllers[0].get_nlp, + wM, + wS, + with_gains=True, + ) + + DdZ_DX_fun = Function( + "DdZ_DX_fun", + [ + controllers[0].states.cx_start, + controllers[0].controls.cx_start, + controllers[0].parameters.cx_start, + controllers[0].stochastic_variables.cx_start, + wM, + wS, + ], + [jacobian(dx.dxdt, controllers[0].states.cx_start)], + ) + + DdZ_DX = DdZ_DX_fun( + controllers[1].states.cx_start, + controllers[1].controls.cx_start, + controllers[1].parameters.cx_start, + controllers[1].stochastic_variables.cx_start, + wM_magnitude, + wS_magnitude, + ) DG_DZ = MX_eye(DdZ_DX.shape[0]) - DdZ_DX * dt / 2 diff --git a/bioptim/limits/penalty.py b/bioptim/limits/penalty.py index d24edf09a..dbe52e15b 100644 --- a/bioptim/limits/penalty.py +++ b/bioptim/limits/penalty.py @@ -657,7 +657,10 @@ def minimize_contact_forces( penalty.quadratic = True if penalty.quadratic is None else penalty.quadratic contact_force = controller.get_nlp.contact_forces_func( - controller.states.cx_start, controller.controls.cx_start, controller.parameters.cx, controller.stochastic_variables.cx_start + controller.states.cx_start, + controller.controls.cx_start, + controller.parameters.cx, + controller.stochastic_variables.cx_start, ) return contact_force @@ -997,18 +1000,27 @@ def continuity(penalty: PenaltyOption, controller: PenaltyController | list): return continuity @staticmethod - def covariance_matrix_continuity_implicit(penalty: PenaltyOption, controller: PenaltyController, wM_magnitude: DM, wS_magnitude: DM): - + def covariance_matrix_continuity_implicit( + penalty: PenaltyOption, controller: PenaltyController, wM_magnitude: DM, wS_magnitude: DM + ): nx = controller.states.cx_start.shape[0] - P_matrix = controller.integrated_values["cov"].reshape_to_matrix(controller.stochastic_variables, nx, nx, Node.START, "cov") - A_matrix = controller.stochastic_variables["a"].reshape_to_matrix(controller.stochastic_variables, nx, nx, Node.START, "a") - C_matrix = controller.stochastic_variables["c"].reshape_to_matrix(controller.stochastic_variables, nx, nx, Node.START, "c") - M_matrix = controller.stochastic_variables["m"].reshape_to_matrix(controller.stochastic_variables, nx, nx, Node.START, "m") + P_matrix = controller.integrated_values["cov"].reshape_to_matrix( + controller.stochastic_variables, nx, nx, Node.START, "cov" + ) + A_matrix = controller.stochastic_variables["a"].reshape_to_matrix( + controller.stochastic_variables, nx, nx, Node.START, "a" + ) + C_matrix = controller.stochastic_variables["c"].reshape_to_matrix( + controller.stochastic_variables, nx, nx, Node.START, "c" + ) + M_matrix = controller.stochastic_variables["m"].reshape_to_matrix( + controller.stochastic_variables, nx, nx, Node.START, "m" + ) sigma_w = vertcat(wS_magnitude, wM_magnitude) dt = 1 / controller.ns - dg_dw = - dt * C_matrix - dg_dx = - MX_eye(A_matrix.shape[0]) - dt / 2 * A_matrix + dg_dw = -dt * C_matrix + dg_dx = -MX_eye(A_matrix.shape[0]) - dt / 2 * A_matrix p_next = M_matrix @ (dg_dx @ P_matrix @ dg_dx.T + dg_dw @ sigma_w @ dg_dw.T) @ M_matrix.T p_implicit_deffect = p_next - P_matrix diff --git a/bioptim/limits/penalty_option.py b/bioptim/limits/penalty_option.py index 33adfbede..f7e0a6f32 100644 --- a/bioptim/limits/penalty_option.py +++ b/bioptim/limits/penalty_option.py @@ -478,8 +478,7 @@ def get_u(u: MX | SX, dt: MX | SX): # Do not use nlp.add_casadi_func because all functions must be registered sub_fcn = fcn[self.rows, self.cols] self.function[node] = controller.to_casadi_func( - name, sub_fcn, state_cx_scaled, control_cx_scaled, param_cx, stochastic_cx_scaled, - expand=self.expand + name, sub_fcn, state_cx_scaled, control_cx_scaled, param_cx, stochastic_cx_scaled, expand=self.expand ) self.function_non_threaded[node] = self.function[node] @@ -489,8 +488,18 @@ def get_u(u: MX | SX, dt: MX | SX): self.function[node] = biorbd.to_casadi_func( f"{name}", # TODO: Charbie -> this is Flase, add stochastic_variables for start, mid AND end - self.function[node](controller.states_scaled.cx_end, controller.controls_scaled.cx_end, param_cx, controller.stochastic_variables.cx_start) - - self.function[node](controller.states_scaled.cx_start, controller.controls_scaled.cx_start, param_cx, controller.stochastic_variables.cx_start), + self.function[node]( + controller.states_scaled.cx_end, + controller.controls_scaled.cx_end, + param_cx, + controller.stochastic_variables.cx_start, + ) + - self.function[node]( + controller.states_scaled.cx_start, + controller.controls_scaled.cx_start, + param_cx, + controller.stochastic_variables.cx_start, + ), state_cx_scaled, control_cx_scaled, param_cx, @@ -556,12 +565,18 @@ def get_u(u: MX | SX, dt: MX | SX): ( ( self.function[node]( - controller.states_scaled.cx_start, controller.controls_scaled.cx_start, param_cx, controller.stochastic_variables.cx_start + controller.states_scaled.cx_start, + controller.controls_scaled.cx_start, + param_cx, + controller.stochastic_variables.cx_start, ) - target_cx[:, 0] ) ** exponent - + (self.function[node](state_cx_end_scaled, control_cx_end_scaled, param_cx, stochastic_cx_scaled) - target_cx[:, 1]) + + ( + self.function[node](state_cx_end_scaled, control_cx_end_scaled, param_cx, stochastic_cx_scaled) + - target_cx[:, 1] + ) ** exponent ) / 2, @@ -572,16 +587,22 @@ def get_u(u: MX | SX, dt: MX | SX): target_cx, dt_cx, ) - modified_fcn = modified_function(state_cx_scaled, control_cx_scaled, param_cx, stochastic_cx_scaled, target_cx, dt_cx) + modified_fcn = modified_function( + state_cx_scaled, control_cx_scaled, param_cx, stochastic_cx_scaled, target_cx, dt_cx + ) else: - modified_fcn = (self.function[node](state_cx_scaled, control_cx_scaled, param_cx, stochastic_cx_scaled) - target_cx) ** exponent + modified_fcn = ( + self.function[node](state_cx_scaled, control_cx_scaled, param_cx, stochastic_cx_scaled) - target_cx + ) ** exponent # for the future bioptim adventurer: here lies the reason that a constraint must have weight = 0. modified_fcn = weight_cx * modified_fcn * dt_cx if self.weight else modified_fcn * dt_cx # Do not use nlp.add_casadi_func because all of them must be registered self.weighted_function[node] = Function( - name, [state_cx_scaled, control_cx_scaled, param_cx, stochastic_cx_scaled, weight_cx, target_cx, dt_cx], [modified_fcn] + name, + [state_cx_scaled, control_cx_scaled, param_cx, stochastic_cx_scaled, weight_cx, target_cx, dt_cx], + [modified_fcn], ) self.weighted_function_non_threaded[node] = self.weighted_function[node] diff --git a/bioptim/optimization/optimal_control_program.py b/bioptim/optimization/optimal_control_program.py index a81264056..61c23a8a6 100644 --- a/bioptim/optimization/optimal_control_program.py +++ b/bioptim/optimization/optimal_control_program.py @@ -254,84 +254,96 @@ def __init__( bio_model = self.initialize_model(bio_model) - self.set_original_values(bio_model, - dynamics, - n_shooting, - phase_time, - x_init, - u_init, - s_init, - x_bounds, - u_bounds, - s_bounds, - x_scaling, - xdot_scaling, - u_scaling, - external_forces, - ode_solver, - control_type, - variable_mappings, - time_phase_mapping, - node_mappings, - plot_mappings, - phase_transitions, - multinode_constraints, - multinode_objectives, - parameter_bounds, - parameter_init, - parameter_constraints, - parameter_objectives, - state_continuity_weight, - n_threads, - use_sx, - assume_phase_dynamics, - integrated_value_functions,) - - constraints, objective_functions, parameter_constraints, parameter_objectives, multinode_constraints, multinode_objectives = self.check_arguments_and_build_nlp( - dynamics, - n_threads, - n_shooting, - phase_time, - x_bounds, - u_bounds, - s_bounds, - x_init, - u_init, - s_init, - x_scaling, - xdot_scaling, - u_scaling, - objective_functions, - constraints, - parameters, - phase_transitions, - multinode_constraints, - multinode_objectives, - parameter_bounds, - parameter_init, - parameter_constraints, - parameter_objectives, - ode_solver, - use_sx, - assume_phase_dynamics, - bio_model, - external_forces, - plot_mappings, - time_phase_mapping, - control_type, - variable_mappings, - integrated_value_functions, - node_mappings, - state_continuity_weight) + self.set_original_values( + bio_model, + dynamics, + n_shooting, + phase_time, + x_init, + u_init, + s_init, + x_bounds, + u_bounds, + s_bounds, + x_scaling, + xdot_scaling, + u_scaling, + external_forces, + ode_solver, + control_type, + variable_mappings, + time_phase_mapping, + node_mappings, + plot_mappings, + phase_transitions, + multinode_constraints, + multinode_objectives, + parameter_bounds, + parameter_init, + parameter_constraints, + parameter_objectives, + state_continuity_weight, + n_threads, + use_sx, + assume_phase_dynamics, + integrated_value_functions, + ) + + ( + constraints, + objective_functions, + parameter_constraints, + parameter_objectives, + multinode_constraints, + multinode_objectives, + ) = self.check_arguments_and_build_nlp( + dynamics, + n_threads, + n_shooting, + phase_time, + x_bounds, + u_bounds, + s_bounds, + x_init, + u_init, + s_init, + x_scaling, + xdot_scaling, + u_scaling, + objective_functions, + constraints, + parameters, + phase_transitions, + multinode_constraints, + multinode_objectives, + parameter_bounds, + parameter_init, + parameter_constraints, + parameter_objectives, + ode_solver, + use_sx, + assume_phase_dynamics, + bio_model, + external_forces, + plot_mappings, + time_phase_mapping, + control_type, + variable_mappings, + integrated_value_functions, + node_mappings, + state_continuity_weight, + ) self._declare_multi_node_penalties(multinode_constraints, multinode_objectives) - self.finalize_penalties(skip_continuity, - state_continuity_weight, - constraints, - parameter_constraints, - objective_functions, - parameter_objectives) + self.finalize_penalties( + skip_continuity, + state_continuity_weight, + constraints, + parameter_constraints, + objective_functions, + parameter_objectives, + ) def check_bioptim_version(self): self.version = {"casadi": casadi.__version__, "biorbd": biorbd.__version__, "bioptim": __version__} @@ -344,41 +356,41 @@ def initialize_model(self, bio_model): self.n_phases = len(bio_model) return bio_model - def set_original_values(self, - bio_model, - dynamics, - n_shooting, - phase_time, - x_init, - u_init, - s_init, - x_bounds, - u_bounds, - s_bounds, - x_scaling, - xdot_scaling, - u_scaling, - external_forces, - ode_solver, - control_type, - variable_mappings, - time_phase_mapping, - node_mappings, - plot_mappings, - phase_transitions, - multinode_constraints, - multinode_objectives, - parameter_bounds, - parameter_init, - parameter_constraints, - parameter_objectives, - state_continuity_weight, - n_threads, - use_sx, - assume_phase_dynamics, - integrated_value_functions, - ): - + def set_original_values( + self, + bio_model, + dynamics, + n_shooting, + phase_time, + x_init, + u_init, + s_init, + x_bounds, + u_bounds, + s_bounds, + x_scaling, + xdot_scaling, + u_scaling, + external_forces, + ode_solver, + control_type, + variable_mappings, + time_phase_mapping, + node_mappings, + plot_mappings, + phase_transitions, + multinode_constraints, + multinode_objectives, + parameter_bounds, + parameter_init, + parameter_constraints, + parameter_objectives, + state_continuity_weight, + n_threads, + use_sx, + assume_phase_dynamics, + integrated_value_functions, + ): # Placed here because of MHE if isinstance(dynamics, Dynamics): dynamics_type_tp = DynamicsList() @@ -426,43 +438,44 @@ def set_original_values(self, } return - def check_arguments_and_build_nlp(self, - dynamics, - n_threads, - n_shooting, - phase_time, - x_bounds, - u_bounds, - s_bounds, - x_init, - u_init, - s_init, - x_scaling, - xdot_scaling, - u_scaling, - objective_functions, - constraints, - parameters, - phase_transitions, - multinode_constraints, - multinode_objectives, - parameter_bounds, - parameter_init, - parameter_constraints, - parameter_objectives, - ode_solver, - use_sx, - assume_phase_dynamics, - bio_model, - external_forces, - plot_mappings, - time_phase_mapping, - control_type, - variable_mappings, - integrated_value_functions, - node_mappings, - state_continuity_weight): - + def check_arguments_and_build_nlp( + self, + dynamics, + n_threads, + n_shooting, + phase_time, + x_bounds, + u_bounds, + s_bounds, + x_init, + u_init, + s_init, + x_scaling, + xdot_scaling, + u_scaling, + objective_functions, + constraints, + parameters, + phase_transitions, + multinode_constraints, + multinode_objectives, + parameter_bounds, + parameter_init, + parameter_constraints, + parameter_objectives, + ode_solver, + use_sx, + assume_phase_dynamics, + bio_model, + external_forces, + plot_mappings, + time_phase_mapping, + control_type, + variable_mappings, + integrated_value_functions, + node_mappings, + state_continuity_weight, + ): if not isinstance(n_threads, int) or isinstance(n_threads, bool) or n_threads < 1: raise RuntimeError("n_threads should be a positive integer greater or equal than 1") @@ -470,8 +483,7 @@ def check_arguments_and_build_nlp(self, if not isinstance(ns, int) or ns < 2: if isinstance(ns, (tuple, list)): if sum([True for i in ns if not isinstance(i, int) and not isinstance(i, bool)]) != 0: - raise RuntimeError( - "n_shooting should be a positive integer (or a list of) greater or equal than 2") + raise RuntimeError("n_shooting should be a positive integer (or a list of) greater or equal than 2") else: raise RuntimeError("n_shooting should be a positive integer (or a list of) greater or equal than 2") @@ -661,8 +673,7 @@ def check_arguments_and_build_nlp(self, self.time_phase_mapping = time_phase_mapping # Add any time related parameters to the parameters list before declaring it - self._define_time(phase_time, objective_functions, constraints, parameters, parameter_init, - parameter_bounds) + self._define_time(phase_time, objective_functions, constraints, parameters, parameter_init, parameter_bounds) # Declare and fill the parameters self.parameters = ParameterList() @@ -719,16 +730,24 @@ def check_arguments_and_build_nlp(self, # otherwise they will erase the phase_transitions) self.phase_transitions = phase_transitions.prepare_phase_transitions(self, state_continuity_weight) - return constraints, objective_functions, parameter_constraints, parameter_objectives, multinode_constraints, multinode_objectives - - def finalize_penalties(self, - skip_continuity, - state_continuity_weight, - constraints, - parameter_constraints, - objective_functions, - parameter_objectives): + return ( + constraints, + objective_functions, + parameter_constraints, + parameter_objectives, + multinode_constraints, + multinode_objectives, + ) + def finalize_penalties( + self, + skip_continuity, + state_continuity_weight, + constraints, + parameter_constraints, + objective_functions, + parameter_objectives, + ): # Skipping creates an OCP without built-in continuity constraints, make sure you declared constraints elsewhere if not skip_continuity: self._declare_continuity(state_continuity_weight) @@ -1067,7 +1086,11 @@ def _declare_parameters(self, new_parameters: ParameterList): offset += param.size def update_bounds( - self, x_bounds: BoundsList = None, u_bounds: BoundsList = None, parameter_bounds: BoundsList = None, s_bounds: BoundsList = None + self, + x_bounds: BoundsList = None, + u_bounds: BoundsList = None, + parameter_bounds: BoundsList = None, + s_bounds: BoundsList = None, ): """ The main user interface to add bounds in the ocp @@ -1358,7 +1381,9 @@ def compute_penalty_values(t, x, u, p, s, penalty, dt: int | Callable): or penalty.integration_rule == QuadratureRule.TRAPEZOIDAL ): out = [ - penalty.weighted_function_non_threaded[t](x[:, [i, i + 1]], u[:, i], p, s, penalty.weight, _target, dt) + penalty.weighted_function_non_threaded[t]( + x[:, [i, i + 1]], u[:, i], p, s, penalty.weight, _target, dt + ) for i in range(x.shape[1] - 1) ] else: diff --git a/bioptim/optimization/optimization_variable.py b/bioptim/optimization/optimization_variable.py index 5358e5005..c3fe8d63b 100644 --- a/bioptim/optimization/optimization_variable.py +++ b/bioptim/optimization/optimization_variable.py @@ -136,7 +136,6 @@ def cx_end(self): ) return self.parent_list.cx_end[self.index, :] - def reshape_to_vector(self, matrix): """ Restore the vector form of the matrix @@ -149,7 +148,6 @@ def reshape_to_vector(self, matrix): vector[shape_0 * s0 + s1] = matrix[s0, s1] return vector - def reshape_to_matrix(self, variable, shape_0, shape_1, node: Node, key: str): """ Restore the matrix form of the variables @@ -165,10 +163,13 @@ def reshape_to_matrix(self, variable, shape_0, shape_1, node: Node, key: str): elif node == Node.END: matrix[s0, s1] = variable[key].cx_end[i] else: - raise RuntimeError("Node must be a Node.START for cx_start, Node.MID for cx_mid, or Node.END for cx_end") + raise RuntimeError( + "Node must be a Node.START for cx_start, Node.MID for cx_mid, or Node.END for cx_end" + ) i += 1 return matrix + class OptimizationVariableList: """ A list of OptimizationVariable @@ -675,7 +676,6 @@ def __next__(self): raise StopIteration return self.unscaled[self._iter_idx - 1].name - def reshape_to_vector(self, matrix): """ Restore the vector form of the matrix @@ -688,7 +688,6 @@ def reshape_to_vector(self, matrix): vector[shape_0 * s0 + s1] = matrix[s0, s1] return vector - def reshape_to_matrix(self, variable, shape_0, shape_1, node: Node, key: str): """ Restore the matrix form of the variables @@ -704,6 +703,8 @@ def reshape_to_matrix(self, variable, shape_0, shape_1, node: Node, key: str): elif node == Node.END: matrix[s0, s1] = variable[key].cx_end[i] else: - raise RuntimeError("Node must be a Node.START for cx_start, Node.MID for cx_mid, or Node.END for cx_end") + raise RuntimeError( + "Node must be a Node.START for cx_start, Node.MID for cx_mid, or Node.END for cx_end" + ) i += 1 return matrix diff --git a/bioptim/optimization/optimization_vector.py b/bioptim/optimization/optimization_vector.py index f725209b0..873514187 100644 --- a/bioptim/optimization/optimization_vector.py +++ b/bioptim/optimization/optimization_vector.py @@ -350,7 +350,7 @@ def init_vector(ocp): if key in nlp.s_init.keys(): nlp.s_init[key].check_and_adjust_dimensions(nlp.stochastic_variables[key].cx.shape[0], nlp.ns) - for k in range(nlp.ns+1): + for k in range(nlp.ns + 1): OptimizationVectorHelper._set_node_index(nlp, k) collapsed_values = np.ndarray((nlp.stochastic_variables.shape, 1)) for key in nlp.stochastic_variables: @@ -499,9 +499,13 @@ def to_dictionaries(ocp, data: np.ndarray | DM) -> tuple: if nstochastic > 0: for k in range(nlp.ns + 1): nlp.stochastic_variables.node_index = k - s_array = v_array[offset : offset + nstochastic].reshape((nlp.stochastic_variables.shape, -1), order="F") # @pariterre "F" seems like an interpolation? + s_array = v_array[offset : offset + nstochastic].reshape( + (nlp.stochastic_variables.shape, -1), order="F" + ) # @pariterre "F" seems like an interpolation? for key in nlp.stochastic_variables: - data_stochastic_variables[p_idx][key][:, k : k + 1] = s_array[nlp.stochastic_variables[key].index, :].reshape(nlp.stochastic_variables[key].shape, 1) + data_stochastic_variables[p_idx][key][:, k : k + 1] = s_array[ + nlp.stochastic_variables[key].index, : + ].reshape(nlp.stochastic_variables[key].shape, 1) offset += nstochastic p_idx += 1 diff --git a/bioptim/optimization/problem_type.py b/bioptim/optimization/problem_type.py index 26237f2f3..681019263 100644 --- a/bioptim/optimization/problem_type.py +++ b/bioptim/optimization/problem_type.py @@ -1,9 +1,11 @@ from casadi import DM + class OcpType: """ Selection of the type of optimization problem to be solved. """ + def __init__(self): pass @@ -35,4 +37,4 @@ class SOCP_IMPLICIT: def __init__(self, wM_magnitude: DM, wS_magnitude: DM): self.wM_magnitude = wM_magnitude - self.wS_magnitude = wS_magnitude \ No newline at end of file + self.wS_magnitude = wS_magnitude diff --git a/bioptim/optimization/solution.py b/bioptim/optimization/solution.py index 99642b7e3..b8ae5210d 100644 --- a/bioptim/optimization/solution.py +++ b/bioptim/optimization/solution.py @@ -344,7 +344,9 @@ def get_integrated_values(states, controls, parameters, stochastic_variables): stochastic_variables_num = np.array([]) for key_tempo in stochastic_variables[i_phase].keys(): - stochastic_variables_num = np.concatenate((stochastic_variables_num, stochastic_variables[i_phase][key_tempo][:, 0])) + stochastic_variables_num = np.concatenate( + (stochastic_variables_num, stochastic_variables[i_phase][key_tempo][:, 0]) + ) for i_node in range(1, nlp.ns): nlp.states.node_index = i_node @@ -363,30 +365,41 @@ def get_integrated_values(states, controls, parameters, stochastic_variables): controls_num_tempo = np.array([]) for key_tempo in controls[i_phase].keys(): - controls_num_tempo = np.concatenate((controls_num_tempo, controls[i_phase][key_tempo][:, i_node])) + controls_num_tempo = np.concatenate( + (controls_num_tempo, controls[i_phase][key_tempo][:, i_node]) + ) controls_num = vertcat(controls_num, controls_num_tempo) stochastic_variables_num_tempo = np.array([]) if len(stochastic_variables[i_phase]) > 0: for key_tempo in stochastic_variables[i_phase].keys(): stochastic_variables_num_tempo = np.concatenate( - (stochastic_variables_num_tempo, stochastic_variables[i_phase][key_tempo][:, i_node])) - stochastic_variables_num = vertcat(stochastic_variables_num, - stochastic_variables_num_tempo) + ( + stochastic_variables_num_tempo, + stochastic_variables[i_phase][key_tempo][:, i_node], + ) + ) + stochastic_variables_num = vertcat(stochastic_variables_num, stochastic_variables_num_tempo) parameters_tempo = np.array([]) if len(parameters) > 0: for key_tempo in parameters[i_phase].keys(): parameters_tempo = np.concatenate((parameters_tempo, parameters[i_phase][key_tempo])) - casadi_func = Function("integrate_values", [states_cx, - controls_cx, - nlp.parameters.cx_start, - stochastic_variables_cx], [integrated_values_cx]) - integrated_values_this_time = casadi_func(states_num, controls_num, parameters_tempo, stochastic_variables_num) + casadi_func = Function( + "integrate_values", + [states_cx, controls_cx, nlp.parameters.cx_start, stochastic_variables_cx], + [integrated_values_cx], + ) + integrated_values_this_time = casadi_func( + states_num, controls_num, parameters_tempo, stochastic_variables_num + ) nb_elements = nlp.integrated_values[key].cx_start.shape[0] integrated_values_data = np.zeros((nb_elements, nlp.ns)) for i_node in range(nlp.ns): - integrated_values_data[:, i_node] = np.reshape(integrated_values_this_time[i_node * nb_elements : (i_node + 1) * nb_elements], (nb_elements,)) + integrated_values_data[:, i_node] = np.reshape( + integrated_values_this_time[i_node * nb_elements : (i_node + 1) * nb_elements], + (nb_elements,), + ) integrated_values_num[i_phase][key] = integrated_values_data return integrated_values_num @@ -429,7 +442,9 @@ def init_from_dict(_sol: dict): self._complete_control() self.phase_time = OptimizationVectorHelper.extract_phase_time(self.ocp, self.vector) self._time_vector = self._generate_time() - self._integrated_values = get_integrated_values(self._states["unscaled"], self._controls["unscaled"], self.parameters, self._stochastic_variables) + self._integrated_values = get_integrated_values( + self._states["unscaled"], self._controls["unscaled"], self.parameters, self._stochastic_variables + ) def init_from_initial_guess(_sol: list): """ @@ -509,7 +524,9 @@ def init_from_initial_guess(_sol: list): for p, ss in enumerate(sol_stochastic_variables): for key in ss.keys(): self.ocp.nlp[p].stochastic_variables[key].node_index = 0 - ss[key].init.check_and_adjust_dimensions(len(self.ocp.nlp[p].stochastic_variables[key]), self.ns[p], "stochastic_variables") + ss[key].init.check_and_adjust_dimensions( + len(self.ocp.nlp[p].stochastic_variables[key]), self.ns[p], "stochastic_variables" + ) for i in range(self.ns[p] + 1): for key in ss.keys(): @@ -527,7 +544,9 @@ def init_from_initial_guess(_sol: list): self._complete_control() self.phase_time = OptimizationVectorHelper.extract_phase_time(self.ocp, self.vector) self._time_vector = self._generate_time() - self._integrated_values = get_integrated_values(self._states["unscaled"], self._controls["unscaled"], self.parameters, self._stochastic_variables) + self._integrated_values = get_integrated_values( + self._states["unscaled"], self._controls["unscaled"], self.parameters, self._stochastic_variables + ) def init_from_vector(_sol: np.ndarray | DM): """ @@ -551,7 +570,9 @@ def init_from_vector(_sol: np.ndarray | DM): ) self._complete_control() self.phase_time = OptimizationVectorHelper.extract_phase_time(self.ocp, self.vector) - self._integrated_values = get_integrated_values(self._states["unscaled"], self._controls["unscaled"], self.parameters, self._stochastic_variables) + self._integrated_values = get_integrated_values( + self._states["unscaled"], self._controls["unscaled"], self.parameters, self._stochastic_variables + ) if isinstance(sol, dict): init_from_dict(sol) @@ -562,7 +583,9 @@ def init_from_vector(_sol: np.ndarray | DM): elif sol is None: self.ns = [] else: - raise ValueError("Solution called with unknown initializer") # @ Pariterre this seems weird, since it is used in test_initial_conditions + raise ValueError( + "Solution called with unknown initializer" + ) # @ Pariterre this seems weird, since it is used in test_initial_conditions def _to_unscaled_values(self, states_scaled, controls_scaled) -> tuple: """ @@ -1106,7 +1129,10 @@ def _get_first_frame_states(self, sol, shooting_type: Shooting, phase: int) -> n s0 = [] if len(self.ocp.nlp[phase - 1].stochastic_variables) > 0: s0 = np.concatenate( - [self.stochastic_variables[phase - 1][key][:, -1] for key in self.ocp.nlp[phase - 1].stochastic_variables] + [ + self.stochastic_variables[phase - 1][key][:, -1] + for key in self.ocp.nlp[phase - 1].stochastic_variables + ] ) if self.parameters.keys(): params = np.vstack([self.parameters[key] for key in self.parameters]) @@ -1594,8 +1620,7 @@ def _get_penalty_cost(self, nlp, penalty): # Make an exception to the fact that U is not available for the last node u = np.concatenate((u, self._controls["scaled"][phase_idx][key][:, node_idx])) for key in nlp.stochastic_variables: - s = np.concatenate((s, self.stochastic_variables[phase_idx][key][:, node_idx]) - ) + s = np.concatenate((s, self.stochastic_variables[phase_idx][key][:, node_idx])) elif ( "Lagrange" not in penalty.type.__str__() and "Mayer" not in penalty.type.__str__() @@ -1646,7 +1671,9 @@ def _get_penalty_cost(self, nlp, penalty): s = np.ndarray((nlp.stochastic_variables.shape, len(col_s_idx))) for key in nlp.stochastic_variables: - s[nlp.stochastic_variables[key].index, :] = self.stochastic_variables["scaled"][phase_idx][key][:, col_s_idx] + s[nlp.stochastic_variables[key].index, :] = self.stochastic_variables["scaled"][phase_idx][key][ + :, col_s_idx + ] if penalty.target is None: target = [] diff --git a/bioptim/optimization/stochastic_optimal_control_program.py b/bioptim/optimization/stochastic_optimal_control_program.py index 94fde5b0f..7adb58d40 100644 --- a/bioptim/optimization/stochastic_optimal_control_program.py +++ b/bioptim/optimization/stochastic_optimal_control_program.py @@ -16,16 +16,12 @@ from ..limits.objective_functions import ObjectiveList, Objective, ParameterObjectiveList, ParameterObjective from ..limits.path_conditions import BoundsList, Bounds from ..limits.path_conditions import InitialGuess, InitialGuessList -from ..misc.enums import ( - Node, - ControlType -) +from ..misc.enums import Node, ControlType from ..misc.mapping import BiMappingList, Mapping, NodeMappingList, BiMapping from ..optimization.parameters import ParameterList, Parameter from ..optimization.problem_type import OcpType from ..optimization.optimal_control_program import OptimalControlProgram -from .. optimization.variable_scaling import VariableScalingList, VariableScaling - +from ..optimization.variable_scaling import VariableScalingList, VariableScaling class StochasticOptimalControlProgram(OptimalControlProgram): @@ -75,8 +71,7 @@ def __init__( problem_type: OcpType = OcpType.SOCP_EXPLICIT, **kwargs, ): - """ - """ + """ """ if "n_thread" in kwargs: if kwargs["n_thread"] != 1: @@ -100,86 +95,97 @@ def __init__( bio_model = self.initialize_model(bio_model) - self.set_original_values(bio_model, - dynamics, - n_shooting, - phase_time, - x_init, - u_init, - s_init, - x_bounds, - u_bounds, - s_bounds, - x_scaling, - xdot_scaling, - u_scaling, - external_forces, - ode_solver, - control_type, - variable_mappings, - time_phase_mapping, - node_mappings, - plot_mappings, - phase_transitions, - multinode_constraints, - multinode_objectives, - parameter_bounds, - parameter_init, - parameter_constraints, - parameter_objectives, - state_continuity_weight, - n_threads, - use_sx, - assume_phase_dynamics, - integrated_value_functions,) + self.set_original_values( + bio_model, + dynamics, + n_shooting, + phase_time, + x_init, + u_init, + s_init, + x_bounds, + u_bounds, + s_bounds, + x_scaling, + xdot_scaling, + u_scaling, + external_forces, + ode_solver, + control_type, + variable_mappings, + time_phase_mapping, + node_mappings, + plot_mappings, + phase_transitions, + multinode_constraints, + multinode_objectives, + parameter_bounds, + parameter_init, + parameter_constraints, + parameter_objectives, + state_continuity_weight, + n_threads, + use_sx, + assume_phase_dynamics, + integrated_value_functions, + ) - constraints, objective_functions, parameter_constraints, parameter_objectives, multinode_constraints, multinode_objectives = self.check_arguments_and_build_nlp( - dynamics, - n_threads, - n_shooting, - phase_time, - x_bounds, - u_bounds, - s_bounds, - x_init, - u_init, - s_init, - x_scaling, - xdot_scaling, - u_scaling, - objective_functions, - constraints, - parameters, - phase_transitions, - multinode_constraints, - multinode_objectives, - parameter_bounds, - parameter_init, - parameter_constraints, - parameter_objectives, - ode_solver, - use_sx, - assume_phase_dynamics, - bio_model, - external_forces, - plot_mappings, - time_phase_mapping, - control_type, - variable_mappings, - integrated_value_functions, - node_mappings, - state_continuity_weight) + ( + constraints, + objective_functions, + parameter_constraints, + parameter_objectives, + multinode_constraints, + multinode_objectives, + ) = self.check_arguments_and_build_nlp( + dynamics, + n_threads, + n_shooting, + phase_time, + x_bounds, + u_bounds, + s_bounds, + x_init, + u_init, + s_init, + x_scaling, + xdot_scaling, + u_scaling, + objective_functions, + constraints, + parameters, + phase_transitions, + multinode_constraints, + multinode_objectives, + parameter_bounds, + parameter_init, + parameter_constraints, + parameter_objectives, + ode_solver, + use_sx, + assume_phase_dynamics, + bio_model, + external_forces, + plot_mappings, + time_phase_mapping, + control_type, + variable_mappings, + integrated_value_functions, + node_mappings, + state_continuity_weight, + ) self.problem_type = problem_type self._declare_multi_node_penalties(multinode_constraints, multinode_objectives) - self.finalize_penalties(skip_continuity, - state_continuity_weight, - constraints, - parameter_constraints, - objective_functions, - parameter_objectives) - + self.finalize_penalties( + skip_continuity, + state_continuity_weight, + constraints, + parameter_constraints, + objective_functions, + parameter_objectives, + ) def _declare_multi_node_penalties(self, multinode_constraints: ConstraintList, multinode_objectives: ObjectiveList): multinode_constraints.add_or_replace_to_penalty_pool(self) @@ -187,12 +193,13 @@ def _declare_multi_node_penalties(self, multinode_constraints: ConstraintList, m # Add the internal multi-node constraints for the stochastic ocp if isinstance(self.problem_type, OcpType.SOCP_EXPLICIT): - self._prepare_stochastic_dynamics_explicit(wM_magnitude=self.problem_type.wM_magnitude, - wS_magnitude=self.problem_type.wS_magnitude) + self._prepare_stochastic_dynamics_explicit( + wM_magnitude=self.problem_type.wM_magnitude, wS_magnitude=self.problem_type.wS_magnitude + ) elif isinstance(self.problem_type, OcpType.SOCP_IMPLICIT): - self._prepare_stochastic_dynamics_implicit(wM_magnitude=self.problem_type.wM_magnitude, - wS_magnitude=self.problem_type.wS_magnitude) - + self._prepare_stochastic_dynamics_implicit( + wM_magnitude=self.problem_type.wM_magnitude, wS_magnitude=self.problem_type.wS_magnitude + ) def _prepare_stochastic_dynamics_explicit(self, wM_magnitude, wS_magnitude): """ @@ -202,25 +209,24 @@ def _prepare_stochastic_dynamics_explicit(self, wM_magnitude, wS_magnitude): for i_phase, nlp in enumerate(self.nlp): for i_node in range(nlp.ns - 1): penalty_m_dg_dz_list.add( - MultinodeConstraintFcn.M_EQUALS_INVERSE_OF_DG_DZ, - nodes_phase=(i_phase, i_phase), - nodes=(i_node, i_node+1), - dynamics=nlp.dynamics_type.dynamic_function, - wM_magnitude=wM_magnitude, - wS_magnitude=wS_magnitude, - ) + MultinodeConstraintFcn.M_EQUALS_INVERSE_OF_DG_DZ, + nodes_phase=(i_phase, i_phase), + nodes=(i_node, i_node + 1), + dynamics=nlp.dynamics_type.dynamic_function, + wM_magnitude=wM_magnitude, + wS_magnitude=wS_magnitude, + ) if i_phase > 0: # TODO: verify with Friedl, but should be OK penalty_m_dg_dz_list.add( - MultinodeConstraintFcn.M_EQUALS_INVERSE_OF_DG_DZ, - nodes_phase=(i_phase-1, i_phase), - nodes=(-1, 0), - dynamics=nlp.dynamics_type.dynamic_function, - wM_magnitude=wM_magnitude, - wS_magnitude=wS_magnitude, - ) + MultinodeConstraintFcn.M_EQUALS_INVERSE_OF_DG_DZ, + nodes_phase=(i_phase - 1, i_phase), + nodes=(-1, 0), + dynamics=nlp.dynamics_type.dynamic_function, + wM_magnitude=wM_magnitude, + wS_magnitude=wS_magnitude, + ) penalty_m_dg_dz_list.add_or_replace_to_penalty_pool(self) - def _prepare_stochastic_dynamics_implicit(self, wM_magnitude, wS_magnitude): """ ... @@ -232,50 +238,59 @@ def _prepare_stochastic_dynamics_implicit(self, wM_magnitude, wS_magnitude): for i_phase, nlp in enumerate(self.nlp): for i_node in range(nlp.ns - 1): multi_node_penalties.add( - MultinodeConstraintFcn.M_EQUALS_INVERSE_OF_DG_DZ, - nodes_phase=(i_phase, i_phase), - nodes=(i_node, i_node+1), - dynamics=nlp.dynamics_type.dynamic_function, - wM_magnitude=wM_magnitude, - wS_magnitude=wS_magnitude, - ) + MultinodeConstraintFcn.M_EQUALS_INVERSE_OF_DG_DZ, + nodes_phase=(i_phase, i_phase), + nodes=(i_node, i_node + 1), + dynamics=nlp.dynamics_type.dynamic_function, + wM_magnitude=wM_magnitude, + wS_magnitude=wS_magnitude, + ) if i_phase > 0: # TODO: verify with Friedl, but should be OK multi_node_penalties.add( - MultinodeConstraintFcn.M_EQUALS_INVERSE_OF_DG_DZ, - nodes_phase=(i_phase-1, i_phase), - nodes=(-1, 0), - dynamics=nlp.dynamics_type.dynamic_function, - wM_magnitude=wM_magnitude, - wS_magnitude=wS_magnitude, - ) + MultinodeConstraintFcn.M_EQUALS_INVERSE_OF_DG_DZ, + nodes_phase=(i_phase - 1, i_phase), + nodes=(-1, 0), + dynamics=nlp.dynamics_type.dynamic_function, + wM_magnitude=wM_magnitude, + wS_magnitude=wS_magnitude, + ) # Constrain P for i_phase, nlp in enumerate(self.nlp): - single_node_penalties.add(ConstraintFcn.COVARIANCE_MATRIX_CONINUITY_IMPLICIT, node=Node.ALL, phase=i_phase, - wM_magnitude=wM_magnitude, wS_magnitude=wS_magnitude) + single_node_penalties.add( + ConstraintFcn.COVARIANCE_MATRIX_CONINUITY_IMPLICIT, + node=Node.ALL, + phase=i_phase, + wM_magnitude=wM_magnitude, + wS_magnitude=wS_magnitude, + ) if i_phase > 0: - multi_node_penalties.add( # TODO: check - MultinodeConstraintFcn.COVARIANCE_MATRIX_CONINUITY_IMPLICIT, # TODO: to be continued in penalty - nodes_phase=(i_phase-1, i_phase), - nodes=(-1, 0), - wM_magnitude=wM_magnitude, - wS_magnitude=wS_magnitude, - ) + multi_node_penalties.add( # TODO: check + MultinodeConstraintFcn.COVARIANCE_MATRIX_CONINUITY_IMPLICIT, # TODO: to be continued in penalty + nodes_phase=(i_phase - 1, i_phase), + nodes=(-1, 0), + wM_magnitude=wM_magnitude, + wS_magnitude=wS_magnitude, + ) # Constrain A for i_phase, nlp in enumerate(self.nlp): - single_node_penalties.add(ConstraintFcn.A_EQUALS_DF_DX, - node=Node.ALL, phase=i_phase, - wM_magnitude=wM_magnitude, - wS_magnitude=wS_magnitude, - ) + single_node_penalties.add( + ConstraintFcn.A_EQUALS_DF_DX, + node=Node.ALL, + phase=i_phase, + wM_magnitude=wM_magnitude, + wS_magnitude=wS_magnitude, + ) # Constrain C for i_phase, nlp in enumerate(self.nlp): - single_node_penalties.add(ConstraintFcn.C_EQUALS_DF_DW, - node=Node.ALL, phase=i_phase, - wM_magnitude=wM_magnitude, - wS_magnitude=wS_magnitude, - ) + single_node_penalties.add( + ConstraintFcn.C_EQUALS_DF_DW, + node=Node.ALL, + phase=i_phase, + wM_magnitude=wM_magnitude, + wS_magnitude=wS_magnitude, + ) multi_node_penalties.add_or_replace_to_penalty_pool(self) single_node_penalties.add_or_replace_to_penalty_pool(self) diff --git a/tests/test__global_plots.py b/tests/test__global_plots.py index 079f29956..7b11459b7 100644 --- a/tests/test__global_plots.py +++ b/tests/test__global_plots.py @@ -247,7 +247,9 @@ def override_penalty(pen: list[PenaltyOption]): ) p.function_non_threaded[node_index] = p.function[node_index] p.weighted_function[node_index] = Function( - name, [x, u, param, s, weight, target, dt], [np.array([range(cmp + 1, len(p.rows) + cmp + 1)]).T] + name, + [x, u, param, s, weight, target, dt], + [np.array([range(cmp + 1, len(p.rows) + cmp + 1)]).T], ) p.weighted_function_non_threaded[node_index] = p.weighted_function[node_index] diff --git a/tests/test_dynamics.py b/tests/test_dynamics.py index 66cc6a07c..5cb1c7b20 100644 --- a/tests/test_dynamics.py +++ b/tests/test_dynamics.py @@ -1524,7 +1524,9 @@ def test_joints_acceleration_driven(cx, rigid_body_dynamics, assume_phase_dynami @pytest.mark.parametrize("assume_phase_dynamics", [True, False]) @pytest.mark.parametrize("with_contact", [False, True]) def test_custom_dynamics(with_contact, assume_phase_dynamics): - def custom_dynamic(states, controls, parameters, stochastic_variables, nlp, with_contact=False) -> DynamicsEvaluation: + def custom_dynamic( + states, controls, parameters, stochastic_variables, nlp, with_contact=False + ) -> DynamicsEvaluation: q = DynamicsFunctions.get(nlp.states["q"], states) qdot = DynamicsFunctions.get(nlp.states["qdot"], states) tau = DynamicsFunctions.get(nlp.controls["tau"], controls) diff --git a/tests/test_global_stochastic.py b/tests/test_global_stochastic.py index 78e4a8244..7105f09d2 100644 --- a/tests/test_global_stochastic.py +++ b/tests/test_global_stochastic.py @@ -1,4 +1,3 @@ - import os import pickle import re @@ -27,20 +26,20 @@ def test_arm_reaching_muscle_driven(): force_field_magnitude = 0 ocp = ocp_module.prepare_socp( - biorbd_model_path=bioptim_folder + "/models/LeuvenArmModel.bioMod", - final_time=final_time, - n_shooting=n_shooting, - ee_final_position=ee_final_position, - problem_type=problem_type, - force_field_magnitude=force_field_magnitude - ) + biorbd_model_path=bioptim_folder + "/models/LeuvenArmModel.bioMod", + final_time=final_time, + n_shooting=n_shooting, + ee_final_position=ee_final_position, + problem_type=problem_type, + force_field_magnitude=force_field_magnitude, + ) # ocp.print(to_console=True, to_graph=False) #TODO: check to adjust the print method # Solver parameters solver = Solver.IPOPT(show_online_optim=False) solver.set_maximum_iterations(4) - solver.set_nlp_scaling_method('none') + solver.set_nlp_scaling_method("none") sol = ocp.solve(solver) @@ -68,14 +67,18 @@ def test_arm_reaching_muscle_driven(): np.testing.assert_almost_equal(q[:, -2], np.array([0.95993109, 1.15939485])) np.testing.assert_almost_equal(qdot[:, 0], np.array((0, 0))) np.testing.assert_almost_equal(qdot[:, -2], np.array((0, 0))) - np.testing.assert_almost_equal(mus_activations[:, 0], np.array([0.03414132, 0.03292284, 0.0126227 , 0.01565839, 0.00676471, - 0.02404206])) - np.testing.assert_almost_equal(mus_activations[:, -2], np.array([0.04160946, 0.07306185, 0.01894845, 0.02188286, 0.00068182, - 0.0253038])) - np.testing.assert_almost_equal(mus_excitations[:, 0], np.array([0.02816048, 0.0712188 , 0.04627442, 0.0034365 , 0.00025384, - 0.03239987])) - np.testing.assert_almost_equal(mus_excitations[:, -2], np.array([0.01826304, 0.04932192, 0.02884916, 0.01225839, 0.00113569, - 0.00867345])) + np.testing.assert_almost_equal( + mus_activations[:, 0], np.array([0.03414132, 0.03292284, 0.0126227, 0.01565839, 0.00676471, 0.02404206]) + ) + np.testing.assert_almost_equal( + mus_activations[:, -2], np.array([0.04160946, 0.07306185, 0.01894845, 0.02188286, 0.00068182, 0.0253038]) + ) + np.testing.assert_almost_equal( + mus_excitations[:, 0], np.array([0.02816048, 0.0712188, 0.04627442, 0.0034365, 0.00025384, 0.03239987]) + ) + np.testing.assert_almost_equal( + mus_excitations[:, -2], np.array([0.01826304, 0.04932192, 0.02884916, 0.01225839, 0.00113569, 0.00867345]) + ) # TODO: test the stochastic variables + update values @@ -83,9 +86,9 @@ def test_arm_reaching_muscle_driven(): # TestUtils.simulate(sol) # TODO: check to adjust the simulate method -#iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls +# iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls # 0 5.2443422e-01 2.05e+03 1.19e+00 -1.0 0.00e+00 - 0.00e+00 0.00e+00 0 # 1 1.7949339e+00 1.99e+03 1.29e+03 -1.0 3.73e+01 2.0 1.08e-02 2.98e-02h 1 # 2 1.9623501e+00 1.98e+03 1.29e+03 -1.0 4.68e+00 3.3 1.13e-01 4.06e-03h 1 # 3 4.0176536e+00 1.88e+03 1.24e+03 -1.0 4.55e+00 2.9 3.66e-01 5.30e-02h 1 -# 4 8.4440161e+00 1.65e+03 1.78e+03 -1.0 3.35e+00 3.3 2.20e-01 1.19e-01h 1 \ No newline at end of file +# 4 8.4440161e+00 1.65e+03 1.78e+03 -1.0 3.35e+00 3.3 2.20e-01 1.19e-01h 1 diff --git a/tests/test_penalty.py b/tests/test_penalty.py index 44595f0c8..4b5dd376c 100644 --- a/tests/test_penalty.py +++ b/tests/test_penalty.py @@ -78,8 +78,14 @@ def get_penalty_value(ocp, penalty, t, x, u, p, s): states = ocp.nlp[0].states.cx_start if ocp.nlp[0].states.cx_start.shape != (0, 0) else ocp.cx(0, 0) controls = ocp.nlp[0].controls.cx_start if ocp.nlp[0].controls.cx_start.shape != (0, 0) else ocp.cx(0, 0) parameters = ocp.nlp[0].parameters.cx if ocp.nlp[0].parameters.cx.shape != (0, 0) else ocp.cx(0, 0) - stochastic_variables = ocp.nlp[0].stochastic_variables.cx_start if ocp.nlp[0].stochastic_variables.cx_start.shape != (0, 0) else ocp.cx(0, 0) - return ocp.nlp[0].to_casadi_func("penalty", val, states, controls, parameters, stochastic_variables)(x[0], u[0], p, s) + stochastic_variables = ( + ocp.nlp[0].stochastic_variables.cx_start + if ocp.nlp[0].stochastic_variables.cx_start.shape != (0, 0) + else ocp.cx(0, 0) + ) + return ocp.nlp[0].to_casadi_func("penalty", val, states, controls, parameters, stochastic_variables)( + x[0], u[0], p, s + ) def test_penalty_targets_shapes(): From 4004e44bc8e7ddfd6d821acb30f7bc7069997361 Mon Sep 17 00:00:00 2001 From: Charbie Date: Thu, 13 Jul 2023 13:13:01 +0200 Subject: [PATCH 33/54] moved function to understand --- bioptim/interfaces/solver_options.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/bioptim/interfaces/solver_options.py b/bioptim/interfaces/solver_options.py index 584c7b180..2ab7c33d2 100644 --- a/bioptim/interfaces/solver_options.py +++ b/bioptim/interfaces/solver_options.py @@ -105,6 +105,8 @@ class IPOPT(Generic): Maximum number of iterations. _hessian_approximation: str Indicates what Hessian information is to be used. + _nlp_scaling_method: str + Indicates the method used by IPOPT to scale the nlp _limited_memory_max_history: int Maximum size of the history for the limited quasi-Newton Hessian approximation. _linear_solver: str @@ -146,6 +148,7 @@ class IPOPT(Generic): _acceptable_compl_inf_tol: float = 1e-2 _max_iter: int = 1000 _hessian_approximation: str = "exact" # "exact", "limited-memory" + _nlp_scaling_method: str = "gradient-based" # "none" _limited_memory_max_history: int = 50 _linear_solver: str = "mumps" # "ma57", "ma86", "mumps" _mu_init: float = 0.1 @@ -159,7 +162,6 @@ class IPOPT(Generic): _bound_frac: float = 0.01 _print_level: int = 5 _c_compile: bool = False - _nlp_scaling_method: str = "gradient-based" @property def tol(self): @@ -201,6 +203,10 @@ def max_iter(self): def hessian_approximation(self): return self._hessian_approximation + @property + def nlp_scaling_method(self): + return self._nlp_scaling_method + @property def limited_memory_max_history(self): return self._limited_memory_max_history @@ -253,10 +259,6 @@ def print_level(self): def c_compile(self): return self._c_compile - @property - def nlp_scaling_method(self): - return self._nlp_scaling_method - def set_tol(self, val: float): self._tol = val @@ -287,6 +289,9 @@ def set_maximum_iterations(self, num): def set_hessian_approximation(self, val: str): self._hessian_approximation = val + def set_nlp_scaling_method(self, val: str): + self._nlp_scaling_method = val + def set_limited_memory_max_history(self, num: int): self._limited_memory_max_history = num @@ -326,9 +331,6 @@ def set_print_level(self, num: int): def set_c_compile(self, val: bool): self._c_compile = val - def set_nlp_scaling_method(self, val: str): - self._nlp_scaling_method = val - def set_convergence_tolerance(self, val: float): self._tol = val self._compl_inf_tol = val From a2cc72acd84cdbdd4c791d392f1679fe4a0050c0 Mon Sep 17 00:00:00 2001 From: Charbie Date: Fri, 14 Jul 2023 12:16:29 +0200 Subject: [PATCH 34/54] fixed tests --- bioptim/limits/penalty.py | 6 +- bioptim/optimization/parameters.py | 9 +- .../receding_horizon_optimization.py | 3 +- bioptim/optimization/solution.py | 11 +- .../variational_optimal_control_program.py | 4 +- tests/test_global_getting_started.py | 4 +- tests/test_global_nmpc_final.py | 1 - tests/test_global_stochastic.py | 132 +++++++++++++----- tests/test_penalty.py | 3 +- 9 files changed, 121 insertions(+), 52 deletions(-) diff --git a/bioptim/limits/penalty.py b/bioptim/limits/penalty.py index dbe52e15b..315048244 100644 --- a/bioptim/limits/penalty.py +++ b/bioptim/limits/penalty.py @@ -444,7 +444,8 @@ def minimize_qddot(penalty: PenaltyOption, controller: PenaltyController): if "qddot" not in controller.states and "qddot" not in controller.controls: return controller.dynamics( - controller.states.cx_start, controller.controls.cx_start, controller.parameters.cx + controller.states.cx_start, controller.controls.cx_start, controller.parameters.cx, + controller.stochastic_variables.cx_start, )[controller.states["qdot"].index, :] elif "qddot" in controller.states: return controller.states["qddot"].cx_start @@ -550,7 +551,8 @@ def minimize_com_acceleration(penalty: PenaltyOption, controller: PenaltyControl com_ddot = controller.model.center_of_mass_acceleration( controller.states["q"].mx, controller.states["qdot"].mx, - controller.dynamics(controller.states.mx, controller.controls.mx, controller.parameters.mx)[ + controller.dynamics(controller.states.mx, controller.controls.mx, controller.parameters.mx, + controller.stochastic_variables.cx_start)[ controller.states["qdot"].index, : ], ) diff --git a/bioptim/optimization/parameters.py b/bioptim/optimization/parameters.py index c593b1384..bdfe4a34d 100644 --- a/bioptim/optimization/parameters.py +++ b/bioptim/optimization/parameters.py @@ -116,7 +116,7 @@ def add_or_replace_to_penalty_pool(self, ocp, penalty): else: penalty.name = penalty.type.name - fake_penalty_controller = PenaltyController(ocp, ocp.nlp[0], [], [], [], [], [], ocp.parameters.cx) + fake_penalty_controller = PenaltyController(ocp, ocp.nlp[0], [], [], [], [], [], ocp.parameters.cx, []) penalty_function = penalty.type(penalty, fake_penalty_controller, **penalty.params) self.set_penalty(ocp, fake_penalty_controller, penalty, penalty_function, penalty.expand) @@ -155,14 +155,15 @@ def _set_penalty_function(self, ocp, controller, penalty, penalty_function: MX | state_cx = ocp.cx(0, 0) control_cx = ocp.cx(0, 0) param_cx = ocp.parameters.cx + stochastic_cx = ocp.cx(0, 0) penalty.function.append( NonLinearProgram.to_casadi_func( - f"{self.name}", penalty_function, state_cx, control_cx, param_cx, expand=expand + f"{self.name}", penalty_function, state_cx, control_cx, param_cx, stochastic_cx, expand=expand ) ) - modified_fcn = penalty.function[0](state_cx, control_cx, param_cx) + modified_fcn = penalty.function[0](state_cx, control_cx, param_cx, stochastic_cx) dt_cx = ocp.cx.sym("dt", 1, 1) weight_cx = ocp.cx.sym("weight", 1, 1) @@ -174,7 +175,7 @@ def _set_penalty_function(self, ocp, controller, penalty, penalty_function: MX | penalty.weighted_function.append( Function( # Do not use nlp.add_casadi_func because all of them must be registered f"{self.name}", - [state_cx, control_cx, param_cx, weight_cx, target_cx, dt_cx], + [state_cx, control_cx, param_cx, stochastic_cx, weight_cx, target_cx, dt_cx], [weight_cx * modified_fcn * dt_cx], ) ) diff --git a/bioptim/optimization/receding_horizon_optimization.py b/bioptim/optimization/receding_horizon_optimization.py index e705249aa..6678ab0d5 100644 --- a/bioptim/optimization/receding_horizon_optimization.py +++ b/bioptim/optimization/receding_horizon_optimization.py @@ -726,6 +726,7 @@ def _initialize_one_cycle(self, states: np.ndarray, controls: np.ndarray): model_class = original_values["bio_model"][0][0] model_initializer = original_values["bio_model"][0][1] + p_init = InitialGuessList() s_init = InitialGuessList() solution_ocp = OptimalControlProgram( bio_model=model_class(**model_initializer), @@ -740,7 +741,7 @@ def _initialize_one_cycle(self, states: np.ndarray, controls: np.ndarray): s_init=s_init, use_sx=original_values["use_sx"], ) - return Solution(solution_ocp, [x_init, u_init_for_solution, s_init]) + return Solution(solution_ocp, [x_init, u_init_for_solution, p_init, s_init]) class NonlinearModelPredictiveControl(RecedingHorizonOptimization): diff --git a/bioptim/optimization/solution.py b/bioptim/optimization/solution.py index b8ae5210d..41940e61c 100644 --- a/bioptim/optimization/solution.py +++ b/bioptim/optimization/solution.py @@ -465,7 +465,7 @@ def init_from_initial_guess(_sol: list): for _ in range(len(self.ns)): tp.add(deepcopy(_sol[i].init), interpolation=_sol[i].init.type) _sol[i] = tp - if sum([isinstance(s, InitialGuessList) for s in _sol]) != 3: + if sum([isinstance(s, InitialGuessList) for s in _sol]) != 4: raise ValueError( "solution must be a solution dict, " "an InitialGuess[List] of len 3 or 4 (states, controls, parameters, stochastic_variables), " @@ -576,7 +576,7 @@ def init_from_vector(_sol: np.ndarray | DM): if isinstance(sol, dict): init_from_dict(sol) - elif isinstance(sol, (list, tuple)) and len(sol) in (2, 3): + elif isinstance(sol, (list, tuple)) and len(sol) == 4: init_from_initial_guess(sol) elif isinstance(sol, (np.ndarray, DM)): init_from_vector(sol) @@ -585,7 +585,7 @@ def init_from_vector(_sol: np.ndarray | DM): else: raise ValueError( "Solution called with unknown initializer" - ) # @ Pariterre this seems weird, since it is used in test_initial_conditions + ) def _to_unscaled_values(self, states_scaled, controls_scaled) -> tuple: """ @@ -1589,6 +1589,7 @@ def animate( def _get_penalty_cost(self, nlp, penalty): phase_idx = nlp.phase_idx steps = nlp.ode_solver.steps + 1 if nlp.ode_solver.is_direct_collocation else 1 + nlp.controls.node_index = 0 val = [] val_weighted = [] @@ -1620,7 +1621,7 @@ def _get_penalty_cost(self, nlp, penalty): # Make an exception to the fact that U is not available for the last node u = np.concatenate((u, self._controls["scaled"][phase_idx][key][:, node_idx])) for key in nlp.stochastic_variables: - s = np.concatenate((s, self.stochastic_variables[phase_idx][key][:, node_idx])) + s = np.concatenate((s, self._stochastic_variables[phase_idx][key][:, node_idx])) elif ( "Lagrange" not in penalty.type.__str__() and "Mayer" not in penalty.type.__str__() @@ -1671,7 +1672,7 @@ def _get_penalty_cost(self, nlp, penalty): s = np.ndarray((nlp.stochastic_variables.shape, len(col_s_idx))) for key in nlp.stochastic_variables: - s[nlp.stochastic_variables[key].index, :] = self.stochastic_variables["scaled"][phase_idx][key][ + s[nlp.stochastic_variables[key].index, :] = self.stochastic_variables[phase_idx][key][ :, col_s_idx ] diff --git a/bioptim/optimization/variational_optimal_control_program.py b/bioptim/optimization/variational_optimal_control_program.py index 73292e42e..7c057b41f 100644 --- a/bioptim/optimization/variational_optimal_control_program.py +++ b/bioptim/optimization/variational_optimal_control_program.py @@ -236,9 +236,9 @@ def configure_dynamics_function( # Note: useless but needed to run bioptim as it need to test the size of xdot nlp.dynamics_func = Function( "ForwardDyn", - [nlp.states.scaled.mx_reduced, nlp.controls.scaled.mx_reduced, nlp.parameters.mx], + [nlp.states.scaled.mx_reduced, nlp.controls.scaled.mx_reduced, nlp.parameters.mx, nlp.stochastic_variables.mx], [dynamics_dxdt], - ["x", "u", "p"], + ["x", "u", "p", "s"], ["xdot"], ) diff --git a/tests/test_global_getting_started.py b/tests/test_global_getting_started.py index 2e86342fa..8dc9a3ed9 100644 --- a/tests/test_global_getting_started.py +++ b/tests/test_global_getting_started.py @@ -495,7 +495,6 @@ def test_initial_guesses(ode_solver, interpolation, random_init, assume_phase_dy # simulate TestUtils.simulate(sol) - # detailed cost values np.testing.assert_almost_equal(sol.detailed_cost[0]["cost_value_weighted"], 13954.735000000004) @@ -1225,6 +1224,7 @@ def test_multinode_objective(ode_solver, assume_phase_dynamics): x_out = np.ndarray((0, 1)) u_out = np.ndarray((0, 1)) p_out = [] + s_out = [] for i in range(n_shooting): x_out = np.vstack((x_out, np.concatenate([sol.states[key][:, i] for key in sol.states.keys()])[:, np.newaxis])) if i == n_shooting: @@ -1235,7 +1235,7 @@ def test_multinode_objective(ode_solver, assume_phase_dynamics): ) # Note that dt=1, because the multi-node objectives are treated as mayer terms - out = fun[0](x_out, u_out, p_out, weight, target, 1) + out = fun[0](x_out, u_out, p_out, s_out, weight, target, 1) out_expected = sum2(sum1(sol.controls["tau"][:, :-1] ** 2)) * dt * weight np.testing.assert_almost_equal(out, out_expected) diff --git a/tests/test_global_nmpc_final.py b/tests/test_global_nmpc_final.py index c55c8b37b..9518da2e3 100644 --- a/tests/test_global_nmpc_final.py +++ b/tests/test_global_nmpc_final.py @@ -8,7 +8,6 @@ import numpy as np from bioptim import Solver, MultiCyclicCycleSolutions - @pytest.mark.parametrize("assume_phase_dynamics", [True, False]) def test_multi_cyclic_nmpc_get_final(assume_phase_dynamics): if platform.system() != "Linux": diff --git a/tests/test_global_stochastic.py b/tests/test_global_stochastic.py index 7105f09d2..b0776843b 100644 --- a/tests/test_global_stochastic.py +++ b/tests/test_global_stochastic.py @@ -1,37 +1,38 @@ import os -import pickle -import re -import sys -import shutil -import platform import pytest import numpy as np -from casadi import sum1, sum2 -from bioptim import InterpolationType, OdeSolver, MultinodeConstraintList, MultinodeConstraintFcn, Node, Solver +from casadi import DM, vertcat +from bioptim import Solver from .utils import TestUtils - def test_arm_reaching_muscle_driven(): from bioptim.examples.stochastic_optimal_control import arm_reaching_muscle_driven as ocp_module - bioptim_folder = os.path.dirname(ocp_module.__file__) - final_time = 0.8 n_shooting = 4 - ee_initial_position = np.array([0.0, 0.2742]) ee_final_position = np.array([9.359873986980460e-12, 0.527332023564034]) problem_type = "CIRCLE" force_field_magnitude = 0 + dt = 0.01 + wM_std = 0.05 + wPq_std = 3e-4 + wPqdot_std = 0.0024 + wM_magnitude = DM(np.array([wM_std**2 / dt, wM_std**2 / dt])) + wPq_magnitude = DM(np.array([wPq_std**2 / dt, wPq_std**2 / dt])) + wPqdot_magnitude = DM(np.array([wPqdot_std**2 / dt, wPqdot_std**2 / dt])) + wS_magnitude = vertcat(wPq_magnitude, wPqdot_magnitude) + ocp = ocp_module.prepare_socp( - biorbd_model_path=bioptim_folder + "/models/LeuvenArmModel.bioMod", final_time=final_time, n_shooting=n_shooting, ee_final_position=ee_final_position, - problem_type=problem_type, + wM_magnitude=wM_magnitude, + wS_magnitude=wS_magnitude, force_field_magnitude=force_field_magnitude, + problem_type=problem_type, ) # ocp.print(to_console=True, to_graph=False) #TODO: check to adjust the print method @@ -43,24 +44,25 @@ def test_arm_reaching_muscle_driven(): sol = ocp.solve(solver) - # TODO: adjust the values as sol, gets updated # Check objective function value f = np.array(sol.cost) np.testing.assert_equal(f.shape, (1, 1)) - np.testing.assert_almost_equal(f[0, 0], 8.444016053093858) + np.testing.assert_almost_equal(f[0, 0], 8.741553107265094) # detailed cost values - # sol.detailed_cost_values() - # np.testing.assert_almost_equal(sol.detailed_cost[2]["cost_value_weighted"], 41.57063948309302) - # np.testing.assert_almost_equal(sol.detailed_cost[3]["cost_value_weighted"], 41.57063948309302) + np.testing.assert_almost_equal(sol.detailed_cost[0]["cost_value_weighted"], 0.4718449494109634) + np.testing.assert_almost_equal(sol.detailed_cost[1]["cost_value_weighted"], 0.35077195834212055) # Check constraints g = np.array(sol.constraints) np.testing.assert_equal(g.shape, (426, 1)) # Check some of the results - states, controls = sol.states, sol.controls - q, qdot, mus_activations, mus_excitations = states["q"], states["qdot"], states["muscles"], controls["muscles"] + states, controls, stochastic_variables, integrated_values = sol.states, sol.controls, sol.stochastic_variables, sol.integrated_values + q, qdot, mus_activations = states["q"], states["qdot"], states["muscles"] + mus_excitations = controls["muscles"] + k, ee_ref, m = stochastic_variables["k"], stochastic_variables["ee_ref"], stochastic_variables["m"] + cov = integrated_values["cov"] # initial and final position np.testing.assert_almost_equal(q[:, 0], np.array([0.34906585, 2.24586773])) @@ -68,27 +70,89 @@ def test_arm_reaching_muscle_driven(): np.testing.assert_almost_equal(qdot[:, 0], np.array((0, 0))) np.testing.assert_almost_equal(qdot[:, -2], np.array((0, 0))) np.testing.assert_almost_equal( - mus_activations[:, 0], np.array([0.03414132, 0.03292284, 0.0126227, 0.01565839, 0.00676471, 0.02404206]) + mus_activations[:, 0], np.array([0.03325451, 0.032017 , 0.01257345, 0.01548143, 0.00693818, + 0.02362305]) ) np.testing.assert_almost_equal( - mus_activations[:, -2], np.array([0.04160946, 0.07306185, 0.01894845, 0.02188286, 0.00068182, 0.0253038]) + mus_activations[:, -2], np.array([0.04064909, 0.07082433, 0.01877212, 0.02148688, 0.00063566, + 0.02491778]) ) + np.testing.assert_almost_equal( - mus_excitations[:, 0], np.array([0.02816048, 0.0712188, 0.04627442, 0.0034365, 0.00025384, 0.03239987]) + mus_excitations[:, 0], np.array([0.02751848, 0.06879444, 0.0450344 , 0.00352429, 0.00024554, + 0.03168447]) ) np.testing.assert_almost_equal( - mus_excitations[:, -2], np.array([0.01826304, 0.04932192, 0.02884916, 0.01225839, 0.00113569, 0.00867345]) + mus_excitations[:, -2], np.array([0.0181344 , 0.04798581, 0.02832193, 0.01222864, 0.00102345, + 0.0088184]) ) - # TODO: test the stochastic variables + update values - - # simulate - # TestUtils.simulate(sol) # TODO: check to adjust the simulate method + np.testing.assert_almost_equal( + k[:, 0], np.array([0.00999994, 0.01 , 0.00999999, 0.00999998, 0.00999997, + 0.00999999, 0.00999993, 0.01 , 0.00999999, 0.00999997, + 0.00999996, 0.00999999, 0.00999956, 0.00999936, 0.0099994 , + 0.00999943, 0.00999947, 0.00999938, 0.00999956, 0.00999936, + 0.0099994 , 0.00999943, 0.00999947, 0.00999938]) + ) + np.testing.assert_almost_equal( + ee_ref[:, 0], np.array([0.00812868, 0.05943125, 0.00812868, 0.00812868]) + ) + np.testing.assert_almost_equal( + m[:, 0], np.array([1.89901532e-01, 7.37629605e-03, 1.47837967e-02, 8.48588394e-03, + -2.44306780e-02, 2.51407475e-02, 9.00788587e-02, -3.86962806e-02, + 1.00981570e-02, -2.30733399e-02, 8.88238223e-03, 1.87327235e-01, + 7.82078768e-03, 1.15903691e-02, 1.17688038e-01, -3.52754034e-02, + -2.27927084e-02, 2.51836130e-02, 3.78113193e-02, -1.37819883e-02, + -5.14407103e-02, 3.27637737e-02, 7.96690236e-02, 1.55123192e-02, + -2.61900313e-01, 1.26166110e-01, 8.45325058e-01, -4.65998670e-01, + 5.54005627e-02, -3.41642928e-01, 9.68642180e-03, -3.90454599e-02, + 1.00389338e-02, 4.65571712e-02, 1.15928684e+00, -4.77995399e-01, + -2.83390614e-01, 1.72800266e-01, 3.32532185e-01, -2.48729412e-01, + 8.42008086e-03, 6.40218692e-03, 6.96861327e-03, 5.54499059e-03, + 5.32573390e-02, 4.00176588e-02, 1.65010843e-02, 2.94846560e-03, + -1.30378055e-02, 2.87952614e-02, 8.50464084e-03, 3.22234695e-03, + 7.45158123e-03, 8.33625533e-03, 2.18409550e-02, 1.17673068e-01, + -6.25692666e-04, 1.26102981e-02, 1.04194901e-02, 8.77085875e-03, + 8.57092634e-03, 1.50099719e-03, 3.74691927e-03, 6.92497563e-03, + 4.95548730e-03, 1.26214602e-02, 7.68623589e-02, 3.22241750e-02, + -6.67469147e-04, 3.34241506e-02, 8.42896447e-03, 5.68106373e-03, + 9.34261990e-03, 7.84752389e-03, -6.01895917e-03, 1.73243552e-02, + 2.71792485e-02, 1.09211191e-01, 5.87081736e-03, 3.98247822e-03, + 8.47609798e-03, 4.46687085e-03, 6.64618694e-03, 6.79043263e-03, + -1.92107784e-02, 2.29710396e-02, 2.10494165e-03, 1.10678046e-02, + 1.09827984e-01, 2.21189843e-02, 8.45301225e-03, 4.79815708e-03, + 9.35476131e-03, 8.53257990e-03, 1.45649552e-02, 8.51068920e-03, + 2.16399421e-02, 5.65570874e-05, 1.16516931e-02, 1.11793701e-01]) + ) + np.testing.assert_almost_equal( + cov[:, -2], np.array([2.97545513e-04, 3.73674365e-04, 5.65335837e-04, 1.26296962e-03, + 1.78908823e-04, 2.56302037e-04, 2.04758638e-04, 2.51139430e-04, + 2.13671861e-04, 2.67740643e-04, 3.73674365e-04, 6.43521925e-04, + 2.20310986e-05, 2.56475618e-03, 2.77320345e-04, 4.10989118e-04, + 3.60106616e-04, 3.82950737e-04, 3.44176352e-04, 4.13060339e-04, + 5.65335837e-04, 2.20310986e-05, 4.76178176e-03, -1.26492852e-03, + 1.54594043e-04, 1.38625113e-04, -2.92257216e-05, 2.29920401e-04, + 1.17082151e-04, 2.18245866e-04, 1.26296962e-03, 2.56475618e-03, + -1.26492852e-03, 1.25693491e-02, 1.11684923e-03, 1.64213060e-03, + 1.48910632e-03, 1.51278060e-03, 1.39205038e-03, 1.63005958e-03, + 1.78908823e-04, 2.77320345e-04, 1.54594043e-04, 1.11684923e-03, + 1.27124567e-04, 1.85742168e-04, 1.58722246e-04, 1.75834398e-04, + 1.55680003e-04, 1.88779851e-04, 2.56302037e-04, 4.10989118e-04, + 1.38625113e-04, 1.64213060e-03, 1.85742168e-04, 2.75215982e-04, + 2.39677168e-04, 2.56908116e-04, 2.30103832e-04, 2.77019648e-04, + 2.04758638e-04, 3.60106616e-04, -2.92257216e-05, 1.48910632e-03, + 1.58722246e-04, 2.39677168e-04, 2.17400680e-04, 2.17787980e-04, + 2.00425615e-04, 2.36415930e-04, 2.51139430e-04, 3.82950737e-04, + 2.29920401e-04, 1.51278060e-03, 1.75834398e-04, 2.56908116e-04, + 2.17787980e-04, 2.44108637e-04, 2.14989931e-04, 2.61993459e-04, + 2.13671861e-04, 3.44176352e-04, 1.17082151e-04, 1.39205038e-03, + 1.55680003e-04, 2.30103832e-04, 2.00425615e-04, 2.14989931e-04, + 1.92613893e-04, 2.31674848e-04, 2.67740643e-04, 4.13060339e-04, + 2.18245866e-04, 1.63005958e-03, 1.88779851e-04, 2.77019648e-04, + 2.36415930e-04, 2.61993459e-04, 2.31674848e-04, 2.81571542e-04]) + ) -# iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls -# 0 5.2443422e-01 2.05e+03 1.19e+00 -1.0 0.00e+00 - 0.00e+00 0.00e+00 0 -# 1 1.7949339e+00 1.99e+03 1.29e+03 -1.0 3.73e+01 2.0 1.08e-02 2.98e-02h 1 -# 2 1.9623501e+00 1.98e+03 1.29e+03 -1.0 4.68e+00 3.3 1.13e-01 4.06e-03h 1 -# 3 4.0176536e+00 1.88e+03 1.24e+03 -1.0 4.55e+00 2.9 3.66e-01 5.30e-02h 1 -# 4 8.4440161e+00 1.65e+03 1.78e+03 -1.0 3.35e+00 3.3 2.20e-01 1.19e-01h 1 + # simulate + # TestUtils.simulate(sol) # TODO: charbie -> fix this + # for now, it does not match because the integration is done in the multinode_constraint diff --git a/tests/test_penalty.py b/tests/test_penalty.py index 4b5dd376c..2b5067fa1 100644 --- a/tests/test_penalty.py +++ b/tests/test_penalty.py @@ -935,7 +935,7 @@ def custom_with_bounds(controller: PenaltyController): penalty.custom_function = custom_with_bounds with pytest.raises(RuntimeError): - penalty_type(penalty, PenaltyController(ocp, ocp.nlp[0], t, x, [], [], [], [], 0)) + penalty_type(penalty, PenaltyController(ocp, ocp.nlp[0], t, x, [], [], [], [], [], 0)) @pytest.mark.parametrize("assume_phase_dynamics", [True, False]) @@ -973,6 +973,7 @@ def test_PenaltyFunctionAbstract_get_node(node, ns, assume_phase_dynamics): nlp.U = np.linspace(10, 19, ns) nlp.X_scaled = nlp.X nlp.U_scaled = nlp.U + nlp.S = np.linspace(0, 0, ns + 1) tp = OptimizationVariableList(MX, assume_phase_dynamics=assume_phase_dynamics) tp.append("param", [MX(), MX(), MX()], MX(), BiMapping([], [])) nlp.parameters = tp["param"] From 707412191dc72a5d5e3204dc1b0548f6eb3ea976 Mon Sep 17 00:00:00 2001 From: Charbie Date: Fri, 14 Jul 2023 12:17:16 +0200 Subject: [PATCH 35/54] blacked --- bioptim/limits/penalty.py | 14 +- bioptim/optimization/solution.py | 4 +- .../variational_optimal_control_program.py | 7 +- tests/test_global_nmpc_final.py | 1 + tests/test_global_stochastic.py | 318 ++++++++++++++---- 5 files changed, 268 insertions(+), 76 deletions(-) diff --git a/bioptim/limits/penalty.py b/bioptim/limits/penalty.py index 315048244..e2f38508a 100644 --- a/bioptim/limits/penalty.py +++ b/bioptim/limits/penalty.py @@ -444,7 +444,9 @@ def minimize_qddot(penalty: PenaltyOption, controller: PenaltyController): if "qddot" not in controller.states and "qddot" not in controller.controls: return controller.dynamics( - controller.states.cx_start, controller.controls.cx_start, controller.parameters.cx, + controller.states.cx_start, + controller.controls.cx_start, + controller.parameters.cx, controller.stochastic_variables.cx_start, )[controller.states["qdot"].index, :] elif "qddot" in controller.states: @@ -551,10 +553,12 @@ def minimize_com_acceleration(penalty: PenaltyOption, controller: PenaltyControl com_ddot = controller.model.center_of_mass_acceleration( controller.states["q"].mx, controller.states["qdot"].mx, - controller.dynamics(controller.states.mx, controller.controls.mx, controller.parameters.mx, - controller.stochastic_variables.cx_start)[ - controller.states["qdot"].index, : - ], + controller.dynamics( + controller.states.mx, + controller.controls.mx, + controller.parameters.mx, + controller.stochastic_variables.cx_start, + )[controller.states["qdot"].index, :], ) # TODO scaled? var = [] diff --git a/bioptim/optimization/solution.py b/bioptim/optimization/solution.py index 41940e61c..b36947b4e 100644 --- a/bioptim/optimization/solution.py +++ b/bioptim/optimization/solution.py @@ -583,9 +583,7 @@ def init_from_vector(_sol: np.ndarray | DM): elif sol is None: self.ns = [] else: - raise ValueError( - "Solution called with unknown initializer" - ) + raise ValueError("Solution called with unknown initializer") def _to_unscaled_values(self, states_scaled, controls_scaled) -> tuple: """ diff --git a/bioptim/optimization/variational_optimal_control_program.py b/bioptim/optimization/variational_optimal_control_program.py index 7c057b41f..043ebfae2 100644 --- a/bioptim/optimization/variational_optimal_control_program.py +++ b/bioptim/optimization/variational_optimal_control_program.py @@ -236,7 +236,12 @@ def configure_dynamics_function( # Note: useless but needed to run bioptim as it need to test the size of xdot nlp.dynamics_func = Function( "ForwardDyn", - [nlp.states.scaled.mx_reduced, nlp.controls.scaled.mx_reduced, nlp.parameters.mx, nlp.stochastic_variables.mx], + [ + nlp.states.scaled.mx_reduced, + nlp.controls.scaled.mx_reduced, + nlp.parameters.mx, + nlp.stochastic_variables.mx, + ], [dynamics_dxdt], ["x", "u", "p", "s"], ["xdot"], diff --git a/tests/test_global_nmpc_final.py b/tests/test_global_nmpc_final.py index 9518da2e3..c55c8b37b 100644 --- a/tests/test_global_nmpc_final.py +++ b/tests/test_global_nmpc_final.py @@ -8,6 +8,7 @@ import numpy as np from bioptim import Solver, MultiCyclicCycleSolutions + @pytest.mark.parametrize("assume_phase_dynamics", [True, False]) def test_multi_cyclic_nmpc_get_final(assume_phase_dynamics): if platform.system() != "Linux": diff --git a/tests/test_global_stochastic.py b/tests/test_global_stochastic.py index b0776843b..999f45880 100644 --- a/tests/test_global_stochastic.py +++ b/tests/test_global_stochastic.py @@ -7,6 +7,7 @@ from .utils import TestUtils + def test_arm_reaching_muscle_driven(): from bioptim.examples.stochastic_optimal_control import arm_reaching_muscle_driven as ocp_module @@ -58,7 +59,12 @@ def test_arm_reaching_muscle_driven(): np.testing.assert_equal(g.shape, (426, 1)) # Check some of the results - states, controls, stochastic_variables, integrated_values = sol.states, sol.controls, sol.stochastic_variables, sol.integrated_values + states, controls, stochastic_variables, integrated_values = ( + sol.states, + sol.controls, + sol.stochastic_variables, + sol.integrated_values, + ) q, qdot, mus_activations = states["q"], states["qdot"], states["muscles"] mus_excitations = controls["muscles"] k, ee_ref, m = stochastic_variables["k"], stochastic_variables["ee_ref"], stochastic_variables["m"] @@ -70,87 +76,265 @@ def test_arm_reaching_muscle_driven(): np.testing.assert_almost_equal(qdot[:, 0], np.array((0, 0))) np.testing.assert_almost_equal(qdot[:, -2], np.array((0, 0))) np.testing.assert_almost_equal( - mus_activations[:, 0], np.array([0.03325451, 0.032017 , 0.01257345, 0.01548143, 0.00693818, - 0.02362305]) + mus_activations[:, 0], np.array([0.03325451, 0.032017, 0.01257345, 0.01548143, 0.00693818, 0.02362305]) ) np.testing.assert_almost_equal( - mus_activations[:, -2], np.array([0.04064909, 0.07082433, 0.01877212, 0.02148688, 0.00063566, - 0.02491778]) + mus_activations[:, -2], np.array([0.04064909, 0.07082433, 0.01877212, 0.02148688, 0.00063566, 0.02491778]) ) np.testing.assert_almost_equal( - mus_excitations[:, 0], np.array([0.02751848, 0.06879444, 0.0450344 , 0.00352429, 0.00024554, - 0.03168447]) + mus_excitations[:, 0], np.array([0.02751848, 0.06879444, 0.0450344, 0.00352429, 0.00024554, 0.03168447]) ) np.testing.assert_almost_equal( - mus_excitations[:, -2], np.array([0.0181344 , 0.04798581, 0.02832193, 0.01222864, 0.00102345, - 0.0088184]) + mus_excitations[:, -2], np.array([0.0181344, 0.04798581, 0.02832193, 0.01222864, 0.00102345, 0.0088184]) ) np.testing.assert_almost_equal( - k[:, 0], np.array([0.00999994, 0.01 , 0.00999999, 0.00999998, 0.00999997, - 0.00999999, 0.00999993, 0.01 , 0.00999999, 0.00999997, - 0.00999996, 0.00999999, 0.00999956, 0.00999936, 0.0099994 , - 0.00999943, 0.00999947, 0.00999938, 0.00999956, 0.00999936, - 0.0099994 , 0.00999943, 0.00999947, 0.00999938]) - ) - np.testing.assert_almost_equal( - ee_ref[:, 0], np.array([0.00812868, 0.05943125, 0.00812868, 0.00812868]) + k[:, 0], + np.array( + [ + 0.00999994, + 0.01, + 0.00999999, + 0.00999998, + 0.00999997, + 0.00999999, + 0.00999993, + 0.01, + 0.00999999, + 0.00999997, + 0.00999996, + 0.00999999, + 0.00999956, + 0.00999936, + 0.0099994, + 0.00999943, + 0.00999947, + 0.00999938, + 0.00999956, + 0.00999936, + 0.0099994, + 0.00999943, + 0.00999947, + 0.00999938, + ] + ), ) + np.testing.assert_almost_equal(ee_ref[:, 0], np.array([0.00812868, 0.05943125, 0.00812868, 0.00812868])) np.testing.assert_almost_equal( - m[:, 0], np.array([1.89901532e-01, 7.37629605e-03, 1.47837967e-02, 8.48588394e-03, - -2.44306780e-02, 2.51407475e-02, 9.00788587e-02, -3.86962806e-02, - 1.00981570e-02, -2.30733399e-02, 8.88238223e-03, 1.87327235e-01, - 7.82078768e-03, 1.15903691e-02, 1.17688038e-01, -3.52754034e-02, - -2.27927084e-02, 2.51836130e-02, 3.78113193e-02, -1.37819883e-02, - -5.14407103e-02, 3.27637737e-02, 7.96690236e-02, 1.55123192e-02, - -2.61900313e-01, 1.26166110e-01, 8.45325058e-01, -4.65998670e-01, - 5.54005627e-02, -3.41642928e-01, 9.68642180e-03, -3.90454599e-02, - 1.00389338e-02, 4.65571712e-02, 1.15928684e+00, -4.77995399e-01, - -2.83390614e-01, 1.72800266e-01, 3.32532185e-01, -2.48729412e-01, - 8.42008086e-03, 6.40218692e-03, 6.96861327e-03, 5.54499059e-03, - 5.32573390e-02, 4.00176588e-02, 1.65010843e-02, 2.94846560e-03, - -1.30378055e-02, 2.87952614e-02, 8.50464084e-03, 3.22234695e-03, - 7.45158123e-03, 8.33625533e-03, 2.18409550e-02, 1.17673068e-01, - -6.25692666e-04, 1.26102981e-02, 1.04194901e-02, 8.77085875e-03, - 8.57092634e-03, 1.50099719e-03, 3.74691927e-03, 6.92497563e-03, - 4.95548730e-03, 1.26214602e-02, 7.68623589e-02, 3.22241750e-02, - -6.67469147e-04, 3.34241506e-02, 8.42896447e-03, 5.68106373e-03, - 9.34261990e-03, 7.84752389e-03, -6.01895917e-03, 1.73243552e-02, - 2.71792485e-02, 1.09211191e-01, 5.87081736e-03, 3.98247822e-03, - 8.47609798e-03, 4.46687085e-03, 6.64618694e-03, 6.79043263e-03, - -1.92107784e-02, 2.29710396e-02, 2.10494165e-03, 1.10678046e-02, - 1.09827984e-01, 2.21189843e-02, 8.45301225e-03, 4.79815708e-03, - 9.35476131e-03, 8.53257990e-03, 1.45649552e-02, 8.51068920e-03, - 2.16399421e-02, 5.65570874e-05, 1.16516931e-02, 1.11793701e-01]) + m[:, 0], + np.array( + [ + 1.89901532e-01, + 7.37629605e-03, + 1.47837967e-02, + 8.48588394e-03, + -2.44306780e-02, + 2.51407475e-02, + 9.00788587e-02, + -3.86962806e-02, + 1.00981570e-02, + -2.30733399e-02, + 8.88238223e-03, + 1.87327235e-01, + 7.82078768e-03, + 1.15903691e-02, + 1.17688038e-01, + -3.52754034e-02, + -2.27927084e-02, + 2.51836130e-02, + 3.78113193e-02, + -1.37819883e-02, + -5.14407103e-02, + 3.27637737e-02, + 7.96690236e-02, + 1.55123192e-02, + -2.61900313e-01, + 1.26166110e-01, + 8.45325058e-01, + -4.65998670e-01, + 5.54005627e-02, + -3.41642928e-01, + 9.68642180e-03, + -3.90454599e-02, + 1.00389338e-02, + 4.65571712e-02, + 1.15928684e00, + -4.77995399e-01, + -2.83390614e-01, + 1.72800266e-01, + 3.32532185e-01, + -2.48729412e-01, + 8.42008086e-03, + 6.40218692e-03, + 6.96861327e-03, + 5.54499059e-03, + 5.32573390e-02, + 4.00176588e-02, + 1.65010843e-02, + 2.94846560e-03, + -1.30378055e-02, + 2.87952614e-02, + 8.50464084e-03, + 3.22234695e-03, + 7.45158123e-03, + 8.33625533e-03, + 2.18409550e-02, + 1.17673068e-01, + -6.25692666e-04, + 1.26102981e-02, + 1.04194901e-02, + 8.77085875e-03, + 8.57092634e-03, + 1.50099719e-03, + 3.74691927e-03, + 6.92497563e-03, + 4.95548730e-03, + 1.26214602e-02, + 7.68623589e-02, + 3.22241750e-02, + -6.67469147e-04, + 3.34241506e-02, + 8.42896447e-03, + 5.68106373e-03, + 9.34261990e-03, + 7.84752389e-03, + -6.01895917e-03, + 1.73243552e-02, + 2.71792485e-02, + 1.09211191e-01, + 5.87081736e-03, + 3.98247822e-03, + 8.47609798e-03, + 4.46687085e-03, + 6.64618694e-03, + 6.79043263e-03, + -1.92107784e-02, + 2.29710396e-02, + 2.10494165e-03, + 1.10678046e-02, + 1.09827984e-01, + 2.21189843e-02, + 8.45301225e-03, + 4.79815708e-03, + 9.35476131e-03, + 8.53257990e-03, + 1.45649552e-02, + 8.51068920e-03, + 2.16399421e-02, + 5.65570874e-05, + 1.16516931e-02, + 1.11793701e-01, + ] + ), ) np.testing.assert_almost_equal( - cov[:, -2], np.array([2.97545513e-04, 3.73674365e-04, 5.65335837e-04, 1.26296962e-03, - 1.78908823e-04, 2.56302037e-04, 2.04758638e-04, 2.51139430e-04, - 2.13671861e-04, 2.67740643e-04, 3.73674365e-04, 6.43521925e-04, - 2.20310986e-05, 2.56475618e-03, 2.77320345e-04, 4.10989118e-04, - 3.60106616e-04, 3.82950737e-04, 3.44176352e-04, 4.13060339e-04, - 5.65335837e-04, 2.20310986e-05, 4.76178176e-03, -1.26492852e-03, - 1.54594043e-04, 1.38625113e-04, -2.92257216e-05, 2.29920401e-04, - 1.17082151e-04, 2.18245866e-04, 1.26296962e-03, 2.56475618e-03, - -1.26492852e-03, 1.25693491e-02, 1.11684923e-03, 1.64213060e-03, - 1.48910632e-03, 1.51278060e-03, 1.39205038e-03, 1.63005958e-03, - 1.78908823e-04, 2.77320345e-04, 1.54594043e-04, 1.11684923e-03, - 1.27124567e-04, 1.85742168e-04, 1.58722246e-04, 1.75834398e-04, - 1.55680003e-04, 1.88779851e-04, 2.56302037e-04, 4.10989118e-04, - 1.38625113e-04, 1.64213060e-03, 1.85742168e-04, 2.75215982e-04, - 2.39677168e-04, 2.56908116e-04, 2.30103832e-04, 2.77019648e-04, - 2.04758638e-04, 3.60106616e-04, -2.92257216e-05, 1.48910632e-03, - 1.58722246e-04, 2.39677168e-04, 2.17400680e-04, 2.17787980e-04, - 2.00425615e-04, 2.36415930e-04, 2.51139430e-04, 3.82950737e-04, - 2.29920401e-04, 1.51278060e-03, 1.75834398e-04, 2.56908116e-04, - 2.17787980e-04, 2.44108637e-04, 2.14989931e-04, 2.61993459e-04, - 2.13671861e-04, 3.44176352e-04, 1.17082151e-04, 1.39205038e-03, - 1.55680003e-04, 2.30103832e-04, 2.00425615e-04, 2.14989931e-04, - 1.92613893e-04, 2.31674848e-04, 2.67740643e-04, 4.13060339e-04, - 2.18245866e-04, 1.63005958e-03, 1.88779851e-04, 2.77019648e-04, - 2.36415930e-04, 2.61993459e-04, 2.31674848e-04, 2.81571542e-04]) + cov[:, -2], + np.array( + [ + 2.97545513e-04, + 3.73674365e-04, + 5.65335837e-04, + 1.26296962e-03, + 1.78908823e-04, + 2.56302037e-04, + 2.04758638e-04, + 2.51139430e-04, + 2.13671861e-04, + 2.67740643e-04, + 3.73674365e-04, + 6.43521925e-04, + 2.20310986e-05, + 2.56475618e-03, + 2.77320345e-04, + 4.10989118e-04, + 3.60106616e-04, + 3.82950737e-04, + 3.44176352e-04, + 4.13060339e-04, + 5.65335837e-04, + 2.20310986e-05, + 4.76178176e-03, + -1.26492852e-03, + 1.54594043e-04, + 1.38625113e-04, + -2.92257216e-05, + 2.29920401e-04, + 1.17082151e-04, + 2.18245866e-04, + 1.26296962e-03, + 2.56475618e-03, + -1.26492852e-03, + 1.25693491e-02, + 1.11684923e-03, + 1.64213060e-03, + 1.48910632e-03, + 1.51278060e-03, + 1.39205038e-03, + 1.63005958e-03, + 1.78908823e-04, + 2.77320345e-04, + 1.54594043e-04, + 1.11684923e-03, + 1.27124567e-04, + 1.85742168e-04, + 1.58722246e-04, + 1.75834398e-04, + 1.55680003e-04, + 1.88779851e-04, + 2.56302037e-04, + 4.10989118e-04, + 1.38625113e-04, + 1.64213060e-03, + 1.85742168e-04, + 2.75215982e-04, + 2.39677168e-04, + 2.56908116e-04, + 2.30103832e-04, + 2.77019648e-04, + 2.04758638e-04, + 3.60106616e-04, + -2.92257216e-05, + 1.48910632e-03, + 1.58722246e-04, + 2.39677168e-04, + 2.17400680e-04, + 2.17787980e-04, + 2.00425615e-04, + 2.36415930e-04, + 2.51139430e-04, + 3.82950737e-04, + 2.29920401e-04, + 1.51278060e-03, + 1.75834398e-04, + 2.56908116e-04, + 2.17787980e-04, + 2.44108637e-04, + 2.14989931e-04, + 2.61993459e-04, + 2.13671861e-04, + 3.44176352e-04, + 1.17082151e-04, + 1.39205038e-03, + 1.55680003e-04, + 2.30103832e-04, + 2.00425615e-04, + 2.14989931e-04, + 1.92613893e-04, + 2.31674848e-04, + 2.67740643e-04, + 4.13060339e-04, + 2.18245866e-04, + 1.63005958e-03, + 1.88779851e-04, + 2.77019648e-04, + 2.36415930e-04, + 2.61993459e-04, + 2.31674848e-04, + 2.81571542e-04, + ] + ), ) # simulate From c599dfb98a1c984c93edf34b1918bb92a62ec631 Mon Sep 17 00:00:00 2001 From: Charbie Date: Fri, 14 Jul 2023 13:03:40 +0200 Subject: [PATCH 36/54] cleaned example + refactor --- bioptim/dynamics/configure_problem.py | 8 +- bioptim/examples/getting_started/pendulum.py | 5 - .../LeuvenArmModel.py | 254 ++++++ .../arm_reaching_muscle_driven.py | 749 +++++------------- .../arm_reaching_torque_driven.py | 413 ++++------ bioptim/limits/multinode_penalty.py | 20 +- bioptim/limits/penalty.py | 4 +- bioptim/optimization/problem_type.py | 20 +- .../stochastic_optimal_control_program.py | 42 +- tests/test_global_stochastic.py | 14 +- 10 files changed, 655 insertions(+), 874 deletions(-) create mode 100644 bioptim/examples/stochastic_optimal_control/LeuvenArmModel.py diff --git a/bioptim/dynamics/configure_problem.py b/bioptim/dynamics/configure_problem.py index 50d58721e..190f9566f 100644 --- a/bioptim/dynamics/configure_problem.py +++ b/bioptim/dynamics/configure_problem.py @@ -1420,7 +1420,7 @@ def configure_stochastic_cov(ocp, nlp, n_noised_states: int, initial_matrix: DM) ) @staticmethod - def configure_stochastic_ee_ref(ocp, nlp, n_references: int): + def configure_stochastic_ref(ocp, nlp, n_references: int): """ Configure the reference kinematics. Parameters @@ -1428,16 +1428,16 @@ def configure_stochastic_ee_ref(ocp, nlp, n_references: int): nlp: NonLinearProgram A reference to the phase """ - name = "ee_ref" + name = "ref" if name in nlp.variable_mappings: raise NotImplementedError(f"Stochastic variables and mapping cannot be use together for now.") - name_ee_ref = [f"reference_{i}" for i in range(n_references)] + name_ref = [f"reference_{i}" for i in range(n_references)] nlp.variable_mappings[name] = BiMapping(list(range(n_references)), list(range(n_references))) ConfigureProblem.configure_new_variable( name, - name_ee_ref, + name_ref, ocp, nlp, as_states=False, diff --git a/bioptim/examples/getting_started/pendulum.py b/bioptim/examples/getting_started/pendulum.py index de4546be8..0c0c9d1c6 100644 --- a/bioptim/examples/getting_started/pendulum.py +++ b/bioptim/examples/getting_started/pendulum.py @@ -93,9 +93,6 @@ def prepare_ocp( u_init = InitialGuessList() u_init["tau"] = [0] * n_tau - s_bounds = BoundsList() - s_init = InitialGuessList() - return OptimalControlProgram( bio_model, dynamics, @@ -103,10 +100,8 @@ def prepare_ocp( final_time, x_init=x_init, u_init=u_init, - s_init=s_init, x_bounds=x_bounds, u_bounds=u_bounds, - s_bounds=s_bounds, objective_functions=objective_functions, ode_solver=ode_solver, use_sx=use_sx, diff --git a/bioptim/examples/stochastic_optimal_control/LeuvenArmModel.py b/bioptim/examples/stochastic_optimal_control/LeuvenArmModel.py new file mode 100644 index 000000000..3a818af78 --- /dev/null +++ b/bioptim/examples/stochastic_optimal_control/LeuvenArmModel.py @@ -0,0 +1,254 @@ +""" +This file contains the model used in the article. +""" + +from typing import Callable +import casadi as cas +import numpy as np + +class LeuvenArmModel: + """ + This allows to generate the same model as in the paper. + """ + + def __init__(self): + self.dM_coefficients = np.array( + [ + [0, 0, 0.0100, 0.0300, -0.0110, 1.9000], + [0, 0, 0.0100, -0.0190, 0, 0.0100], + [0.0400, -0.0080, 1.9000, 0, 0, 0.0100], + [-0.0420, 0, 0.0100, 0, 0, 0.0100], + [0.0300, -0.0110, 1.9000, 0.0320, -0.0100, 1.9000], + [-0.0390, 0, 0.0100, -0.0220, 0, 0.0100], + ] + ) + self.LMT_coefficients = np.array( + [ + [1.1000, -5.206336195535022], + [0.8000, -7.538918356984516], + [1.2000, -3.938098437958920], + [0.7000, -3.031522725559912], + [1.1000, -2.522778221157014], + [0.8500, -1.826368199415192], + ] + ) + self.vMtilde_max = np.ones((6, 1)) * 10 + self.Fiso = np.array([572.4000, 445.2000, 699.6000, 381.6000, 159.0000, 318.0000]) + self.Faparam = np.array( + [ + 0.814483478343008, + 1.055033428970575, + 0.162384573599574, + 0.063303448465465, + 0.433004984392647, + 0.716775413397760, + -0.029947116970696, + 0.200356847296188, + ] + ) + self.Fvparam = np.array([-0.318323436899127, -8.149156043475250, -0.374121508647863, 0.885644059915004]) + self.Fpparam = np.array([-0.995172050006169, 53.598150033144236]) + self.muscleDampingCoefficient = np.ones((6, 1)) * 0.01 + + self.a_shoulder = self.dM_coefficients[:, 0] + self.b_shoulder = self.dM_coefficients[:, 1] + self.c_shoulder = self.dM_coefficients[:, 2] + self.a_elbow = self.dM_coefficients[:, 3] + self.b_elbow = self.dM_coefficients[:, 4] + self.c_elbow = self.dM_coefficients[:, 5] + self.l_base = self.LMT_coefficients[:, 0] + self.l_multiplier = self.LMT_coefficients[:, 1] + + # Active muscle force-length characteristic + self.b11 = self.Faparam[0] + self.b21 = self.Faparam[1] + self.b31 = self.Faparam[2] + self.b41 = self.Faparam[3] + self.b12 = self.Faparam[4] + self.b22 = self.Faparam[5] + self.b32 = self.Faparam[6] + self.b42 = self.Faparam[7] + self.b13 = 0.1 + self.b23 = 1 + self.b33 = 0.5 * cas.sqrt(0.5) + self.b43 = 0 + + self.e0 = 0.6 + self.e1 = self.Fvparam[0] + self.e2 = self.Fvparam[1] + self.e3 = self.Fvparam[2] + self.e4 = self.Fvparam[3] + + self.kpe = 4 + self.tau_coef = 0.1500 + + self.l1 = 0.3 + self.l2 = 0.33 + self.m2 = 1 + self.lc2 = 0.16 + self.I1 = 0.025 + self.I2 = 0.045 + + self.friction = np.array([[0.05, 0.025], [0.025, 0.05]]) + + def serialize(self) -> tuple[Callable, dict]: + return LeuvenArmModel, dict( + dM_coefficients=self.dM_coefficients, + LMT_coefficients=self.LMT_coefficients, + vMtilde_max=self.vMtilde_max, + Fiso=self.Fiso, + Faparam=self.Faparam, + Fvparam=self.Fvparam, + Fpparam=self.Fpparam, + muscleDampingCoefficient=self.muscleDampingCoefficient, + friction=self.friction, + ) + + @property + def nb_muscles(self): + return 6 + + @property + def nb_q(self): + return 2 + + @property + def nb_qdot(self): + return 2 + + @property + def name_dof(self): + return ["shoulder", "elbow"] + + @property + def muscle_names(self): + return [f"muscle_{i}" for i in range(self.nb_muscles)] + + def get_muscle_force(self, q, qdot): + """ + Fa: active muscle force [N] + Fp: passive muscle force [N] + lMtilde: normalized fiber lenght [-] + vMtilde: optimal fiber lenghts per second at which muscle is lengthening or shortening [-] + FMltilde: force-length multiplier [-] + FMvtilde: force-velocity multiplier [-] + Fce: Active muscle force [N] + Fpe: Passive elastic force [N] + Fm: Passive viscous force [N] + """ + theta_shoulder = q[0] + theta_elbow = q[1] + dtheta_shoulder = qdot[0] + dtheta_elbow = qdot[1] + + # Normalized muscle fiber length (without tendon) + l_full = ( + self.a_shoulder * theta_shoulder + + self.b_shoulder * cas.sin(self.c_shoulder * theta_shoulder) / self.c_shoulder + + self.a_elbow * theta_elbow + + self.b_elbow * cas.sin(self.c_elbow * theta_elbow) / self.c_elbow + ) + lMtilde = l_full * self.l_multiplier + self.l_base + + # Fiber velocity normalized by the optimal fiber length + nCoeff = self.a_shoulder.shape[0] + v_full = ( + self.a_shoulder * dtheta_shoulder + + self.b_shoulder * cas.cos(self.c_shoulder * theta_shoulder) * cas.repmat(dtheta_shoulder, nCoeff, 1) + + self.a_elbow * dtheta_elbow + + self.b_elbow * cas.cos(self.c_elbow * theta_elbow) * cas.repmat(dtheta_elbow, nCoeff, 1) + ) + vMtilde = self.l_multiplier * v_full + + vMtilde_normalizedToMaxVelocity = vMtilde / self.vMtilde_max + + num3 = lMtilde - self.b23 + den3 = self.b33 + self.b43 * lMtilde + FMtilde3 = self.b13 * cas.exp(-0.5 * num3**2 / den3**2) + + num1 = lMtilde - self.b21 + den1 = self.b31 + self.b41 * lMtilde + FMtilde1 = self.b11 * cas.exp(-0.5 * num1**2 / den1**2) + + num2 = lMtilde - self.b22 + den2 = self.b32 + self.b42 * lMtilde + FMtilde2 = self.b12 * cas.exp(-0.5 * num2**2 / den2**2) + + FMltilde = FMtilde1 + FMtilde2 + FMtilde3 + + FMvtilde = ( + self.e1 + * cas.log( + (self.e2 @ vMtilde_normalizedToMaxVelocity + self.e3) + + cas.sqrt((self.e2 @ vMtilde_normalizedToMaxVelocity + self.e3) ** 2 + 1) + ) + + self.e4 + ) + + # Active muscle force + Fce = FMltilde * FMvtilde + + t5 = cas.exp(self.kpe * (lMtilde - 0.10e1) / self.e0) + Fpe = ((t5 - 0.10e1) - self.Fpparam[0]) / self.Fpparam[1] + + # Muscle force + damping + Fpv = self.muscleDampingCoefficient * vMtilde_normalizedToMaxVelocity + Fa = self.Fiso * Fce + Fp = self.Fiso * (Fpe + Fpv) + + return Fa, Fp + + def torque_force_relationship(self, Fm, q): + theta_shoulder = q[0] + theta_elbow = q[1] + dM_matrix = cas.horzcat( + self.a_shoulder + self.b_shoulder * cas.cos(self.c_shoulder @ theta_shoulder), + self.a_elbow + self.b_elbow * cas.cos(self.c_elbow @ theta_elbow), + ).T + tau = dM_matrix @ Fm + return tau + + def get_muscle_torque(self, q, qdot, mus_activations): + Fa, Fp = self.get_muscle_force(q, qdot) + Fm = mus_activations * Fa + Fp + muscles_tau = self.torque_force_relationship(Fm, q) + return muscles_tau + + def get_force_field(self, q, force_field_magnitude): + F_forceField = force_field_magnitude * (self.l1 * cas.cos(q[0]) + self.l2 * cas.cos(q[0] + q[1])) + hand_pos = cas.MX(2, 1) + hand_pos[0] = self.l2 * cas.sin(q[0] + q[1]) + self.l1 * cas.sin(q[0]) + hand_pos[1] = self.l2 * cas.sin(q[0] + q[1]) + tau_force_field = -F_forceField @ hand_pos + return tau_force_field + + def get_excitation_with_feedback(self, K, EE, EE_ref, sensory_noise): + return K @ ((EE - EE_ref) + sensory_noise) + + def end_effector_position(self, q): + theta_shoulder = q[0] + theta_elbow = q[1] + ee_pos = cas.vertcat( + cas.cos(theta_shoulder) * self.l1 + cas.cos(theta_shoulder + theta_elbow) * self.l2, + cas.sin(theta_shoulder) * self.l1 + cas.sin(theta_shoulder + theta_elbow) * self.l2, + ) + return ee_pos + + def end_effector_velocity(self, q, qdot): + theta_shoulder = q[0] + theta_elbow = q[1] + a = theta_shoulder + theta_elbow + dtheta_shoulder = qdot[0] + dtheta_elbow = qdot[1] + da = dtheta_shoulder + dtheta_elbow + ee_vel = cas.vertcat( + dtheta_shoulder * cas.sin(theta_shoulder) * self.l1 + da * cas.sin(a) * self.l2, + -dtheta_shoulder * cas.cos(theta_shoulder) * self.l1 - da * cas.cos(a) * self.l2, + ) + return ee_vel + + def end_effector_pos_velo(self, q, qdot) -> cas.MX: + hand_pos = self.end_effector_position(q) + hand_vel = self.end_effector_velocity(q, qdot) + ee = cas.vertcat(hand_pos, hand_vel) + return ee diff --git a/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py b/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py index b3b32c704..616b573aa 100644 --- a/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py +++ b/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py @@ -2,7 +2,7 @@ This example replicates the results from "An approximate stochastic optimal control framework to simulate nonlinear neuro-musculoskeletal models in the presence of noise"(https://doi.org/10.1371/journal.pcbi.1009338). The task is to unfold the arm to reach a target further from the trunk. -Noise is added on the motor execution (wM) and on the feedback (wEE=wP and wEE_dot=wPdot). +Noise is added on the motor execution (motor_noise) and on the feedback (wEE=wP and wEE_dot=wPdot). The expected joint angles (x_mean) are optimized like in a deterministic OCP, but the covariance matrix is minimized to reduce uncertainty. This covariance matrix is computed from the expected states. """ @@ -17,8 +17,6 @@ import numpy as np import scipy.io as sio -# import sys -# sys.path.append("/home/charbie/Documents/Programmation/BiorbdOptim") from bioptim import ( OptimalControlProgram, StochasticOptimalControlProgram, @@ -42,248 +40,7 @@ MultinodeObjectiveList, ) - -class LeuvenArmModel: - """ - This allows to generate the same model as in the paper. - """ - - def __init__(self): - self.dM_coefficients = np.array( - [ - [0, 0, 0.0100, 0.0300, -0.0110, 1.9000], - [0, 0, 0.0100, -0.0190, 0, 0.0100], - [0.0400, -0.0080, 1.9000, 0, 0, 0.0100], - [-0.0420, 0, 0.0100, 0, 0, 0.0100], - [0.0300, -0.0110, 1.9000, 0.0320, -0.0100, 1.9000], - [-0.0390, 0, 0.0100, -0.0220, 0, 0.0100], - ] - ) - self.LMT_coefficients = np.array( - [ - [1.1000, -5.206336195535022], - [0.8000, -7.538918356984516], - [1.2000, -3.938098437958920], - [0.7000, -3.031522725559912], - [1.1000, -2.522778221157014], - [0.8500, -1.826368199415192], - ] - ) - self.vMtilde_max = np.ones((6, 1)) * 10 - self.Fiso = np.array([572.4000, 445.2000, 699.6000, 381.6000, 159.0000, 318.0000]) - self.Faparam = np.array( - [ - 0.814483478343008, - 1.055033428970575, - 0.162384573599574, - 0.063303448465465, - 0.433004984392647, - 0.716775413397760, - -0.029947116970696, - 0.200356847296188, - ] - ) - self.Fvparam = np.array([-0.318323436899127, -8.149156043475250, -0.374121508647863, 0.885644059915004]) - self.Fpparam = np.array([-0.995172050006169, 53.598150033144236]) - self.muscleDampingCoefficient = np.ones((6, 1)) * 0.01 - - self.a_shoulder = self.dM_coefficients[:, 0] - self.b_shoulder = self.dM_coefficients[:, 1] - self.c_shoulder = self.dM_coefficients[:, 2] - self.a_elbow = self.dM_coefficients[:, 3] - self.b_elbow = self.dM_coefficients[:, 4] - self.c_elbow = self.dM_coefficients[:, 5] - self.l_base = self.LMT_coefficients[:, 0] - self.l_multiplier = self.LMT_coefficients[:, 1] - - # Active muscle force-length characteristic - self.b11 = self.Faparam[0] - self.b21 = self.Faparam[1] - self.b31 = self.Faparam[2] - self.b41 = self.Faparam[3] - self.b12 = self.Faparam[4] - self.b22 = self.Faparam[5] - self.b32 = self.Faparam[6] - self.b42 = self.Faparam[7] - self.b13 = 0.1 - self.b23 = 1 - self.b33 = 0.5 * cas.sqrt(0.5) - self.b43 = 0 - - self.e0 = 0.6 - self.e1 = self.Fvparam[0] - self.e2 = self.Fvparam[1] - self.e3 = self.Fvparam[2] - self.e4 = self.Fvparam[3] - - self.kpe = 4 - self.tau_coef = 0.1500 - - self.l1 = 0.3 - self.l2 = 0.33 - self.m2 = 1 - self.lc2 = 0.16 - self.I1 = 0.025 - self.I2 = 0.045 - - self.friction = np.array([[0.05, 0.025], [0.025, 0.05]]) - - def serialize(self) -> tuple[Callable, dict]: - return LeuvenArmModel, dict( - dM_coefficients=self.dM_coefficients, - LMT_coefficients=self.LMT_coefficients, - vMtilde_max=self.vMtilde_max, - Fiso=self.Fiso, - Faparam=self.Faparam, - Fvparam=self.Fvparam, - Fpparam=self.Fpparam, - muscleDampingCoefficient=self.muscleDampingCoefficient, - friction=self.friction, - ) - - @property - def nb_muscles(self): - return 6 - - @property - def nb_q(self): - return 2 - - @property - def nb_qdot(self): - return 2 - - @property - def name_dof(self): - return ["shoulder", "elbow"] - - @property - def muscle_names(self): - return [f"muscle_{i}" for i in range(self.nb_muscles)] - - def get_muscle_force(self, q, qdot): - """ - Fa: active muscle force [N] - Fp: passive muscle force [N] - lMtilde: normalized fiber lenght [-] - vMtilde: optimal fiber lenghts per second at which muscle is lengthening or shortening [-] - FMltilde: force-length multiplier [-] - FMvtilde: force-velocity multiplier [-] - Fce: Active muscle force [N] - Fpe: Passive elastic force [N] - Fm: Passive viscous force [N] - """ - theta_shoulder = q[0] - theta_elbow = q[1] - dtheta_shoulder = qdot[0] - dtheta_elbow = qdot[1] - - # Normalized muscle fiber length (without tendon) - l_full = ( - self.a_shoulder * theta_shoulder - + self.b_shoulder * cas.sin(self.c_shoulder * theta_shoulder) / self.c_shoulder - + self.a_elbow * theta_elbow - + self.b_elbow * cas.sin(self.c_elbow * theta_elbow) / self.c_elbow - ) - lMtilde = l_full * self.l_multiplier + self.l_base - - # Fiber velocity normalized by the optimal fiber length - nCoeff = self.a_shoulder.shape[0] - v_full = ( - self.a_shoulder * dtheta_shoulder - + self.b_shoulder * cas.cos(self.c_shoulder * theta_shoulder) * cas.repmat(dtheta_shoulder, nCoeff, 1) - + self.a_elbow * dtheta_elbow - + self.b_elbow * cas.cos(self.c_elbow * theta_elbow) * cas.repmat(dtheta_elbow, nCoeff, 1) - ) - vMtilde = self.l_multiplier * v_full - - vMtilde_normalizedToMaxVelocity = vMtilde / self.vMtilde_max - - num3 = lMtilde - self.b23 - den3 = self.b33 + self.b43 * lMtilde - FMtilde3 = self.b13 * cas.exp(-0.5 * num3**2 / den3**2) - - num1 = lMtilde - self.b21 - den1 = self.b31 + self.b41 * lMtilde - FMtilde1 = self.b11 * cas.exp(-0.5 * num1**2 / den1**2) - - num2 = lMtilde - self.b22 - den2 = self.b32 + self.b42 * lMtilde - FMtilde2 = self.b12 * cas.exp(-0.5 * num2**2 / den2**2) - - FMltilde = FMtilde1 + FMtilde2 + FMtilde3 - - FMvtilde = ( - self.e1 - * cas.log( - (self.e2 @ vMtilde_normalizedToMaxVelocity + self.e3) - + cas.sqrt((self.e2 @ vMtilde_normalizedToMaxVelocity + self.e3) ** 2 + 1) - ) - + self.e4 - ) - - # Active muscle force - Fce = FMltilde * FMvtilde - - t5 = cas.exp(self.kpe * (lMtilde - 0.10e1) / self.e0) - Fpe = ((t5 - 0.10e1) - self.Fpparam[0]) / self.Fpparam[1] - - # Muscle force + damping - Fpv = self.muscleDampingCoefficient * vMtilde_normalizedToMaxVelocity - Fa = self.Fiso * Fce - Fp = self.Fiso * (Fpe + Fpv) - - return Fa, Fp - - def torque_force_relationship(self, Fm, q): - theta_shoulder = q[0] - theta_elbow = q[1] - dM_matrix = cas.horzcat( - self.a_shoulder + self.b_shoulder * cas.cos(self.c_shoulder @ theta_shoulder), - self.a_elbow + self.b_elbow * cas.cos(self.c_elbow @ theta_elbow), - ).T - tau = dM_matrix @ Fm - return tau - - def get_muscle_torque(self, q, qdot, mus_activations): - Fa, Fp = self.get_muscle_force(q, qdot) - Fm = mus_activations * Fa + Fp - muscles_tau = self.torque_force_relationship(Fm, q) - return muscles_tau - - def get_force_field(self, q, force_field_magnitude): - F_forceField = force_field_magnitude * (self.l1 * cas.cos(q[0]) + self.l2 * cas.cos(q[0] + q[1])) - hand_pos = cas.MX(2, 1) - hand_pos[0] = self.l2 * cas.sin(q[0] + q[1]) + self.l1 * cas.sin(q[0]) - hand_pos[1] = self.l2 * cas.sin(q[0] + q[1]) - tau_force_field = -F_forceField @ hand_pos - return tau_force_field - - def get_excitation_with_feedback(self, K, EE, EE_ref, wS): - return K @ ((EE - EE_ref) + wS) - - def end_effector_position(self, q): - theta_shoulder = q[0] - theta_elbow = q[1] - ee_pos = cas.vertcat( - cas.cos(theta_shoulder) * self.l1 + cas.cos(theta_shoulder + theta_elbow) * self.l2, - cas.sin(theta_shoulder) * self.l1 + cas.sin(theta_shoulder + theta_elbow) * self.l2, - ) - return ee_pos - - def end_effector_velocity(self, q, qdot): - theta_shoulder = q[0] - theta_elbow = q[1] - a = theta_shoulder + theta_elbow - dtheta_shoulder = qdot[0] - dtheta_elbow = qdot[1] - da = dtheta_shoulder + dtheta_elbow - ee_vel = cas.vertcat( - dtheta_shoulder * cas.sin(theta_shoulder) * self.l1 + da * cas.sin(a) * self.l2, - -dtheta_shoulder * cas.cos(theta_shoulder) * self.l1 - da * cas.cos(a) * self.l2, - ) - return ee_vel - +from bioptim.examples.stochastic_optimal_control.LeuvenArmModel import LeuvenArmModel def stochastic_forward_dynamics( states: cas.MX | cas.SX, @@ -291,11 +48,12 @@ def stochastic_forward_dynamics( parameters: cas.MX | cas.SX, stochastic_variables: cas.MX | cas.SX, nlp: NonLinearProgram, - wM, - wS, + motor_noise, + sensory_noise, force_field_magnitude, with_gains, ) -> DynamicsEvaluation: + q = DynamicsFunctions.get(nlp.states["q"], states) qdot = DynamicsFunctions.get(nlp.states["qdot"], states) mus_activations = DynamicsFunctions.get(nlp.states["muscles"], states) @@ -303,26 +61,26 @@ def stochastic_forward_dynamics( mus_excitations_fb = mus_excitations if with_gains: - ee_ref = DynamicsFunctions.get(nlp.stochastic_variables["ee_ref"], stochastic_variables) + ref = DynamicsFunctions.get(nlp.stochastic_variables["ref"], stochastic_variables) k = DynamicsFunctions.get(nlp.stochastic_variables["k"], stochastic_variables) - K_matrix = cas.MX(4, 6) + k_matrix = cas.MX(4, 6) for s0 in range(4): for s1 in range(6): - K_matrix[s0, s1] = k[s0 * 6 + s1] - K_matrix = K_matrix.T + k_matrix[s0, s1] = k[s0 * 6 + s1] + k_matrix = k_matrix.T hand_pos = nlp.model.end_effector_position(q) hand_vel = nlp.model.end_effector_velocity(q, qdot) ee = cas.vertcat(hand_pos, hand_vel) - mus_excitations_fb += nlp.model.get_excitation_with_feedback(K_matrix, ee, ee_ref, wS) + mus_excitations_fb += nlp.model.get_excitation_with_feedback(k_matrix, ee, ref, sensory_noise) muscles_tau = nlp.model.get_muscle_torque(q, qdot, mus_activations) tau_force_field = nlp.model.get_force_field(q, force_field_magnitude) - torques_computed = muscles_tau + wM + tau_force_field - dq_computed = qdot ### Do not use "DynamicsFunctions.compute_qdot(nlp, q, qdot)" it introduces errors!! + torques_computed = muscles_tau + motor_noise + tau_force_field + dq_computed = qdot dactivations_computed = (mus_excitations_fb - mus_activations) / nlp.model.tau_coef a1 = nlp.model.I1 + nlp.model.I2 + nlp.model.m2 * nlp.model.l1**2 @@ -348,7 +106,7 @@ def stochastic_forward_dynamics( return DynamicsEvaluation(dxdt=cas.vertcat(dq_computed, dqdot_computed, dactivations_computed), defects=None) -def configure_stochastic_optimal_control_problem(ocp: OptimalControlProgram, nlp: NonLinearProgram, wM, wS): +def configure_stochastic_optimal_control_problem(ocp: OptimalControlProgram, nlp: NonLinearProgram, motor_noise, sensory_noise): ConfigureProblem.configure_q(ocp, nlp, True, False, False) ConfigureProblem.configure_qdot(ocp, nlp, True, False, True) ConfigureProblem.configure_qddot(ocp, nlp, False, False, True) @@ -358,18 +116,18 @@ def configure_stochastic_optimal_control_problem(ocp: OptimalControlProgram, nlp # Stochastic variables ConfigureProblem.configure_stochastic_k(ocp, nlp, n_noised_controls=6, n_feedbacks=4) - ConfigureProblem.configure_stochastic_ee_ref(ocp, nlp, n_references=4) + ConfigureProblem.configure_stochastic_ref(ocp, nlp, n_references=4) ConfigureProblem.configure_stochastic_m(ocp, nlp, n_noised_states=10) mat_p_init = cas.DM_eye(10) * np.array([1e-4, 1e-4, 1e-7, 1e-7, 1e-6, 1e-6, 1e-6, 1e-6, 1e-6, 1e-6]) # P ConfigureProblem.configure_stochastic_cov(ocp, nlp, n_noised_states=10, initial_matrix=mat_p_init) ConfigureProblem.configure_dynamics_function( ocp, nlp, - dyn_func=lambda states, controls, parameters, stochastic_variables, nlp, wM, wS: nlp.dynamics_type.dynamic_function( - states, controls, parameters, stochastic_variables, nlp, wM, wS, with_gains=False + dyn_func=lambda states, controls, parameters, stochastic_variables, nlp, motor_noise, sensory_noise: nlp.dynamics_type.dynamic_function( + states, controls, parameters, stochastic_variables, nlp, motor_noise, sensory_noise, with_gains=False ), - wM=wM, - wS=wS, + motor_noise=motor_noise, + sensory_noise=sensory_noise, expand=False, ) @@ -381,30 +139,22 @@ def minimize_uncertainty(controllers: list[PenaltyController], key: str) -> cas. dt = controllers[0].tf / controllers[0].ns out = 0 for i, ctrl in enumerate(controllers): - P_matrix = ctrl.integrated_values["cov"].reshape_to_matrix( + cov_matrix = ctrl.integrated_values["cov"].reshape_to_matrix( ctrl.integrated_values, ctrl.states.cx.shape[0], ctrl.states.cx.shape[0], Node.START, "cov" ) - P_partial = P_matrix[ctrl.states[key].index, ctrl.states[key].index] - out += cas.trace(P_partial) * dt + p_partial = cov_matrix[ctrl.states[key].index, ctrl.states[key].index] + out += cas.trace(p_partial) * dt return out - -def get_ee(controller: PenaltyController, q, qdot) -> cas.MX: - hand_pos = controller.model.end_effector_position(q) - hand_vel = controller.model.end_effector_velocity(q, qdot) - ee = cas.vertcat(hand_pos, hand_vel) - return ee - - -def ee_equals_ee_ref(controller: PenaltyController) -> cas.MX: +def hand_equals_ref(controller: PenaltyController) -> cas.MX: q = controller.states["q"].cx_start qdot = controller.states["qdot"].cx_start - ee_ref = controller.stochastic_variables["ee_ref"].cx_start - ee = get_ee(controller, q, qdot) - return ee - ee_ref + ref = controller.stochastic_variables["ref"].cx_start + ee = controller.model.end_effector_pos_velo(q, qdot) + return ee - ref -def get_p_mat(nlp, node_index, force_field_magnitude, wM_magnitude, wS_magnitude): +def get_cov_mat(nlp, node_index, force_field_magnitude, motor_noise_magnitude, sensory_noise_magnitude): dt = nlp.tf / nlp.ns nlp.states.node_index = node_index - 1 @@ -413,11 +163,11 @@ def get_p_mat(nlp, node_index, force_field_magnitude, wM_magnitude, wS_magnitude nlp.integrated_values.node_index = node_index - 1 nx = nlp.states.cx_start.shape[0] - M_matrix = nlp.stochastic_variables["m"].reshape_to_matrix(nlp.stochastic_variables, nx, nx, Node.START, "m") + m_matrix = nlp.stochastic_variables["m"].reshape_to_matrix(nlp.stochastic_variables, nx, nx, Node.START, "m") - wM = cas.MX.sym("wM", nlp.states["q"].cx_start.shape[0]) - wS = cas.MX.sym("wS", nlp.states["q"].cx_start.shape[0] * 2) - sigma_w = cas.vertcat(wS, wM) * cas.MX_eye(6) + motor_noise = cas.MX.sym("motor_noise", nlp.states["q"].cx_start.shape[0]) + sensory_noise = cas.MX.sym("sensory_noise", nlp.states["q"].cx_start.shape[0] * 2) + sigma_w = cas.vertcat(sensory_noise, motor_noise) * cas.MX_eye(6) cov_sym = cas.MX.sym("cov", nlp.integrated_values.cx_start.shape[0]) cov_sym_dict = {"cov": cov_sym} cov_sym_dict["cov"].cx_start = cov_sym @@ -429,18 +179,18 @@ def get_p_mat(nlp, node_index, force_field_magnitude, wM_magnitude, wS_magnitude nlp.parameters, nlp.stochastic_variables.cx_start, nlp, - wM, - wS, + motor_noise, + sensory_noise, force_field_magnitude=force_field_magnitude, with_gains=True, ) - ddx_dwM = cas.jacobian(dx.dxdt, cas.vertcat(wS, wM)) - dg_dw = -ddx_dwM * dt + ddx_dwm = cas.jacobian(dx.dxdt, cas.vertcat(sensory_noise, motor_noise)) + dg_dw = -ddx_dwm * dt ddx_dx = cas.jacobian(dx.dxdt, nlp.states.cx_start) dg_dx = -(ddx_dx * dt / 2 + cas.MX_eye(ddx_dx.shape[0])) - p_next = M_matrix @ (dg_dx @ cov_matrix @ dg_dx.T + dg_dw @ sigma_w @ dg_dw.T) @ M_matrix.T + p_next = m_matrix @ (dg_dx @ cov_matrix @ dg_dx.T + dg_dw @ sigma_w @ dg_dw.T) @ m_matrix.T func_eval = cas.Function( "p_next", [ @@ -449,8 +199,8 @@ def get_p_mat(nlp, node_index, force_field_magnitude, wM_magnitude, wS_magnitude nlp.parameters, nlp.stochastic_variables.cx_start, cov_sym, - wM, - wS, + motor_noise, + sensory_noise, ], [p_next], )( @@ -458,9 +208,9 @@ def get_p_mat(nlp, node_index, force_field_magnitude, wM_magnitude, wS_magnitude nlp.controls.cx_start, nlp.parameters, nlp.stochastic_variables.cx_start, - nlp.integrated_values["cov"].cx_start, # Should be the right shape to work - wM_magnitude, - wS_magnitude, + nlp.integrated_values["cov"].cx_start, + motor_noise_magnitude, + sensory_noise_magnitude, ) p_vector = nlp.integrated_values.reshape_to_vector(func_eval) return p_vector @@ -473,8 +223,8 @@ def reach_target_consistantly(controllers: list[PenaltyController]) -> cas.MX: applies at the END node. """ - Q = cas.MX.sym("q_sym", controllers[-1].states["q"].cx_start.shape[0]) - Qdot = cas.MX.sym("qdot_sym", controllers[-1].states["qdot"].cx_start.shape[0]) + q_sym = cas.MX.sym("q_sym", controllers[-1].states["q"].cx_start.shape[0]) + qdot_sym = cas.MX.sym("qdot_sym", controllers[-1].states["qdot"].cx_start.shape[0]) cov_sym = cas.MX.sym("cov", controllers[-1].integrated_values.cx_start.shape[0]) cov_sym_dict = {"cov": cov_sym} cov_sym_dict["cov"].cx_start = cov_sym @@ -490,21 +240,21 @@ def reach_target_consistantly(controllers: list[PenaltyController]) -> cas.MX: ) ) - hand_pos = controllers[0].model.end_effector_position(Q) - hand_vel = controllers[0].model.end_effector_velocity(Q, Qdot) + hand_pos = controllers[0].model.end_effector_position(q_sym) + hand_vel = controllers[0].model.end_effector_velocity(q_sym, qdot_sym) - jac_marker_q = cas.jacobian(hand_pos, Q) - jac_marker_qdot = cas.jacobian(hand_vel, cas.vertcat(Q, Qdot)) + jac_marker_q = cas.jacobian(hand_pos, q_sym) + jac_marker_qdot = cas.jacobian(hand_vel, cas.vertcat(q_sym, qdot_sym)) - P_matrix_q = cov_matrix[:2, :2] - P_matrix_qdot = cov_matrix[:4, :4] + cov_matrix_q = cov_matrix[:2, :2] + cov_matrix_qdot = cov_matrix[:4, :4] - pos_constraint = jac_marker_q @ P_matrix_q @ jac_marker_q.T - vel_constraint = jac_marker_qdot @ P_matrix_qdot @ jac_marker_qdot.T + pos_constraint = jac_marker_q @ cov_matrix_q @ jac_marker_q.T + vel_constraint = jac_marker_qdot @ cov_matrix_qdot @ jac_marker_qdot.T out = cas.vertcat(pos_constraint[0, 0], pos_constraint[1, 1], vel_constraint[0, 0], vel_constraint[1, 1]) - fun = cas.Function("reach_target_consistantly", [Q, Qdot, cov_sym], [out]) + fun = cas.Function("reach_target_consistantly", [q_sym, qdot_sym, cov_sym], [out]) val = fun( controllers[-1].states["q"].cx_start, controllers[-1].states["qdot"].cx_start, @@ -515,16 +265,16 @@ def reach_target_consistantly(controllers: list[PenaltyController]) -> cas.MX: return val -def expected_feedback_effort(controllers: list[PenaltyController], wS_magnitude: cas.DM) -> cas.MX: +def expected_feedback_effort(controllers: list[PenaltyController], sensory_noise_magnitude: cas.DM) -> cas.MX: """ ... """ dt = controllers[0].tf / controllers[0].ns - sensory_noise_matrix = wS_magnitude * cas.MX_eye(4) + sensory_noise_matrix = sensory_noise_magnitude * cas.MX_eye(4) # create the casadi function to be evaluated # Get the symbolic variables - ee_ref = controllers[0].stochastic_variables["ee_ref"].cx_start + ref = controllers[0].stochastic_variables["ref"].cx_start cov_sym = cas.MX.sym("cov", controllers[0].integrated_values.cx_start.shape[0]) cov_sym_dict = {"cov": cov_sym} cov_sym_dict["cov"].cx_start = cov_sym @@ -541,20 +291,20 @@ def expected_feedback_effort(controllers: list[PenaltyController], wS_magnitude: ) k = controllers[0].stochastic_variables["k"].cx_start - K_matrix = cas.MX(4, 6) + k_matrix = cas.MX(4, 6) for s0 in range(4): for s1 in range(6): - K_matrix[s0, s1] = k[s0 * 6 + s1] - K_matrix = K_matrix.T + k_matrix[s0, s1] = k[s0 * 6 + s1] + k_matrix = k_matrix.T # Compute the expected effort hand_pos = controllers[0].model.end_effector_position(controllers[0].states["q"].cx_start) hand_vel = controllers[0].model.end_effector_velocity( controllers[0].states["q"].cx_start, controllers[0].states["qdot"].cx_start ) - trace_k_sensor_k = cas.trace(K_matrix @ sensory_noise_matrix @ K_matrix.T) + trace_k_sensor_k = cas.trace(k_matrix @ sensory_noise_matrix @ k_matrix.T) ee = cas.vertcat(hand_pos, hand_vel) - e_fb = K_matrix @ ((ee - ee_ref) + wS_magnitude) + e_fb = k_matrix @ ((ee - ref) + sensory_noise_magnitude) jac_e_fb_x = cas.jacobian(e_fb, controllers[0].states.cx_start) trace_jac_p_jack = cas.trace(jac_e_fb_x @ cov_matrix @ jac_e_fb_x.T) expectedEffort_fb_mx = trace_jac_p_jack + trace_k_sensor_k @@ -574,7 +324,7 @@ def expected_feedback_effort(controllers: list[PenaltyController], wS_magnitude: def zero_acceleration( - controller: PenaltyController, wM: np.ndarray, wS: np.ndarray, force_field_magnitude: float + controller: PenaltyController, motor_noise: np.ndarray, sensory_noise: np.ndarray, force_field_magnitude: float ) -> cas.MX: dx = stochastic_forward_dynamics( controller.states.cx_start, @@ -582,8 +332,8 @@ def zero_acceleration( controller.parameters.cx_start, controller.stochastic_variables.cx_start, controller.get_nlp, - wM, - wS, + motor_noise, + sensory_noise, force_field_magnitude=force_field_magnitude, with_gains=False, ) @@ -596,35 +346,35 @@ def track_final_marker(controller: PenaltyController) -> cas.MX: return ee_pos -def leuven_trapezoidal(controllers: list[PenaltyController], force_field_magnitude) -> cas.MX: - wM = np.zeros((2, 1)) - wS = np.zeros((4, 1)) +def trapezoidal_integration_continuity_constraint(controllers: list[PenaltyController], force_field_magnitude) -> cas.MX: + motor_noise = np.zeros((2, 1)) + sensory_noise = np.zeros((4, 1)) dt = controllers[0].tf / controllers[0].ns - dX_i = stochastic_forward_dynamics( + dx_i = stochastic_forward_dynamics( controllers[0].states.cx_start, controllers[0].controls.cx_start, controllers[0].parameters.cx_start, controllers[0].stochastic_variables.cx_start, controllers[0].get_nlp, - wM, - wS, + motor_noise, + sensory_noise, force_field_magnitude=force_field_magnitude, with_gains=False, ).dxdt - dX_i_plus = stochastic_forward_dynamics( + dx_i_plus = stochastic_forward_dynamics( controllers[1].states.cx_start, controllers[1].controls.cx_start, controllers[1].parameters.cx_start, controllers[1].stochastic_variables.cx_start, controllers[1].get_nlp, - wM, - wS, + motor_noise, + sensory_noise, force_field_magnitude=force_field_magnitude, with_gains=False, ).dxdt - out = controllers[1].states.cx_start - (controllers[0].states.cx_start + (dX_i + dX_i_plus) / 2 * dt) + out = controllers[1].states.cx_start - (controllers[0].states.cx_start + (dx_i + dx_i_plus) / 2 * dt) return out * 1e3 @@ -633,8 +383,8 @@ def prepare_socp( final_time: float, n_shooting: int, ee_final_position: np.ndarray, - wM_magnitude: cas.DM, - wS_magnitude: cas.DM, + motor_noise_magnitude: cas.DM, + sensory_noise_magnitude: cas.DM, force_field_magnitude: float = 0, problem_type: str = "CIRCLE", ) -> StochasticOptimalControlProgram: @@ -650,8 +400,10 @@ def prepare_socp( The number of shooting points to define int the direct multiple shooting program ee_final_position: np.ndarray The final position of the end effector - ee_initial_position: np.ndarray - The initial position of the end effector + motor_noise_magnitude: cas.DM + The magnitude of the motor noise + sensory_noise_magnitude: cas.DM + The magnitude of the sensory noise force_field_magnitude: float The magnitude of the force field problem_type: str @@ -690,14 +442,14 @@ def prepare_socp( expected_feedback_effort, nodes_phase=[0 for _ in range(n_shooting)], nodes=[i for i in range(n_shooting)], - wS_magnitude=wS_magnitude, + sensory_noise_magnitude=sensory_noise_magnitude, weight=1e3 / 2, quadratic=False, ) # Constraints constraints = ConstraintList() - constraints.add(ee_equals_ee_ref, node=Node.ALL_SHOOTING) + constraints.add(hand_equals_ref, node=Node.ALL_SHOOTING) constraints.add( ConstraintFcn.TRACK_STATE, key="q", node=Node.START, target=np.array([shoulder_pos_initial, elbow_pos_initial]) ) @@ -705,8 +457,8 @@ def prepare_socp( constraints.add( zero_acceleration, node=Node.START, - wM=np.zeros((2, 1)), - wS=np.zeros((4, 1)), + motor_noise=np.zeros((2, 1)), + sensory_noise=np.zeros((4, 1)), force_field_magnitude=force_field_magnitude, ) constraints.add(track_final_marker, node=Node.PENULTIMATE, target=ee_final_position) @@ -714,8 +466,8 @@ def prepare_socp( constraints.add( zero_acceleration, node=Node.PENULTIMATE, - wM=np.zeros((2, 1)), - wS=np.zeros((4, 1)), + motor_noise=np.zeros((2, 1)), + sensory_noise=np.zeros((4, 1)), force_field_magnitude=force_field_magnitude, ) # Not possible sice the control on the last node is NaN constraints.add(ConstraintFcn.TRACK_CONTROL, key="muscles", node=Node.ALL_SHOOTING, min_bound=0.001, max_bound=1) @@ -741,26 +493,26 @@ def prepare_socp( ) for i in range(n_shooting - 1): multinode_constraints.add( - leuven_trapezoidal, nodes_phase=[0, 0], nodes=[i, i + 1], force_field_magnitude=force_field_magnitude + trapezoidal_integration_continuity_constraint, nodes_phase=[0, 0], nodes=[i, i + 1], force_field_magnitude=force_field_magnitude ) # Dynamics dynamics = DynamicsList() dynamics.add( configure_stochastic_optimal_control_problem, - dynamic_function=lambda states, controls, parameters, stochastic_variables, nlp, wM, wS, with_gains: stochastic_forward_dynamics( + dynamic_function=lambda states, controls, parameters, stochastic_variables, nlp, motor_noise, sensory_noise, with_gains: stochastic_forward_dynamics( states, controls, parameters, stochastic_variables, nlp, - wM, - wS, + motor_noise, + sensory_noise, force_field_magnitude=force_field_magnitude, with_gains=with_gains, ), - wM=np.zeros((2, 1)), - wS=np.zeros((4, 1)), + motor_noise=np.zeros((2, 1)), + sensory_noise=np.zeros((4, 1)), ) n_muscles = 6 @@ -793,133 +545,75 @@ def prepare_socp( controls_max = np.ones((n_muscles, 3)) * cas.inf u_bounds.add("muscles", min_bound=controls_min, max_bound=controls_max) - input_sol_FLAG = False # True - if input_sol_FLAG: - # load pickle - with open(f"leuvenarm_muscle_driven_socp_{problem_type}_forcefield{force_field_magnitude}.pkl", "rb") as f: - data = pickle.load(f) - q_sol = data["q_sol"] - qdot_sol = data["qdot_sol"] - activations_sol = data["activations_sol"] - excitations_sol = data["excitations_sol"] - k_sol = data["k_sol"] - ee_ref_sol = data["ee_ref_sol"] - m_sol = data["m_sol"] - # cov_sol = data["cov_sol"] - stochastic_variables_sol = data["stochastic_variables_sol"] - # Initial guesses - if not input_sol_FLAG: - states_init = np.zeros((n_states, n_shooting + 1)) - states_init[0, :-1] = np.linspace(shoulder_pos_initial, shoulder_pos_final, n_shooting) - states_init[0, -1] = shoulder_pos_final - states_init[1, :-1] = np.linspace(elbow_pos_initial, elbow_pos_final, n_shooting) - states_init[1, -1] = elbow_pos_final - states_init[n_q + n_qdot :, :] = 0.01 - else: - states_init = cas.vertcat(q_sol, qdot_sol, activations_sol) + states_init = np.zeros((n_states, n_shooting + 1)) + states_init[0, :-1] = np.linspace(shoulder_pos_initial, shoulder_pos_final, n_shooting) + states_init[0, -1] = shoulder_pos_final + states_init[1, :-1] = np.linspace(elbow_pos_initial, elbow_pos_final, n_shooting) + states_init[1, -1] = elbow_pos_final + states_init[n_q + n_qdot :, :] = 0.01 + x_init = InitialGuessList() x_init.add("q", initial_guess=states_init[:n_q, :], interpolation=InterpolationType.EACH_FRAME) x_init.add("qdot", initial_guess=states_init[n_q : n_q + n_qdot, :], interpolation=InterpolationType.EACH_FRAME) x_init.add("muscles", initial_guess=states_init[n_q + n_qdot :, :], interpolation=InterpolationType.EACH_FRAME) - if not input_sol_FLAG: - controls_init = np.ones((n_muscles, n_shooting)) * 0.01 - else: - controls_init = excitations_sol[:, :-1] + controls_init = np.ones((n_muscles, n_shooting)) * 0.01 + u_init = InitialGuessList() u_init.add("muscles", initial_guess=controls_init, interpolation=InterpolationType.EACH_FRAME) - # TODO: This should probably be done automatically, not defined by the user - n_stochastic = n_muscles * (n_q + n_qdot) + n_q + n_qdot + n_states * n_states # K(6x4) + ee_ref(4x1) + M(10x10) + n_stochastic = n_muscles * (n_q + n_qdot) + n_q + n_qdot + n_states * n_states # K(6x4) + ref(4x1) + M(10x10) s_init = InitialGuessList() s_bounds = BoundsList() stochastic_min = np.ones((n_stochastic, 3)) * -cas.inf stochastic_max = np.ones((n_stochastic, 3)) * cas.inf - if not input_sol_FLAG: - stochastic_init = np.zeros((n_stochastic, n_shooting + 1)) - curent_index = 0 - stochastic_init[: n_muscles * (n_q + n_qdot), :] = 0.01 # K - s_init.add( - "k", - initial_guess=stochastic_init[: n_muscles * (n_q + n_qdot), :], - interpolation=InterpolationType.EACH_FRAME, - ) - s_bounds.add( - "k", - min_bound=stochastic_min[: n_muscles * (n_q + n_qdot), :], - max_bound=stochastic_max[: n_muscles * (n_q + n_qdot), :], - ) - curent_index += n_muscles * (n_q + n_qdot) - stochastic_init[curent_index : curent_index + n_q + n_qdot, :] = 0.01 # ee_ref - # stochastic_init[curent_index : curent_index + n_q+n_qdot, 0] = np.array([ee_initial_position[0], ee_initial_position[1], 0, 0]) # ee_ref - # stochastic_init[curent_index : curent_index + n_q+n_qdot, 1] = np.array([ee_final_position[0], ee_final_position[1], 0, 0]) - s_init.add( - "ee_ref", - initial_guess=stochastic_init[curent_index : curent_index + n_q + n_qdot, :], - interpolation=InterpolationType.EACH_FRAME, - ) - s_bounds.add( - "ee_ref", - min_bound=stochastic_min[curent_index : curent_index + n_q + n_qdot, :], - max_bound=stochastic_max[curent_index : curent_index + n_q + n_qdot, :], - ) - curent_index += n_q + n_qdot - stochastic_init[curent_index : curent_index + n_states * n_states, :] = 0.01 # M - s_init.add( - "m", - initial_guess=stochastic_init[curent_index : curent_index + n_states * n_states, :], - interpolation=InterpolationType.EACH_FRAME, - ) - s_bounds.add( - "m", - min_bound=stochastic_min[curent_index : curent_index + n_states * n_states, :], - max_bound=stochastic_max[curent_index : curent_index + n_states * n_states, :], - ) - else: - stochastic_init = stochastic_variables_sol - curent_index = 0 - s_init.add( - "k", - initial_guess=stochastic_init[: n_muscles * (n_q + n_qdot), :], - interpolation=InterpolationType.EACH_FRAME, - ) - s_bounds.add( - "k", - min_bound=stochastic_min[: n_muscles * (n_q + n_qdot), :], - max_bound=stochastic_max[: n_muscles * (n_q + n_qdot), :], - ) - curent_index += n_muscles * (n_q + n_qdot) - s_init.add( - "ee_ref", - initial_guess=stochastic_init[curent_index : curent_index + n_q + n_qdot, :], - interpolation=InterpolationType.EACH_FRAME, - ) - s_bounds.add( - "ee_ref", - min_bound=stochastic_min[curent_index : curent_index + n_q + n_qdot, :], - max_bound=stochastic_max[curent_index : curent_index + n_q + n_qdot, :], - ) - curent_index += n_q + n_qdot - s_init.add( - "m", - initial_guess=stochastic_init[curent_index : curent_index + n_states * n_states, :], - interpolation=InterpolationType.EACH_FRAME, - ) - s_bounds.add( - "m", - min_bound=stochastic_min[curent_index : curent_index + n_states * n_states, :], - max_bound=stochastic_max[curent_index : curent_index + n_states * n_states, :], - ) - # TODO: we should probably change the name stochastic_variables -> helper_variables ? + stochastic_init = np.zeros((n_stochastic, n_shooting + 1)) + curent_index = 0 + stochastic_init[: n_muscles * (n_q + n_qdot), :] = 0.01 # K + s_init.add( + "k", + initial_guess=stochastic_init[: n_muscles * (n_q + n_qdot), :], + interpolation=InterpolationType.EACH_FRAME, + ) + s_bounds.add( + "k", + min_bound=stochastic_min[: n_muscles * (n_q + n_qdot), :], + max_bound=stochastic_max[: n_muscles * (n_q + n_qdot), :], + ) + curent_index += n_muscles * (n_q + n_qdot) + stochastic_init[curent_index : curent_index + n_q + n_qdot, :] = 0.01 # ref + s_init.add( + "ref", + initial_guess=stochastic_init[curent_index : curent_index + n_q + n_qdot, :], + interpolation=InterpolationType.EACH_FRAME, + ) + s_bounds.add( + "ref", + min_bound=stochastic_min[curent_index : curent_index + n_q + n_qdot, :], + max_bound=stochastic_max[curent_index : curent_index + n_q + n_qdot, :], + ) + curent_index += n_q + n_qdot + stochastic_init[curent_index : curent_index + n_states * n_states, :] = 0.01 # M + s_init.add( + "m", + initial_guess=stochastic_init[curent_index : curent_index + n_states * n_states, :], + interpolation=InterpolationType.EACH_FRAME, + ) + s_bounds.add( + "m", + min_bound=stochastic_min[curent_index : curent_index + n_states * n_states, :], + max_bound=stochastic_max[curent_index : curent_index + n_states * n_states, :], + ) + integrated_value_functions = { - "cov": lambda nlp, node_index: get_p_mat( + "cov": lambda nlp, node_index: get_cov_mat( nlp, node_index, force_field_magnitude=force_field_magnitude, - wM_magnitude=wM_magnitude, - wS_magnitude=wS_magnitude, + motor_noise_magnitude=motor_noise_magnitude, + sensory_noise_magnitude=sensory_noise_magnitude, ) } @@ -942,15 +636,15 @@ def prepare_socp( skip_continuity=True, n_threads=1, assume_phase_dynamics=False, - problem_type=OcpType.SOCP_EXPLICIT(wM_magnitude, wS_magnitude), + problem_type=OcpType.SOCP_EXPLICIT(motor_noise_magnitude, sensory_noise_magnitude), integrated_value_functions=integrated_value_functions, ) def main(): - RUN_OPTIM_FLAG = True # False - PLOT_SOL_FLAG = False # True - VIZUALIZE_SOL_FLAG = False # True + # --- Options --- # + plot_sol_flag = False # True + vizualise_sol_flag = False # True biorbd_model_path = "models/LeuvenArmModel.bioMod" @@ -959,31 +653,27 @@ def main(): # --- Prepare the ocp --- # dt = 0.01 - # final_time = 0.8 - # n_shooting = int(final_time/dt) + 1 - # final_time += dt - n_shooting = 4 final_time = 0.8 + n_shooting = int(final_time/dt) + 1 + final_time += dt # --- Noise constants --- # - wM_std = 0.05 + motor_noise_std = 0.05 wPq_std = 3e-4 wPqdot_std = 0.0024 - wM_magnitude = cas.DM(np.array([wM_std**2 / dt, wM_std**2 / dt])) + motor_noise_magnitude = cas.DM(np.array([motor_noise_std**2 / dt, motor_noise_std**2 / dt])) wPq_magnitude = cas.DM(np.array([wPq_std**2 / dt, wPq_std**2 / dt])) wPqdot_magnitude = cas.DM(np.array([wPqdot_std**2 / dt, wPqdot_std**2 / dt])) - wS_magnitude = cas.vertcat(wPq_magnitude, wPqdot_magnitude) + sensory_noise_magnitude = cas.vertcat(wPq_magnitude, wPqdot_magnitude) # Solver parameters solver = Solver.IPOPT(show_online_optim=False) solver.set_linear_solver("mumps") - # solver.set_linear_solver('ma57') solver.set_tol(1e-3) solver.set_dual_inf_tol(3e-4) solver.set_constr_viol_tol(1e-7) - # solver.set_maximum_iterations(10000) - solver.set_maximum_iterations(4) + solver.set_maximum_iterations(10000) solver.set_hessian_approximation("limited-memory") solver.set_bound_frac(1e-8) solver.set_bound_push(1e-8) @@ -995,114 +685,80 @@ def main(): final_time=final_time, n_shooting=n_shooting, ee_final_position=ee_final_position, - wM_magnitude=wM_magnitude, - wS_magnitude=wS_magnitude, + motor_noise_magnitude=motor_noise_magnitude, + sensory_noise_magnitude=sensory_noise_magnitude, problem_type=problem_type, force_field_magnitude=force_field_magnitude, ) - if RUN_OPTIM_FLAG: - sol_socp = socp.solve(solver) - print("ici") - # iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls - # 0 1.3548521e+00 2.05e+03 1.19e+00 0.0 0.00e+00 - 0.00e+00 0.00e+00 0 - # 1 2.2407650e+00 2.04e+03 6.94e+04 -0.9 1.03e+02 - 3.22e-03 9.61e-03f 1 - # 2 9.7836212e+02 1.71e+03 2.55e+04 0.6 9.97e+00 - 1.00e+00 9.72e-02h 1 - # 3 1.4109853e+03 1.30e+03 4.27e+04 0.8 3.47e+00 - 1.00e+00 1.00e+00h 1 - # 4 1.3315841e+03 2.54e+02 7.28e+04 1.5 5.41e+00 - 1.00e+00 8.05e-01h 1 - - q_sol = sol_socp.states["q"] - qdot_sol = sol_socp.states["qdot"] - activations_sol = sol_socp.states["muscles"] - excitations_sol = sol_socp.controls["muscles"] - k_sol = sol_socp.stochastic_variables["k"] - ee_ref_sol = sol_socp.stochastic_variables["ee_ref"] - m_sol = sol_socp.stochastic_variables["m"] - cov_sol_vect = sol_socp.integrated_values["cov"] - cov_sol = np.zeros((10, 10, n_shooting)) - for i in range(n_shooting): - for j in range(10): - for k in range(10): - cov_sol[j, k, i] = cov_sol_vect[j * 10 + k, i] - stochastic_variables_sol = np.vstack((k_sol, ee_ref_sol, m_sol)) - data = { - "q_sol": q_sol, - "qdot_sol": qdot_sol, - "activations_sol": activations_sol, - "excitations_sol": excitations_sol, - "k_sol": k_sol, - "ee_ref_sol": ee_ref_sol, - "m_sol": m_sol, - "cov_sol": cov_sol, - "stochastic_variables_sol": stochastic_variables_sol, - } - - # # --- Save the results --- # - # with open(f"leuvenarm_muscle_driven_socp_{problem_type}_forcefield{force_field_magnitude}.pkl", "wb") as file: - # pickle.dump(data, file) - else: - with open(f"leuvenarm_muscle_driven_socp_{problem_type}_forcefield{force_field_magnitude}.pkl", "rb") as file: - data = pickle.load(file) - q_sol = data["q_sol"] - qdot_sol = data["qdot_sol"] - activations_sol = data["activations_sol"] - excitations_sol = data["excitations_sol"] - k_sol = data["k_sol"] - ee_ref_sol = data["ee_ref_sol"] - m_sol = data["m_sol"] - cov_sol = data["cov_sol"] - stochastic_variables_sol = np.vstack((k_sol, ee_ref_sol, m_sol)) - - # Save .mat files - sio.savemat( - f"leuvenarm_muscle_driven_socp_{problem_type}_forcefield{force_field_magnitude}.mat", - { - "q_sol": q_sol, - "qdot_sol": qdot_sol, - "activations_sol": activations_sol, - "excitations_sol": excitations_sol, - "k_sol": k_sol, - "ee_ref_sol": ee_ref_sol, - "m_sol": m_sol, - "stochastic_variables_sol": stochastic_variables_sol, - }, - ) + sol_socp = socp.solve(solver) + + q_sol = sol_socp.states["q"] + qdot_sol = sol_socp.states["qdot"] + activations_sol = sol_socp.states["muscles"] + excitations_sol = sol_socp.controls["muscles"] + k_sol = sol_socp.stochastic_variables["k"] + ref_sol = sol_socp.stochastic_variables["ref"] + m_sol = sol_socp.stochastic_variables["m"] + cov_sol_vect = sol_socp.integrated_values["cov"] + cov_sol = np.zeros((10, 10, n_shooting)) + for i in range(n_shooting): + for j in range(10): + for k in range(10): + cov_sol[j, k, i] = cov_sol_vect[j * 10 + k, i] + stochastic_variables_sol = np.vstack((k_sol, ref_sol, m_sol)) + data = { + "q_sol": q_sol, + "qdot_sol": qdot_sol, + "activations_sol": activations_sol, + "excitations_sol": excitations_sol, + "k_sol": k_sol, + "ref_sol": ref_sol, + "m_sol": m_sol, + "cov_sol": cov_sol, + "stochastic_variables_sol": stochastic_variables_sol, + } + + # --- Save the results --- # + with open(f"leuvenarm_muscle_driven_socp_{problem_type}_forcefield{force_field_magnitude}.pkl", "wb") as file: + pickle.dump(data, file) - if VIZUALIZE_SOL_FLAG: - import bioviz + # --- Visualize the solution --- # + if vizualise_sol_flag: + import bioviz b = bioviz.Viz(model_path=biorbd_model_path) b.load_movement(q_sol[:, :-1]) b.exec() # --- Plot the results --- # - if PLOT_SOL_FLAG: + if plot_sol_flag: model = LeuvenArmModel() - Q_sym = cas.MX.sym("Q", 2, 1) - Qdot_sym = cas.MX.sym("Qdot", 2, 1) - hand_pos_fcn = cas.Function("hand_pos", [Q_sym], [model.end_effector_position(Q_sym)]) - hand_vel_fcn = cas.Function("hand_vel", [Q_sym, Qdot_sym], [model.end_effector_velocity(Q_sym, Qdot_sym)]) + q_sym = cas.MX.sym("q_sym", 2, 1) + qdot_sym = cas.MX.sym("qdot_sym", 2, 1) + hand_pos_fcn = cas.Function("hand_pos", [q_sym], [model.end_effector_position(q_sym)]) + hand_vel_fcn = cas.Function("hand_vel", [q_sym, qdot_sym], [model.end_effector_velocity(q_sym, qdot_sym)]) states = socp.nlp[0].states.cx_start controls = socp.nlp[0].controls.cx_start parameters = socp.nlp[0].parameters.cx_start stochastic_variables = socp.nlp[0].stochastic_variables.cx_start nlp = socp.nlp[0] - wM_sym = cas.MX.sym("wM", 2, 1) - wS_sym = cas.MX.sym("wS", 4, 1) + motor_noise_sym = cas.MX.sym("motor_noise", 2, 1) + sensory_noise_sym = cas.MX.sym("sensory_noise", 4, 1) out = stochastic_forward_dynamics( states, controls, parameters, stochastic_variables, nlp, - wM_sym, - wS_sym, + motor_noise_sym, + sensory_noise_sym, force_field_magnitude=force_field_magnitude, with_gains=True, ) dyn_fun = cas.Function( - "dyn_fun", [states, controls, parameters, stochastic_variables, wM_sym, wS_sym], [out.dxdt] + "dyn_fun", [states, controls, parameters, stochastic_variables, motor_noise_sym, sensory_noise_sym], [out.dxdt] ) fig, axs = plt.subplots(3, 2) @@ -1113,10 +769,10 @@ def main(): hand_pos_simulated = np.zeros((n_simulations, 2, n_shooting + 1)) hand_vel_simulated = np.zeros((n_simulations, 2, n_shooting + 1)) for i_simulation in range(n_simulations): - wM = np.random.normal(0, wM_std, (2, n_shooting + 1)) + motor_noise = np.random.normal(0, motor_noise_std, (2, n_shooting + 1)) wPq = np.random.normal(0, wPq_std, (2, n_shooting + 1)) wPqdot = np.random.normal(0, wPqdot_std, (2, n_shooting + 1)) - wS = cas.vertcat(wPq, wPqdot) + sensory_noise = cas.vertcat(wPq, wPqdot) q_simulated[i_simulation, :, 0] = q_sol[:, 0] qdot_simulated[i_simulation, :, 0] = qdot_sol[:, 0] mus_activation_simulated[i_simulation, :, 0] = activations_sol[:, 0] @@ -1132,8 +788,8 @@ def main(): ) u = excitations_sol[:, i_node] s = stochastic_variables_sol[:, i_node] - k1 = dyn_fun(x_prev, u, [], s, wM[:, i_node], wS[:, i_node]) - x_next = x_prev + dt * dyn_fun(x_prev + dt / 2 * k1, u, [], s, wM[:, i_node], wS[:, i_node]) + k1 = dyn_fun(x_prev, u, [], s, motor_noise[:, i_node], sensory_noise[:, i_node]) + x_next = x_prev + dt * dyn_fun(x_prev + dt / 2 * k1, u, [], s, motor_noise[:, i_node], sensory_noise[:, i_node]) q_simulated[i_simulation, :, i_node + 1] = np.reshape(x_next[:2], (2,)) qdot_simulated[i_simulation, :, i_node + 1] = np.reshape(x_next[2:4], (2,)) mus_activation_simulated[i_simulation, :, i_node + 1] = np.reshape(x_next[4:], (6,)) @@ -1176,8 +832,5 @@ def main(): plt.savefig("simulated_results.png", dpi=300) plt.show() - # TODO: integrate to see the error they commit with the trapezoidal - - if __name__ == "__main__": main() diff --git a/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py b/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py index a5d004ea8..ef9618c85 100644 --- a/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py +++ b/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py @@ -43,16 +43,16 @@ def get_force_field(q, force_field_magnitude): l1 = 0.3 l2 = 0.33 - F_forceField = force_field_magnitude * (l1 * cas.cos(q[0]) + l2 * cas.cos(q[0] + q[1])) + f_force_field = force_field_magnitude * (l1 * cas.cos(q[0]) + l2 * cas.cos(q[0] + q[1])) hand_pos = cas.MX(2, 1) hand_pos[0] = l2 * cas.sin(q[0] + q[1]) + l1 * cas.sin(q[0]) hand_pos[1] = l2 * cas.sin(q[0] + q[1]) - tau_force_field = -F_forceField @ hand_pos + tau_force_field = -f_force_field @ hand_pos return tau_force_field -def get_excitation_with_feedback(K, EE, EE_ref, wS): - return K @ ((EE - EE_ref) + wS) +def get_excitation_with_feedback(k, hand_pos_velo, ref, sensory_noise): + return k @ ((hand_pos_velo - ref) + sensory_noise) def stochastic_forward_dynamics( @@ -61,8 +61,8 @@ def stochastic_forward_dynamics( parameters: cas.MX | cas.SX, stochastic_variables: cas.MX | cas.SX, nlp: NonLinearProgram, - wM, - wS, + motor_noise, + sensory_noise, force_field_magnitude, with_gains, ) -> DynamicsEvaluation: @@ -71,31 +71,29 @@ def stochastic_forward_dynamics( qddot = DynamicsFunctions.get(nlp.states["qddot"], states) qdddot = DynamicsFunctions.get(nlp.controls["qdddot"], controls) tau = DynamicsFunctions.get(nlp.controls["tau"], controls) - n_states = nlp.states.cx_start.shape[0] - n_controls = nlp.controls.cx_start.shape[0] n_q = q.shape[0] n_qdot = qdot.shape[0] n_tau = tau.shape[0] tau_fb = tau if with_gains: - ee_ref = DynamicsFunctions.get(nlp.stochastic_variables["ee_ref"], stochastic_variables) + ref = DynamicsFunctions.get(nlp.stochastic_variables["ref"], stochastic_variables) k = DynamicsFunctions.get(nlp.stochastic_variables["k"], stochastic_variables) - K_matrix = cas.MX(n_q + n_qdot, n_tau) + k_matrix = cas.MX(n_q + n_qdot, n_tau) for s0 in range(n_q + n_qdot): for s1 in range(n_tau): - K_matrix[s0, s1] = k[s0 * n_tau + s1] - K_matrix = K_matrix.T + k_matrix[s0, s1] = k[s0 * n_tau + s1] + k_matrix = k_matrix.T hand_pos = nlp.model.markers(q)[2][:2] hand_vel = nlp.model.marker_velocities(q, qdot)[2][:2] ee = cas.vertcat(hand_pos, hand_vel) - tau_fb += get_excitation_with_feedback(K_matrix, ee, ee_ref, wS) + tau_fb += get_excitation_with_feedback(k_matrix, ee, ref, sensory_noise) tau_force_field = get_force_field(q, force_field_magnitude) - torques_computed = tau_fb + wM + tau_force_field + torques_computed = tau_fb + motor_noise + tau_force_field dq_computed = qdot friction = np.array([[0.05, 0.025], [0.025, 0.05]]) @@ -113,7 +111,7 @@ def stochastic_forward_dynamics( return DynamicsEvaluation(dxdt=cas.vertcat(dq_computed, dqdot_computed, dqddot_computed), defects=defects) -def configure_stochastic_optimal_control_problem(ocp: OptimalControlProgram, nlp: NonLinearProgram, wM, wS): +def configure_stochastic_optimal_control_problem(ocp: OptimalControlProgram, nlp: NonLinearProgram, motor_noise, sensory_noise): ConfigureProblem.configure_q(ocp, nlp, True, False, False) ConfigureProblem.configure_qdot(ocp, nlp, True, False, True) ConfigureProblem.configure_qddot(ocp, nlp, True, False, True) @@ -122,7 +120,7 @@ def configure_stochastic_optimal_control_problem(ocp: OptimalControlProgram, nlp # Stochastic variables ConfigureProblem.configure_stochastic_k(ocp, nlp, n_noised_controls=2, n_feedbacks=4) - ConfigureProblem.configure_stochastic_ee_ref(ocp, nlp, n_references=4) + ConfigureProblem.configure_stochastic_ref(ocp, nlp, n_references=4) ConfigureProblem.configure_stochastic_m(ocp, nlp, n_noised_states=6) mat_p_init = cas.DM_eye(6) * np.array( [1e-4, 1e-4, 1e-7, 1e-7, 1e-6, 1e-6] @@ -131,11 +129,11 @@ def configure_stochastic_optimal_control_problem(ocp: OptimalControlProgram, nlp ConfigureProblem.configure_dynamics_function( ocp, nlp, - dyn_func=lambda states, controls, parameters, stochastic_variables, nlp, wM, wS: nlp.dynamics_type.dynamic_function( - states, controls, parameters, stochastic_variables, nlp, wM, wS, with_gains=False + dyn_func=lambda states, controls, parameters, stochastic_variables, nlp, motor_noise, sensory_noise: nlp.dynamics_type.dynamic_function( + states, controls, parameters, stochastic_variables, nlp, motor_noise, sensory_noise, with_gains=False ), - wM=wM, - wS=wS, + motor_noise=motor_noise, + sensory_noise=sensory_noise, expand=False, ) return @@ -148,30 +146,30 @@ def minimize_uncertainty(controllers: list[PenaltyController], key: str) -> cas. dt = controllers[0].tf / controllers[0].ns out = 0 for i, ctrl in enumerate(controllers): - P_matrix = ctrl.integrated_values["cov"].reshape_to_matrix( + cov_matrix = ctrl.integrated_values["cov"].reshape_to_matrix( ctrl.integrated_values, ctrl.states.cx.shape[0], ctrl.states.cx.shape[0], Node.START, "cov" ) - P_partial = P_matrix[ctrl.states[key].index, ctrl.states[key].index] - out += cas.trace(P_partial) * dt + p_partial = cov_matrix[ctrl.states[key].index, ctrl.states[key].index] + out += cas.trace(p_partial) * dt return out -def get_ee(controller: PenaltyController, q, qdot) -> cas.MX: +def get_ref(controller: PenaltyController, q, qdot) -> cas.MX: hand_pos = controller.model.markers(q)[2][:2] hand_vel = controller.model.marker_velocities(q, qdot)[2][:2] ee = cas.vertcat(hand_pos, hand_vel) return ee -def ee_equals_ee_ref(controller: PenaltyController) -> cas.MX: +def hand_equals_ref(controller: PenaltyController) -> cas.MX: q = controller.states["q"].cx_start qdot = controller.states["qdot"].cx_start - ee_ref = controller.stochastic_variables["ee_ref"].cx_start - ee = get_ee(controller, q, qdot) - return ee - ee_ref + ref = controller.stochastic_variables["ref"].cx_start + ee = get_ref(controller, q, qdot) + return ee - ref -def get_p_mat(nlp, node_index, force_field_magnitude, wM_magnitude, wS_magnitude): +def get_cov_mat(nlp, node_index, force_field_magnitude, motor_noise_magnitude, sensory_noise_magnitude): dt = nlp.tf / nlp.ns nlp.states.node_index = node_index - 1 @@ -186,9 +184,9 @@ def get_p_mat(nlp, node_index, force_field_magnitude, wM_magnitude, wS_magnitude M_matrix = nlp.stochastic_variables.reshape_to_matrix(nlp.stochastic_variables, nx, nx, Node.START, "m") - wM = cas.MX.sym("wM", n_tau) - wS = cas.MX.sym("wS", n_q + n_qdot) - sigma_w = cas.vertcat(wS, wM) * cas.MX_eye(cas.vertcat(wS, wM).shape[0]) + motor_noise = cas.MX.sym("motor_noise", n_tau) + sensory_noise = cas.MX.sym("sensory_noise", n_q + n_qdot) + sigma_w = cas.vertcat(sensory_noise, motor_noise) * cas.MX_eye(cas.vertcat(sensory_noise, motor_noise).shape[0]) cov_sym = cas.MX.sym("cov", nlp.integrated_values.cx_start.shape[0]) cov_sym_dict = {"cov": cov_sym} cov_sym_dict["cov"].cx_start = cov_sym @@ -200,14 +198,14 @@ def get_p_mat(nlp, node_index, force_field_magnitude, wM_magnitude, wS_magnitude nlp.parameters, nlp.stochastic_variables.cx_start, nlp, - wM, - wS, + motor_noise, + sensory_noise, force_field_magnitude=force_field_magnitude, with_gains=True, ) - ddx_dwM = cas.jacobian(dx.dxdt, cas.vertcat(wS, wM)) - dg_dw = -ddx_dwM * dt + ddx_dwm = cas.jacobian(dx.dxdt, cas.vertcat(sensory_noise, motor_noise)) + dg_dw = -ddx_dwm * dt ddx_dx = cas.jacobian(dx.dxdt, nlp.states.cx_start) dg_dx = -(ddx_dx * dt / 2 + cas.MX_eye(ddx_dx.shape[0])) @@ -220,8 +218,8 @@ def get_p_mat(nlp, node_index, force_field_magnitude, wM_magnitude, wS_magnitude nlp.parameters, nlp.stochastic_variables.cx_start, cov_sym, - wM, - wS, + motor_noise, + sensory_noise, ], [p_next], )( @@ -230,8 +228,8 @@ def get_p_mat(nlp, node_index, force_field_magnitude, wM_magnitude, wS_magnitude nlp.parameters, nlp.stochastic_variables.cx_start, nlp.integrated_values["cov"].cx_start, # Should be the right shape to work - wM_magnitude, - wS_magnitude, + motor_noise_magnitude, + sensory_noise_magnitude, ) p_vector = nlp.integrated_values.reshape_to_vector(func_eval) return p_vector @@ -244,8 +242,8 @@ def reach_target_consistantly(controllers: list[PenaltyController]) -> cas.MX: applies at the END node. """ - Q = cas.MX.sym("q_sym", controllers[-1].states["q"].cx_start.shape[0]) - Qdot = cas.MX.sym("qdot_sym", controllers[-1].states["qdot"].cx_start.shape[0]) + q_sym = cas.MX.sym("q_sym", controllers[-1].states["q"].cx_start.shape[0]) + qdot_sym = cas.MX.sym("qdot_sym", controllers[-1].states["qdot"].cx_start.shape[0]) cov_sym = cas.MX.sym("cov", controllers[-1].integrated_values.cx_start.shape[0]) cov_sym_dict = {"cov": cov_sym} cov_sym_dict["cov"].cx_start = cov_sym @@ -261,21 +259,21 @@ def reach_target_consistantly(controllers: list[PenaltyController]) -> cas.MX: ) ) - hand_pos = controllers[0].model.markers(Q)[2][:2] - hand_vel = controllers[0].model.marker_velocities(Q, Qdot)[2][:2] + hand_pos = controllers[0].model.markers(q_sym)[2][:2] + hand_vel = controllers[0].model.marker_velocities(q_sym, qdot_sym)[2][:2] - jac_marker_q = cas.jacobian(hand_pos, Q) - jac_marker_qdot = cas.jacobian(hand_vel, cas.vertcat(Q, Qdot)) + jac_marker_q = cas.jacobian(hand_pos, q_sym) + jac_marker_qdot = cas.jacobian(hand_vel, cas.vertcat(q_sym, qdot_sym)) - P_matrix_q = cov_matrix[:2, :2] - P_matrix_qdot = cov_matrix[:4, :4] + cov_matrix_q = cov_matrix[:2, :2] + cov_matrix_qdot = cov_matrix[:4, :4] - pos_constraint = jac_marker_q @ P_matrix_q @ jac_marker_q.T - vel_constraint = jac_marker_qdot @ P_matrix_qdot @ jac_marker_qdot.T + pos_constraint = jac_marker_q @ cov_matrix_q @ jac_marker_q.T + vel_constraint = jac_marker_qdot @ cov_matrix_qdot @ jac_marker_qdot.T out = cas.vertcat(pos_constraint[0, 0], pos_constraint[1, 1], vel_constraint[0, 0], vel_constraint[1, 1]) - fun = cas.Function("reach_target_consistantly", [Q, Qdot, cov_sym], [out]) + fun = cas.Function("reach_target_consistantly", [q_sym, qdot_sym, cov_sym], [out]) val = fun( controllers[-1].states["q"].cx_start, controllers[-1].states["qdot"].cx_start, @@ -286,7 +284,7 @@ def reach_target_consistantly(controllers: list[PenaltyController]) -> cas.MX: return val -def expected_feedback_effort(controllers: list[PenaltyController], wS_magnitude: cas.DM) -> cas.MX: +def expected_feedback_effort(controllers: list[PenaltyController], sensory_noise_magnitude: cas.DM) -> cas.MX: """ ... """ @@ -295,11 +293,11 @@ def expected_feedback_effort(controllers: list[PenaltyController], wS_magnitude: n_qdot = controllers[0].states["qdot"].cx_start.shape[0] dt = controllers[0].tf / controllers[0].ns - sensory_noise_matrix = wS_magnitude * cas.MX_eye(4) + sensory_noise_matrix = sensory_noise_magnitude * cas.MX_eye(4) # create the casadi function to be evaluated # Get the symbolic variables - ee_ref = controllers[0].stochastic_variables["ee_ref"].cx_start + ref = controllers[0].stochastic_variables["ref"].cx_start cov_sym = cas.MX.sym("cov", controllers[0].integrated_values.cx_start.shape[0]) cov_sym_dict = {"cov": cov_sym} cov_sym_dict["cov"].cx_start = cov_sym @@ -316,20 +314,20 @@ def expected_feedback_effort(controllers: list[PenaltyController], wS_magnitude: ) k = controllers[0].stochastic_variables["k"].cx_start - K_matrix = cas.MX(n_q + n_qdot, n_tau) + k_matrix = cas.MX(n_q + n_qdot, n_tau) for s0 in range(n_q + n_qdot): for s1 in range(n_tau): - K_matrix[s0, s1] = k[s0 * n_tau + s1] - K_matrix = K_matrix.T + k_matrix[s0, s1] = k[s0 * n_tau + s1] + k_matrix = k_matrix.T # Compute the expected effort hand_pos = controllers[0].model.markers(controllers[0].states["q"].cx_start)[2][:2] hand_vel = controllers[0].model.marker_velocities( controllers[0].states["q"].cx_start, controllers[0].states["qdot"].cx_start )[2][:2] - trace_k_sensor_k = cas.trace(K_matrix @ sensory_noise_matrix @ K_matrix.T) + trace_k_sensor_k = cas.trace(k_matrix @ sensory_noise_matrix @ k_matrix.T) ee = cas.vertcat(hand_pos, hand_vel) - e_fb = K_matrix @ ((ee - ee_ref) + wS_magnitude) + e_fb = k_matrix @ ((ee - ref) + sensory_noise_magnitude) jac_e_fb_x = cas.jacobian(e_fb, controllers[0].states.cx_start) trace_jac_p_jack = cas.trace(jac_e_fb_x @ cov_matrix @ jac_e_fb_x.T) expectedEffort_fb_mx = trace_jac_p_jack + trace_k_sensor_k @@ -349,7 +347,7 @@ def expected_feedback_effort(controllers: list[PenaltyController], wS_magnitude: def zero_acceleration( - controller: PenaltyController, wM: np.ndarray, wS: np.ndarray, force_field_magnitude: float + controller: PenaltyController, motor_noise: np.ndarray, sensory_noise: np.ndarray, force_field_magnitude: float ) -> cas.MX: dx = stochastic_forward_dynamics( controller.states.cx_start, @@ -357,8 +355,8 @@ def zero_acceleration( controller.parameters.cx_start, controller.stochastic_variables.cx_start, controller.get_nlp, - wM, - wS, + motor_noise, + sensory_noise, force_field_magnitude=force_field_magnitude, with_gains=False, ) @@ -371,13 +369,13 @@ def track_final_marker(controller: PenaltyController) -> cas.MX: return ee_pos -def leuven_trapezoidal(controllers: list[PenaltyController], force_field_magnitude) -> cas.MX: +def trapezoidal_integration_continuity_constraint(controllers: list[PenaltyController], force_field_magnitude) -> cas.MX: n_q = controllers[0].model.nb_q n_qdot = controllers[0].model.nb_qdot n_tau = controllers[0].model.nb_tau - wM = np.zeros((n_tau, 1)) - wS = np.zeros((n_q + n_qdot, 1)) + motor_noise = np.zeros((n_tau, 1)) + sensory_noise = np.zeros((n_q + n_qdot, 1)) dt = controllers[0].tf / controllers[0].ns dyn = stochastic_forward_dynamics( @@ -386,27 +384,27 @@ def leuven_trapezoidal(controllers: list[PenaltyController], force_field_magnitu controllers[0].parameters.cx_start, controllers[0].stochastic_variables.cx_start, controllers[0].get_nlp, - wM, - wS, + motor_noise, + sensory_noise, force_field_magnitude=force_field_magnitude, with_gains=False, ) - dX_i = dyn.dxdt + dx_i = dyn.dxdt if controllers[1].node_index != controllers[0].ns: - dX_i_plus = stochastic_forward_dynamics( + dx_i_plus = stochastic_forward_dynamics( controllers[1].states.cx_start, controllers[1].controls.cx_start, controllers[1].parameters.cx_start, controllers[1].stochastic_variables.cx_start, controllers[1].get_nlp, - wM, - wS, + motor_noise, + sensory_noise, force_field_magnitude=force_field_magnitude, with_gains=False, ).dxdt - continuity = controllers[1].states.cx_start - (controllers[0].states.cx_start + (dX_i + dX_i_plus) / 2 * dt) + continuity = controllers[1].states.cx_start - (controllers[0].states.cx_start + (dx_i + dx_i_plus) / 2 * dt) continuity *= 1e3 else: continuity = 0 @@ -421,8 +419,8 @@ def prepare_socp( final_time: float, n_shooting: int, ee_final_position: np.ndarray, - wM_magnitude: cas.DM, - wS_magnitude: cas.DM, + motor_noise_magnitude: cas.DM, + sensory_noise_magnitude: cas.DM, force_field_magnitude: float = 0, problem_type: str = "CIRCLE", ) -> StochasticOptimalControlProgram: @@ -438,8 +436,10 @@ def prepare_socp( The number of shooting points to define int the direct multiple shooting program ee_final_position: np.ndarray The final position of the end effector - ee_initial_position: np.ndarray - The initial position of the end effector + motor_noise_magnitude: cas.DM + The magnitude of the motor noise + sensory_noise_magnitude: cas.DM + The magnitude of the sensory noise force_field_magnitude: float The magnitude of the force field problem_type: str @@ -481,14 +481,14 @@ def prepare_socp( expected_feedback_effort, nodes_phase=[0 for _ in range(n_shooting)], nodes=[i for i in range(n_shooting)], - wS_magnitude=wS_magnitude, + sensory_noise_magnitude=sensory_noise_magnitude, weight=1e3 / 2, quadratic=False, ) # Constraints constraints = ConstraintList() - constraints.add(ee_equals_ee_ref, node=Node.ALL_SHOOTING) + constraints.add(hand_equals_ref, node=Node.ALL_SHOOTING) constraints.add( ConstraintFcn.TRACK_STATE, key="q", node=Node.START, target=np.array([shoulder_pos_initial, elbow_pos_initial]) ) @@ -496,8 +496,8 @@ def prepare_socp( constraints.add( zero_acceleration, node=Node.START, - wM=np.zeros((n_tau, 1)), - wS=np.zeros((n_q + n_qdot, 1)), + motor_noise=np.zeros((n_tau, 1)), + sensory_noise=np.zeros((n_q + n_qdot, 1)), force_field_magnitude=force_field_magnitude, ) constraints.add(track_final_marker, node=Node.PENULTIMATE, target=ee_final_position) @@ -505,8 +505,8 @@ def prepare_socp( constraints.add( zero_acceleration, node=Node.PENULTIMATE, - wM=np.zeros((n_tau, 1)), - wS=np.zeros((n_q + n_qdot, 1)), + motor_noise=np.zeros((n_tau, 1)), + sensory_noise=np.zeros((n_q + n_qdot, 1)), force_field_magnitude=force_field_magnitude, ) # Not possible sice the control on the last node is NaN constraints.add( @@ -530,26 +530,28 @@ def prepare_socp( ) for i in range(n_shooting): multinode_constraints.add( - leuven_trapezoidal, nodes_phase=[0, 0], nodes=[i, i + 1], force_field_magnitude=force_field_magnitude + trapezoidal_integration_continuity_constraint, + nodes_phase=[0, 0], nodes=[i, i + 1], + force_field_magnitude=force_field_magnitude ) # Dynamics dynamics = DynamicsList() dynamics.add( configure_stochastic_optimal_control_problem, - dynamic_function=lambda states, controls, parameters, stochastic_variables, nlp, wM, wS, with_gains: stochastic_forward_dynamics( + dynamic_function=lambda states, controls, parameters, stochastic_variables, nlp, motor_noise, sensory_noise, with_gains: stochastic_forward_dynamics( states, controls, parameters, stochastic_variables, nlp, - wM, - wS, + motor_noise, + sensory_noise, force_field_magnitude=force_field_magnitude, with_gains=with_gains, ), - wM=np.zeros((n_tau, 1)), - wS=np.zeros((n_q + n_qdot, 1)), + motor_noise=np.zeros((n_tau, 1)), + sensory_noise=np.zeros((n_q + n_qdot, 1)), ) # expand=False states_min = np.ones((n_states, n_shooting + 1)) * -cas.inf @@ -602,10 +604,10 @@ def prepare_socp( u_init.add("qdddot", initial_guess=controls_init[:n_q, :], interpolation=InterpolationType.EACH_FRAME) u_init.add("tau", initial_guess=controls_init[n_q:, :], interpolation=InterpolationType.EACH_FRAME) - # TODO: This should probably be done automatically, not defined by the user + s_init = InitialGuessList() s_bounds = BoundsList() - n_stochastic = n_tau * (n_q + n_qdot) + n_q + n_qdot + n_states * n_states # K(2x4) + ee_ref(4x1) + M(6x6) + n_stochastic = n_tau * (n_q + n_qdot) + n_q + n_qdot + n_states * n_states # K(2x4) + ref(4x1) + M(6x6) stochastic_init = np.zeros((n_stochastic, n_shooting + 1)) stochastic_min = np.ones((n_stochastic, 3)) * -cas.inf stochastic_max = np.ones((n_stochastic, 3)) * cas.inf @@ -620,16 +622,14 @@ def prepare_socp( max_bound=stochastic_max[: n_tau * (n_q + n_qdot), :], ) curent_index += n_tau * (n_q + n_qdot) - stochastic_init[curent_index : curent_index + n_q + n_qdot, :] = 0.01 # ee_ref - # stochastic_init[curent_index : curent_index + n_q+n_qdot, 0] = np.array([ee_initial_position[0], ee_initial_position[1], 0, 0]) # ee_ref - # stochastic_init[curent_index : curent_index + n_q+n_qdot, 1] = np.array([ee_final_position[0], ee_final_position[1], 0, 0]) + stochastic_init[curent_index : curent_index + n_q + n_qdot, :] = 0.01 # ref s_init.add( - "ee_ref", + "ref", initial_guess=stochastic_init[curent_index : curent_index + n_q + n_qdot, :], interpolation=InterpolationType.EACH_FRAME, ) s_bounds.add( - "ee_ref", + "ref", min_bound=stochastic_min[curent_index : curent_index + n_q + n_qdot, :], max_bound=stochastic_max[curent_index : curent_index + n_q + n_qdot, :], ) @@ -647,12 +647,12 @@ def prepare_socp( ) integrated_value_functions = { - "cov": lambda nlp, node_index: get_p_mat( + "cov": lambda nlp, node_index: get_cov_mat( nlp, node_index, force_field_magnitude=force_field_magnitude, - wM_magnitude=wM_magnitude, - wS_magnitude=wS_magnitude, + motor_noise_magnitude=motor_noise_magnitude, + sensory_noise_magnitude=sensory_noise_magnitude, ) } @@ -675,15 +675,14 @@ def prepare_socp( skip_continuity=True, n_threads=1, assume_phase_dynamics=False, - problem_type=OcpType.SOCP_EXPLICIT(wM_magnitude, wS_magnitude), + problem_type=OcpType.SOCP_EXPLICIT(motor_noise_magnitude, sensory_noise_magnitude), integrated_value_functions=integrated_value_functions, ) def main(): - RUN_OPTIM_FLAG = True # False - PLOT_SOL_FLAG = True - VIZUALIZE_SOL_FLAG = True + # --- Options --- # + vizualize_sol_flag = True biorbd_model_path = "models/LeuvenArmModel.bioMod" @@ -692,31 +691,27 @@ def main(): # --- Prepare the ocp --- # dt = 0.01 - # final_time = 0.8 - # n_shooting = int(final_time/dt) + 1 - # final_time += dt - n_shooting = 4 final_time = 0.8 + n_shooting = int(final_time/dt) + 1 + final_time += dt # --- Noise constants --- # - wM_std = 0.05 + motor_noise_std = 0.05 wPq_std = 3e-4 wPqdot_std = 0.0024 - wM_magnitude = cas.DM(np.array([wM_std**2 / dt, wM_std**2 / dt])) + motor_noise_magnitude = cas.DM(np.array([motor_noise_std**2 / dt, motor_noise_std**2 / dt])) wPq_magnitude = cas.DM(np.array([wPq_std**2 / dt, wPq_std**2 / dt])) wPqdot_magnitude = cas.DM(np.array([wPqdot_std**2 / dt, wPqdot_std**2 / dt])) - wS_magnitude = cas.vertcat(wPq_magnitude, wPqdot_magnitude) + sensory_noise_magnitude = cas.vertcat(wPq_magnitude, wPqdot_magnitude) # Solver parameters solver = Solver.IPOPT(show_online_optim=False) solver.set_linear_solver("mumps") - # solver.set_linear_solver('ma57') solver.set_tol(1e-3) solver.set_dual_inf_tol(3e-4) solver.set_constr_viol_tol(1e-7) - # solver.set_maximum_iterations(10000) - solver.set_maximum_iterations(4) + solver.set_maximum_iterations(10000) solver.set_hessian_approximation("limited-memory") solver.set_bound_frac(1e-8) solver.set_bound_push(1e-8) @@ -729,171 +724,55 @@ def main(): final_time=final_time, n_shooting=n_shooting, ee_final_position=ee_final_position, - wM_magnitude=wM_magnitude, - wS_magnitude=wS_magnitude, + motor_noise_magnitude=motor_noise_magnitude, + sensory_noise_magnitude=sensory_noise_magnitude, problem_type=problem_type, force_field_magnitude=force_field_magnitude, ) - if RUN_OPTIM_FLAG: - sol_socp = socp.solve(solver) - # print('ici') - - q_sol = sol_socp.states["q"] - qdot_sol = sol_socp.states["qdot"] - qddot_sol = sol_socp.states["qddot"] - qdddot_sol = sol_socp.controls["qdddot"] - tau_sol = sol_socp.controls["tau"] - k_sol = sol_socp.stochastic_variables["k"] - ee_ref_sol = sol_socp.stochastic_variables["ee_ref"] - m_sol = sol_socp.stochastic_variables["m"] - cov_sol_vect = sol_socp.integrated_values["cov"] - cov_sol = np.zeros((6, 6, n_shooting)) - for i in range(n_shooting): - for j in range(6): - for k in range(6): - cov_sol[j, k, i] = cov_sol_vect[j * 6 + k, i] - stochastic_variables_sol = np.vstack((k_sol, ee_ref_sol, m_sol)) - data = { - "q_sol": q_sol, - "qdot_sol": qdot_sol, - "qddot_sol": qddot_sol, - "qdddot_sol": qdddot_sol, - "tau_sol": tau_sol, - "k_sol": k_sol, - "ee_ref_sol": ee_ref_sol, - "m_sol": m_sol, - "cov_sol": cov_sol, - "stochastic_variables_sol": stochastic_variables_sol, - } - - # --- Save the results --- # - with open(f"leuvenarm_torque_driven_socp_{problem_type}_forcefield{force_field_magnitude}.pkl", "wb") as file: - pickle.dump(data, file) - else: - with open(f"leuvenarm_torque_driven_socp_{problem_type}_forcefield{force_field_magnitude}.pkl", "rb") as file: - data = pickle.load(file) - q_sol = data["q_sol"] - qdot_sol = data["qdot_sol"] - qddot_sol = data["qddot_sol"] - qdddot_sol = data["qdddot_sol"] - tau_sol = data["tau_sol"] - k_sol = data["k_sol"] - ee_ref_sol = data["ee_ref_sol"] - m_sol = data["m_sol"] - # cov_sol = data["cov_sol"] - stochastic_variables_sol = np.vstack((k_sol, ee_ref_sol, m_sol)) - - if VIZUALIZE_SOL_FLAG: + sol_socp = socp.solve(solver) + + q_sol = sol_socp.states["q"] + qdot_sol = sol_socp.states["qdot"] + qddot_sol = sol_socp.states["qddot"] + qdddot_sol = sol_socp.controls["qdddot"] + tau_sol = sol_socp.controls["tau"] + k_sol = sol_socp.stochastic_variables["k"] + ref_sol = sol_socp.stochastic_variables["ref"] + m_sol = sol_socp.stochastic_variables["m"] + cov_sol_vect = sol_socp.integrated_values["cov"] + cov_sol = np.zeros((6, 6, n_shooting)) + for i in range(n_shooting): + for j in range(6): + for k in range(6): + cov_sol[j, k, i] = cov_sol_vect[j * 6 + k, i] + stochastic_variables_sol = np.vstack((k_sol, ref_sol, m_sol)) + data = { + "q_sol": q_sol, + "qdot_sol": qdot_sol, + "qddot_sol": qddot_sol, + "qdddot_sol": qdddot_sol, + "tau_sol": tau_sol, + "k_sol": k_sol, + "ref_sol": ref_sol, + "m_sol": m_sol, + "cov_sol": cov_sol, + "stochastic_variables_sol": stochastic_variables_sol, + } + + # --- Save the results --- # + with open(f"leuvenarm_torque_driven_socp_{problem_type}_forcefield{force_field_magnitude}.pkl", "wb") as file: + pickle.dump(data, file) + + + # --- Visualize the results --- # + if vizualize_sol_flag: import bioviz b = bioviz.Viz(model_path=biorbd_model_path) b.load_movement(q_sol[:, :-1]) b.exec() - # --- Plot the results --- # - if PLOT_SOL_FLAG: - model = biorbd.Model(biorbd_model_path) - Q_sym = cas.MX.sym("Q", 2, 1) - Qdot_sym = cas.MX.sym("Qdot", 2, 1) - hand_pos_fcn = cas.Function("hand_pos", [Q_sym], [model.markers(Q_sym)[2].to_mx()]) - hand_vel_fcn = cas.Function("hand_vel", [Q_sym, Qdot_sym], [model.markersVelocity(Q_sym, Qdot_sym)[2].to_mx()]) - - states = socp.nlp[0].states.cx_start - controls = socp.nlp[0].controls.cx_start - parameters = socp.nlp[0].parameters.cx_start - stochastic_variables = socp.nlp[0].stochastic_variables.cx_start - nlp = socp.nlp[0] - wM_sym = cas.MX.sym("wM", 2, 1) - wS_sym = cas.MX.sym("wS", 4, 1) - out = stochastic_forward_dynamics( - states, - controls, - parameters, - stochastic_variables, - nlp, - wM_sym, - wS_sym, - force_field_magnitude=force_field_magnitude, - with_gains=True, - ) - dyn_fun = cas.Function( - "dyn_fun", [states, controls, parameters, stochastic_variables, wM_sym, wS_sym], [out.dxdt] - ) - - fig, axs = plt.subplots(3, 2) - n_simulations = 30 - q_simulated = np.zeros((n_simulations, 2, n_shooting + 1)) - qdot_simulated = np.zeros((n_simulations, 2, n_shooting + 1)) - qddot_simulated = np.zeros((n_simulations, 2, n_shooting + 1)) - hand_pos_simulated = np.zeros((n_simulations, 2, n_shooting + 1)) - hand_vel_simulated = np.zeros((n_simulations, 2, n_shooting + 1)) - for i_simulation in range(n_simulations): - wM = np.random.normal(0, wM_std, (2, n_shooting + 1)) - wPq = np.random.normal(0, wPq_std, (2, n_shooting + 1)) - wPqdot = np.random.normal(0, wPqdot_std, (2, n_shooting + 1)) - wS = cas.vertcat(wPq, wPqdot) - q_simulated[i_simulation, :, 0] = q_sol[:, 0] - qdot_simulated[i_simulation, :, 0] = qdot_sol[:, 0] - qddot_simulated[i_simulation, :, 0] = qddot_sol[:, 0] - for i_node in range(n_shooting): - x_prev = cas.vertcat( - q_simulated[i_simulation, :, i_node], - qdot_simulated[i_simulation, :, i_node], - qddot_simulated[i_simulation, :, i_node], - ) - hand_pos_simulated[i_simulation, :, i_node] = np.reshape(hand_pos_fcn(x_prev[:2])[:2], (2,)) - hand_vel_simulated[i_simulation, :, i_node] = np.reshape( - hand_vel_fcn(x_prev[:2], x_prev[2:4])[:2], (2,) - ) - u = cas.vertcat(qdddot_sol[:, i_node], tau_sol[:, i_node]) - s = stochastic_variables_sol[:, i_node] - k1 = dyn_fun(x_prev, u, [], s, wM[:, i_node], wS[:, i_node]) - x_next = x_prev + dt * dyn_fun(x_prev + dt / 2 * k1, u, [], s, wM[:, i_node], wS[:, i_node]) - q_simulated[i_simulation, :, i_node + 1] = np.reshape(x_next[:2], (2,)) - qdot_simulated[i_simulation, :, i_node + 1] = np.reshape(x_next[2:4], (2,)) - qddot_simulated[i_simulation, :, i_node + 1] = np.reshape(x_next[4:], (2,)) - hand_pos_simulated[i_simulation, :, i_node + 1] = np.reshape(hand_pos_fcn(x_next[:2])[:2], (2,)) - hand_vel_simulated[i_simulation, :, i_node + 1] = np.reshape( - hand_vel_fcn(x_next[:2], x_next[2:4])[:2], (2,) - ) - axs[0, 0].plot( - hand_pos_simulated[i_simulation, 0, :], hand_pos_simulated[i_simulation, 1, :], color="tab:red" - ) - axs[1, 0].plot(np.linspace(0, final_time, n_shooting + 1), q_simulated[i_simulation, 0, :], color="k") - axs[2, 0].plot(np.linspace(0, final_time, n_shooting + 1), q_simulated[i_simulation, 1, :], color="k") - axs[0, 1].plot( - hand_vel_simulated[i_simulation, 0, :], hand_vel_simulated[i_simulation, 1, :], color="tab:red" - ) - axs[1, 1].plot(np.linspace(0, final_time, n_shooting + 1), qdot_simulated[i_simulation, 0, :], color="k") - axs[2, 1].plot(np.linspace(0, final_time, n_shooting + 1), qdot_simulated[i_simulation, 1, :], color="k") - hand_pos_without_noise = np.zeros((2, n_shooting + 1)) - for i_node in range(n_shooting + 1): - hand_pos_without_noise[:, i_node] = np.reshape(hand_pos_fcn(q_sol[:, i_node])[:2], (2,)) - axs[0, 0].plot(hand_pos_without_noise[0, :], hand_pos_without_noise[1, :], color="k") - axs[0, 0].plot(ee_initial_position[0], ee_initial_position[1], color="tab:green", marker="o") - axs[0, 0].plot(ee_final_position[0], ee_final_position[1], color="tab:red", marker="o") - axs[0, 0].set_xlabel("X [m]") - axs[0, 0].set_ylabel("Y [m]") - axs[0, 0].set_title("Hand position simulated") - axs[1, 0].set_xlabel("Time [s]") - axs[1, 0].set_ylabel("Shoulder angle [rad]") - axs[2, 0].set_xlabel("Time [s]") - axs[2, 0].set_ylabel("Elbow angle [rad]") - axs[0, 1].set_xlabel("X velocity [m/s]") - axs[0, 1].set_ylabel("Y velocity [m/s]") - axs[0, 1].set_title("Hand velocity simulated") - axs[1, 1].set_xlabel("Time [s]") - axs[1, 1].set_ylabel("Shoulder velocity [rad/s]") - axs[2, 1].set_xlabel("Time [s]") - axs[2, 1].set_ylabel("Elbow velocity [rad/s]") - axs[0, 0].axis("equal") - plt.tight_layout() - plt.savefig("simulated_results.png", dpi=300) - plt.show() - - # TODO: integrate to see the error they commit with the trapezoidal - if __name__ == "__main__": main() diff --git a/bioptim/limits/multinode_penalty.py b/bioptim/limits/multinode_penalty.py index 917d86f4c..1168d1097 100644 --- a/bioptim/limits/multinode_penalty.py +++ b/bioptim/limits/multinode_penalty.py @@ -309,8 +309,8 @@ def m_equals_inverse_of_dg_dz( penalty, controllers: list[PenaltyController, PenaltyController], dynamics: Callable, - wM_magnitude: DM, - wS_magnitude: DM, + motor_noise_magnitude: DM, + sensory_noise_magnitude: DM, **unused_param, ): """ @@ -321,8 +321,8 @@ def m_equals_inverse_of_dg_dz( dt = controllers[0].tf / controllers[0].ns - wM = MX.sym("wM", wM_magnitude.shape[0], 1) - wS = MX.sym("wS", wS_magnitude.shape[0], 1) + motor_noise = MX.sym("motor_noise", motor_noise_magnitude.shape[0], 1) + sensory_noise = MX.sym("sensory_noise", sensory_noise_magnitude.shape[0], 1) nx = controllers[0].states.cx.shape[0] M_matrix = ( @@ -337,8 +337,8 @@ def m_equals_inverse_of_dg_dz( controllers[0].parameters.cx_start, controllers[0].stochastic_variables.cx_start, controllers[0].get_nlp, - wM, - wS, + motor_noise, + sensory_noise, with_gains=True, ) @@ -349,8 +349,8 @@ def m_equals_inverse_of_dg_dz( controllers[0].controls.cx_start, controllers[0].parameters.cx_start, controllers[0].stochastic_variables.cx_start, - wM, - wS, + motor_noise, + sensory_noise, ], [jacobian(dx.dxdt, controllers[0].states.cx_start)], ) @@ -360,8 +360,8 @@ def m_equals_inverse_of_dg_dz( controllers[1].controls.cx_start, controllers[1].parameters.cx_start, controllers[1].stochastic_variables.cx_start, - wM_magnitude, - wS_magnitude, + motor_noise_magnitude, + sensory_noise_magnitude, ) DG_DZ = MX_eye(DdZ_DX.shape[0]) - DdZ_DX * dt / 2 diff --git a/bioptim/limits/penalty.py b/bioptim/limits/penalty.py index e2f38508a..9928243a3 100644 --- a/bioptim/limits/penalty.py +++ b/bioptim/limits/penalty.py @@ -1007,7 +1007,7 @@ def continuity(penalty: PenaltyOption, controller: PenaltyController | list): @staticmethod def covariance_matrix_continuity_implicit( - penalty: PenaltyOption, controller: PenaltyController, wM_magnitude: DM, wS_magnitude: DM + penalty: PenaltyOption, controller: PenaltyController, motor_noise_magnitude: DM, sensory_noise_magnitude: DM ): nx = controller.states.cx_start.shape[0] P_matrix = controller.integrated_values["cov"].reshape_to_matrix( @@ -1023,7 +1023,7 @@ def covariance_matrix_continuity_implicit( controller.stochastic_variables, nx, nx, Node.START, "m" ) - sigma_w = vertcat(wS_magnitude, wM_magnitude) + sigma_w = vertcat(sensory_noise_magnitude, motor_noise_magnitude) dt = 1 / controller.ns dg_dw = -dt * C_matrix dg_dx = -MX_eye(A_matrix.shape[0]) - dt / 2 * A_matrix diff --git a/bioptim/optimization/problem_type.py b/bioptim/optimization/problem_type.py index 681019263..4b0c4a3bc 100644 --- a/bioptim/optimization/problem_type.py +++ b/bioptim/optimization/problem_type.py @@ -14,27 +14,27 @@ class SOCP_EXPLICIT: The class used to declare a stochastic problem with explicit stochastic dynamics Attributes ---------- - wM_magnitude: DM + motor_noise_magnitude: DM The magnitude of the motor noise - wS_magnitude: DM + sensory_noise_magnitude: DM The magnitude of the sensory noise """ - def __init__(self, wM_magnitude: DM, wS_magnitude: DM): - self.wM_magnitude = wM_magnitude - self.wS_magnitude = wS_magnitude + def __init__(self, motor_noise_magnitude: DM, sensory_noise_magnitude: DM): + self.motor_noise_magnitude = motor_noise_magnitude + self.sensory_noise_magnitude = sensory_noise_magnitude class SOCP_IMPLICIT: """ The class used to declare a stochastic problem with implicit stochastic dynamics Attributes ---------- - wM_magnitude: DM + motor_noise_magnitude: DM The magnitude of the motor noise - wS_magnitude: DM + sensory_noise_magnitude: DM The magnitude of the sensory noise """ - def __init__(self, wM_magnitude: DM, wS_magnitude: DM): - self.wM_magnitude = wM_magnitude - self.wS_magnitude = wS_magnitude + def __init__(self, motor_noise_magnitude: DM, sensory_noise_magnitude: DM): + self.motor_noise_magnitude = motor_noise_magnitude + self.sensory_noise_magnitude = sensory_noise_magnitude diff --git a/bioptim/optimization/stochastic_optimal_control_program.py b/bioptim/optimization/stochastic_optimal_control_program.py index 7adb58d40..2f3ef2de2 100644 --- a/bioptim/optimization/stochastic_optimal_control_program.py +++ b/bioptim/optimization/stochastic_optimal_control_program.py @@ -68,7 +68,7 @@ def __init__( skip_continuity: bool = False, assume_phase_dynamics: bool = False, integrated_value_functions: dict[str, Callable] = None, - problem_type: OcpType = OcpType.SOCP_EXPLICIT, + problem_type: OcpType.SOCP_EXPLICIT | OcpType.SOCP_IMPLICIT = OcpType.SOCP_EXPLICIT, **kwargs, ): """ """ @@ -194,14 +194,14 @@ def _declare_multi_node_penalties(self, multinode_constraints: ConstraintList, m # Add the internal multi-node constraints for the stochastic ocp if isinstance(self.problem_type, OcpType.SOCP_EXPLICIT): self._prepare_stochastic_dynamics_explicit( - wM_magnitude=self.problem_type.wM_magnitude, wS_magnitude=self.problem_type.wS_magnitude + motor_noise_magnitude=self.problem_type.motor_noise_magnitude, sensory_noise_magnitude=self.problem_type.sensory_noise_magnitude ) elif isinstance(self.problem_type, OcpType.SOCP_IMPLICIT): self._prepare_stochastic_dynamics_implicit( - wM_magnitude=self.problem_type.wM_magnitude, wS_magnitude=self.problem_type.wS_magnitude + motor_noise_magnitude=self.problem_type.motor_noise_magnitude, sensory_noise_magnitude=self.problem_type.sensory_noise_magnitude ) - def _prepare_stochastic_dynamics_explicit(self, wM_magnitude, wS_magnitude): + def _prepare_stochastic_dynamics_explicit(self, motor_noise_magnitude, sensory_noise_magnitude): """ ... """ @@ -213,8 +213,8 @@ def _prepare_stochastic_dynamics_explicit(self, wM_magnitude, wS_magnitude): nodes_phase=(i_phase, i_phase), nodes=(i_node, i_node + 1), dynamics=nlp.dynamics_type.dynamic_function, - wM_magnitude=wM_magnitude, - wS_magnitude=wS_magnitude, + motor_noise_magnitude=motor_noise_magnitude, + sensory_noise_magnitude=sensory_noise_magnitude, ) if i_phase > 0: # TODO: verify with Friedl, but should be OK penalty_m_dg_dz_list.add( @@ -222,12 +222,12 @@ def _prepare_stochastic_dynamics_explicit(self, wM_magnitude, wS_magnitude): nodes_phase=(i_phase - 1, i_phase), nodes=(-1, 0), dynamics=nlp.dynamics_type.dynamic_function, - wM_magnitude=wM_magnitude, - wS_magnitude=wS_magnitude, + motor_noise_magnitude=motor_noise_magnitude, + sensory_noise_magnitude=sensory_noise_magnitude, ) penalty_m_dg_dz_list.add_or_replace_to_penalty_pool(self) - def _prepare_stochastic_dynamics_implicit(self, wM_magnitude, wS_magnitude): + def _prepare_stochastic_dynamics_implicit(self, motor_noise_magnitude, sensory_noise_magnitude): """ ... """ @@ -242,8 +242,8 @@ def _prepare_stochastic_dynamics_implicit(self, wM_magnitude, wS_magnitude): nodes_phase=(i_phase, i_phase), nodes=(i_node, i_node + 1), dynamics=nlp.dynamics_type.dynamic_function, - wM_magnitude=wM_magnitude, - wS_magnitude=wS_magnitude, + motor_noise_magnitude=motor_noise_magnitude, + sensory_noise_magnitude=sensory_noise_magnitude, ) if i_phase > 0: # TODO: verify with Friedl, but should be OK multi_node_penalties.add( @@ -251,8 +251,8 @@ def _prepare_stochastic_dynamics_implicit(self, wM_magnitude, wS_magnitude): nodes_phase=(i_phase - 1, i_phase), nodes=(-1, 0), dynamics=nlp.dynamics_type.dynamic_function, - wM_magnitude=wM_magnitude, - wS_magnitude=wS_magnitude, + motor_noise_magnitude=motor_noise_magnitude, + sensory_noise_magnitude=sensory_noise_magnitude, ) # Constrain P @@ -261,16 +261,16 @@ def _prepare_stochastic_dynamics_implicit(self, wM_magnitude, wS_magnitude): ConstraintFcn.COVARIANCE_MATRIX_CONINUITY_IMPLICIT, node=Node.ALL, phase=i_phase, - wM_magnitude=wM_magnitude, - wS_magnitude=wS_magnitude, + motor_noise_magnitude=motor_noise_magnitude, + sensory_noise_magnitude=sensory_noise_magnitude, ) if i_phase > 0: multi_node_penalties.add( # TODO: check MultinodeConstraintFcn.COVARIANCE_MATRIX_CONINUITY_IMPLICIT, # TODO: to be continued in penalty nodes_phase=(i_phase - 1, i_phase), nodes=(-1, 0), - wM_magnitude=wM_magnitude, - wS_magnitude=wS_magnitude, + motor_noise_magnitude=motor_noise_magnitude, + sensory_noise_magnitude=sensory_noise_magnitude, ) # Constrain A for i_phase, nlp in enumerate(self.nlp): @@ -278,8 +278,8 @@ def _prepare_stochastic_dynamics_implicit(self, wM_magnitude, wS_magnitude): ConstraintFcn.A_EQUALS_DF_DX, node=Node.ALL, phase=i_phase, - wM_magnitude=wM_magnitude, - wS_magnitude=wS_magnitude, + motor_noise_magnitude=motor_noise_magnitude, + sensory_noise_magnitude=sensory_noise_magnitude, ) # Constrain C @@ -288,8 +288,8 @@ def _prepare_stochastic_dynamics_implicit(self, wM_magnitude, wS_magnitude): ConstraintFcn.C_EQUALS_DF_DW, node=Node.ALL, phase=i_phase, - wM_magnitude=wM_magnitude, - wS_magnitude=wS_magnitude, + motor_noise_magnitude=motor_noise_magnitude, + sensory_noise_magnitude=sensory_noise_magnitude, ) multi_node_penalties.add_or_replace_to_penalty_pool(self) diff --git a/tests/test_global_stochastic.py b/tests/test_global_stochastic.py index 999f45880..736841ad6 100644 --- a/tests/test_global_stochastic.py +++ b/tests/test_global_stochastic.py @@ -18,20 +18,20 @@ def test_arm_reaching_muscle_driven(): force_field_magnitude = 0 dt = 0.01 - wM_std = 0.05 + motor_noise_std = 0.05 wPq_std = 3e-4 wPqdot_std = 0.0024 - wM_magnitude = DM(np.array([wM_std**2 / dt, wM_std**2 / dt])) + motor_noise_magnitude = DM(np.array([motor_noise_std**2 / dt, motor_noise_std**2 / dt])) wPq_magnitude = DM(np.array([wPq_std**2 / dt, wPq_std**2 / dt])) wPqdot_magnitude = DM(np.array([wPqdot_std**2 / dt, wPqdot_std**2 / dt])) - wS_magnitude = vertcat(wPq_magnitude, wPqdot_magnitude) + sensory_noise_magnitude = vertcat(wPq_magnitude, wPqdot_magnitude) ocp = ocp_module.prepare_socp( final_time=final_time, n_shooting=n_shooting, ee_final_position=ee_final_position, - wM_magnitude=wM_magnitude, - wS_magnitude=wS_magnitude, + motor_noise_magnitude=motor_noise_magnitude, + sensory_noise_magnitude=sensory_noise_magnitude, force_field_magnitude=force_field_magnitude, problem_type=problem_type, ) @@ -67,7 +67,7 @@ def test_arm_reaching_muscle_driven(): ) q, qdot, mus_activations = states["q"], states["qdot"], states["muscles"] mus_excitations = controls["muscles"] - k, ee_ref, m = stochastic_variables["k"], stochastic_variables["ee_ref"], stochastic_variables["m"] + k, ref, m = stochastic_variables["k"], stochastic_variables["ref"], stochastic_variables["m"] cov = integrated_values["cov"] # initial and final position @@ -120,7 +120,7 @@ def test_arm_reaching_muscle_driven(): ] ), ) - np.testing.assert_almost_equal(ee_ref[:, 0], np.array([0.00812868, 0.05943125, 0.00812868, 0.00812868])) + np.testing.assert_almost_equal(ref[:, 0], np.array([0.00812868, 0.05943125, 0.00812868, 0.00812868])) np.testing.assert_almost_equal( m[:, 0], np.array( From cb696db5baeccf4c825d8ad2515035eca73f2432 Mon Sep 17 00:00:00 2001 From: Charbie Date: Fri, 14 Jul 2023 13:18:18 +0200 Subject: [PATCH 37/54] nlp_scaling_methods works again --- bioptim/interfaces/solver_options.py | 5 +++++ tests/test_solver_options.py | 6 ++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/bioptim/interfaces/solver_options.py b/bioptim/interfaces/solver_options.py index 2ab7c33d2..bd0a6e547 100644 --- a/bioptim/interfaces/solver_options.py +++ b/bioptim/interfaces/solver_options.py @@ -402,6 +402,8 @@ class SQP_METHOD(Generic): Armijo condition, coefficient of decrease in merit set_hessian_approximation(hessian_approximation: str): Hessian approximation method + set_nlp_scaling_method(scaling_method: str): + Method used to scale the NLP set_lbfgs_memory(lbfgs_memory: int): Size of L-BFGS memory. set_maximum_iterations(max_iter: int): @@ -528,6 +530,9 @@ def set_c1(self, c1: float): def set_hessian_approximation(self, hessian_approximation: str): self._hessian_approximation = hessian_approximation + def set_nlp_scaling_method(self, nlp_scaling_metod: str): + self._nlp_scaling_metod = nlp_scaling_metod + def set_lbfgs_memory(self, lbfgs_memory: int): """ Size of L-BFGS memory. diff --git a/tests/test_solver_options.py b/tests/test_solver_options.py index 8346ae32e..bd60e4a7f 100644 --- a/tests/test_solver_options.py +++ b/tests/test_solver_options.py @@ -61,12 +61,14 @@ def test_ipopt_solver_options(): assert solver.max_iter == 10 solver.set_hessian_approximation("hello bioptim") assert solver.hessian_approximation == "hello bioptim" + solver.set_nlp_scaling_method("how are you?") + assert solver.nlp_scaling_method == "how are you?" solver.set_limited_memory_max_history(11) assert solver.limited_memory_max_history == 11 solver.set_mu_init(12) assert solver.mu_init == 12 - solver.set_warm_start_init_point("how are you?") - assert solver.warm_start_init_point == "how are you?" + solver.set_warm_start_init_point("super!") + assert solver.warm_start_init_point == "super!" solver.set_warm_start_mult_bound_push(13) assert solver.warm_start_mult_bound_push == 13 solver.set_warm_start_slack_bound_push(14) From 24ad9aec60847b76e4ff13532d9f7874e79f3174 Mon Sep 17 00:00:00 2001 From: Charbie Date: Fri, 14 Jul 2023 14:12:09 +0200 Subject: [PATCH 38/54] made it understandable (doc + name changes) --- .../arm_reaching_muscle_driven.py | 25 +++- .../arm_reaching_torque_driven.py | 109 +++++++++++++++++- bioptim/gui/plot.py | 2 +- bioptim/limits/constraints.py | 1 - bioptim/limits/multinode_constraint.py | 3 +- bioptim/limits/multinode_penalty.py | 64 +++++++++- bioptim/limits/objective_functions.py | 4 +- bioptim/limits/penalty.py | 35 +----- .../stochastic_optimal_control_program.py | 24 ++-- 9 files changed, 207 insertions(+), 60 deletions(-) diff --git a/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py b/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py index 616b573aa..5ae4364e4 100644 --- a/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py +++ b/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py @@ -267,7 +267,17 @@ def reach_target_consistantly(controllers: list[PenaltyController]) -> cas.MX: def expected_feedback_effort(controllers: list[PenaltyController], sensory_noise_magnitude: cas.DM) -> cas.MX: """ - ... + This function computes the expected effort due to the motor command and feedback gains for a given sensory noise + magnitude. + It is computed as Jacobian(effort, states) @ cov @ Jacobian(effort, states) + + Jacobian(effort, motor_noise) @ sigma_w @ Jacobian(effort, motor_noise) + + Parameters + ---------- + controllers : list[PenaltyController] + List of controllers to be used to compute the expected effort. + sensory_noise_magnitude : cas.DM + Magnitude of the sensory noise. """ dt = controllers[0].tf / controllers[0].ns sensory_noise_matrix = sensory_noise_magnitude * cas.MX_eye(4) @@ -326,6 +336,9 @@ def expected_feedback_effort(controllers: list[PenaltyController], sensory_noise def zero_acceleration( controller: PenaltyController, motor_noise: np.ndarray, sensory_noise: np.ndarray, force_field_magnitude: float ) -> cas.MX: + """ + No acceleration of the joints at the beginning and end of the movement. + """ dx = stochastic_forward_dynamics( controller.states.cx_start, controller.controls.cx_start, @@ -341,12 +354,20 @@ def zero_acceleration( def track_final_marker(controller: PenaltyController) -> cas.MX: + """ + Track the hand position. + """ q = controller.states["q"].cx_start ee_pos = controller.model.end_effector_position(q) return ee_pos def trapezoidal_integration_continuity_constraint(controllers: list[PenaltyController], force_field_magnitude) -> cas.MX: + """ + This function computes the continuity constraint for the trapezoidal integration scheme. + It is computed as: + x_i_plus - x_i - dt/2 * (f(x_i, u_i) + f(x_i_plus, u_i_plus)) = 0 + """ motor_noise = np.zeros((2, 1)) sensory_noise = np.zeros((4, 1)) dt = controllers[0].tf / controllers[0].ns @@ -392,8 +413,6 @@ def prepare_socp( The initialization of an ocp Parameters ---------- - biorbd_model_path: str - The path to the biorbd model final_time: float The time in second required to perform the task n_shooting: int diff --git a/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py b/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py index ef9618c85..9fa9ef6bb 100644 --- a/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py +++ b/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py @@ -41,6 +41,16 @@ def get_force_field(q, force_field_magnitude): + """ + Get the effect of the force field. + + Parameters + ---------- + q: MX.sym + The generalized coordinates + force_field_magnitude: float + The magnitude of the force field + """ l1 = 0.3 l2 = 0.33 f_force_field = force_field_magnitude * (l1 * cas.cos(q[0]) + l2 * cas.cos(q[0] + q[1])) @@ -52,6 +62,20 @@ def get_force_field(q, force_field_magnitude): def get_excitation_with_feedback(k, hand_pos_velo, ref, sensory_noise): + """ + Get the effect of the feedback. + + Parameters + ---------- + k: MX.sym + The feedback gains + hand_pos_velo: MX.sym + The position and velocity of the hand + ref: MX.sym + The reference position and velocity of the hand + sensory_noise: MX.sym + The sensory noise + """ return k @ ((hand_pos_velo - ref) + sensory_noise) @@ -66,6 +90,30 @@ def stochastic_forward_dynamics( force_field_magnitude, with_gains, ) -> DynamicsEvaluation: + """ + The dynamic function of the states including feedback gains. + + Parameters + ---------- + states: MX.sym + The states + controls: MX.sym + The controls + parameters: MX.sym + The parameters + stochastic_variables: MX.sym + The stochastic variables + nlp: NonLinearProgram + The current non-linear program + motor_noise: MX.sym + The motor noise + sensory_noise: MX.sym + The sensory noise + force_field_magnitude: float + The magnitude of the force field + with_gains: bool + If the feedback gains are included or not to the torques + """ q = DynamicsFunctions.get(nlp.states["q"], states) qdot = DynamicsFunctions.get(nlp.states["qdot"], states) qddot = DynamicsFunctions.get(nlp.states["qddot"], states) @@ -112,6 +160,9 @@ def stochastic_forward_dynamics( def configure_stochastic_optimal_control_problem(ocp: OptimalControlProgram, nlp: NonLinearProgram, motor_noise, sensory_noise): + """ + Configure the stochastic optimal control problem. + """ ConfigureProblem.configure_q(ocp, nlp, True, False, False) ConfigureProblem.configure_qdot(ocp, nlp, True, False, True) ConfigureProblem.configure_qddot(ocp, nlp, True, False, True) @@ -141,7 +192,7 @@ def configure_stochastic_optimal_control_problem(ocp: OptimalControlProgram, nlp def minimize_uncertainty(controllers: list[PenaltyController], key: str) -> cas.MX: """ - Minimize the uncertainty (covariance matrix) of the states. + Minimize the uncertainty (covariance matrix) of the states "key". """ dt = controllers[0].tf / controllers[0].ns out = 0 @@ -155,6 +206,18 @@ def minimize_uncertainty(controllers: list[PenaltyController], key: str) -> cas. def get_ref(controller: PenaltyController, q, qdot) -> cas.MX: + """ + Get the reference had position and velocity. + + Parameters + ---------- + controller: PenaltyController + The controller. + q: cas.MX + The current joint position. + qdot: cas.MX + The current joint velocity. + """ hand_pos = controller.model.markers(q)[2][:2] hand_vel = controller.model.marker_velocities(q, qdot)[2][:2] ee = cas.vertcat(hand_pos, hand_vel) @@ -162,6 +225,9 @@ def get_ref(controller: PenaltyController, q, qdot) -> cas.MX: def hand_equals_ref(controller: PenaltyController) -> cas.MX: + """ + Get the error between the hand position and the reference. + """ q = controller.states["q"].cx_start qdot = controller.states["qdot"].cx_start ref = controller.stochastic_variables["ref"].cx_start @@ -170,6 +236,24 @@ def hand_equals_ref(controller: PenaltyController) -> cas.MX: def get_cov_mat(nlp, node_index, force_field_magnitude, motor_noise_magnitude, sensory_noise_magnitude): + """ + Perform a trapezoidal integration to get the covariance matrix at the next node. + It is conputed as: + P_k+1 = M_k(dg/dx @ P_k @ dg/dx + dg/dw @ sigma_w @ dg/dw) @ M_k + + Parameters + ---------- + nlp: NonLinearProgram + The current non-linear program. + node_index: int + The node index at hich we want to compute the covariance matrix. + force_field_magnitude: float + The magnitude of the force field. + motor_noise_magnitude: DM + The magnitude of the motor noise. + sensory_noise_magnitude: DM + The magnitude of the sensory noise. + """ dt = nlp.tf / nlp.ns nlp.states.node_index = node_index - 1 @@ -286,7 +370,17 @@ def reach_target_consistantly(controllers: list[PenaltyController]) -> cas.MX: def expected_feedback_effort(controllers: list[PenaltyController], sensory_noise_magnitude: cas.DM) -> cas.MX: """ - ... + This function computes the expected effort due to the motor command and feedback gains for a given sensory noise + magnitude. + It is computed as Jacobian(effort, states) @ cov @ Jacobian(effort, states) + + Jacobian(efforst, motor_noise) @ sigma_w @ Jacobian(efforst, motor_noise) + + Parameters + ---------- + controllers : list[PenaltyController] + List of controllers to be used to compute the expected effort. + sensory_noise_magnitude : cas.DM + Magnitude of the sensory noise. """ n_tau = controllers[0].controls["tau"].cx_start.shape[0] n_q = controllers[0].states["q"].cx_start.shape[0] @@ -349,6 +443,9 @@ def expected_feedback_effort(controllers: list[PenaltyController], sensory_noise def zero_acceleration( controller: PenaltyController, motor_noise: np.ndarray, sensory_noise: np.ndarray, force_field_magnitude: float ) -> cas.MX: + """ + No acceleration of the joints at the beginning and end of the movement. + """ dx = stochastic_forward_dynamics( controller.states.cx_start, controller.controls.cx_start, @@ -364,12 +461,20 @@ def zero_acceleration( def track_final_marker(controller: PenaltyController) -> cas.MX: + """ + Track the hand position. + """ q = controller.states["q"].cx_start ee_pos = controller.model.markers(q)[2][:2] return ee_pos def trapezoidal_integration_continuity_constraint(controllers: list[PenaltyController], force_field_magnitude) -> cas.MX: + """ + This function computes the continuity constraint for the trapezoidal integration scheme. + It is computed as: + x_i_plus - x_i - dt/2 * (f(x_i, u_i) + f(x_i_plus, u_i_plus)) = 0 + """ n_q = controllers[0].model.nb_q n_qdot = controllers[0].model.nb_qdot n_tau = controllers[0].model.nb_tau diff --git a/bioptim/gui/plot.py b/bioptim/gui/plot.py index de35483ff..9086f2e62 100644 --- a/bioptim/gui/plot.py +++ b/bioptim/gui/plot.py @@ -22,7 +22,7 @@ class CustomPlot: Attributes ---------- - function: Callable[states, controls, parameters, stochasti_variables] + function: Callable[states, controls, parameters, stochastic_variables] The function to call to update the graph type: PlotType Type of plot to use diff --git a/bioptim/limits/constraints.py b/bioptim/limits/constraints.py index d828524b9..a65c3e57f 100644 --- a/bioptim/limits/constraints.py +++ b/bioptim/limits/constraints.py @@ -622,7 +622,6 @@ def get_type() -> Callable TIME_CONSTRAINT = (ConstraintFunction.Functions.time_constraint,) TRACK_VECTOR_ORIENTATIONS_FROM_MARKERS = (PenaltyFunctionAbstract.Functions.track_vector_orientations_from_markers,) TRACK_PARAMETER = (PenaltyFunctionAbstract.Functions.minimize_parameter,) - COVARIANCE_MATRIX_CONINUITY_IMPLICIT = (PenaltyFunctionAbstract.Functions.covariance_matrix_continuity_implicit,) @staticmethod def get_type(): diff --git a/bioptim/limits/multinode_constraint.py b/bioptim/limits/multinode_constraint.py index a1b1c3563..aa0c4d35a 100644 --- a/bioptim/limits/multinode_constraint.py +++ b/bioptim/limits/multinode_constraint.py @@ -100,7 +100,8 @@ class MultinodeConstraintFcn(FcnEnum): COM_EQUALITY = (MultinodeConstraintFunctions.Functions.com_equality,) COM_VELOCITY_EQUALITY = (MultinodeConstraintFunctions.Functions.com_velocity_equality,) TIME_CONSTRAINT = (MultinodeConstraintFunctions.Functions.time_equality,) - M_EQUALS_INVERSE_OF_DG_DZ = (MultinodeConstraintFunctions.Functions.m_equals_inverse_of_dg_dz,) + STOCHASTIC_HELPER_MATRIX_IMPLICIT = (MultinodeConstraintFunctions.Functions.stochastic_helper_matrix_implicit,) + STOCHASTIC_COVARIANCE_MATRIX_CONTINUITY_IMPLICIT = (MultinodeConstraintFunctions.Functions.stochastic_covariance_matrix_continuity_implicit,) @staticmethod def get_type(): diff --git a/bioptim/limits/multinode_penalty.py b/bioptim/limits/multinode_penalty.py index 1168d1097..9e2120e60 100644 --- a/bioptim/limits/multinode_penalty.py +++ b/bioptim/limits/multinode_penalty.py @@ -1,5 +1,5 @@ from typing import Callable, Any -from casadi import DM, horzcat, MX_eye, jacobian, Function, MX +from casadi import DM, horzcat, MX_eye, jacobian, Function, MX, vertcat from .constraints import PenaltyOption from .objective_functions import ObjectiveFunction @@ -305,16 +305,33 @@ def get_time_parameter_idx(controller: PenaltyController, i_phase): return out @staticmethod - def m_equals_inverse_of_dg_dz( + def stochastic_helper_matrix_implicit( penalty, controllers: list[PenaltyController, PenaltyController], dynamics: Callable, motor_noise_magnitude: DM, sensory_noise_magnitude: DM, - **unused_param, ): """ - ... + This functions constrain the helper matrix to its actual value as in Gillis 2013. + It is explained in more details here: https://doi.org/10.1109/CDC.2013.6761121 + 0 = df/dz - dg/dz @ M + Note that here, we assume that the only z (collocation states) is the next interval states, therefore M is + not computed at the same node as the other values. + TODO: Charbie -> This implementation is only true for Trapezoidal, should generalize for collocations + + Parameters + ---------- + penalty : MultinodePenalty + A reference to the phase penalty + controllers: list[PenaltyController, PenaltyController] + The penalty node elements + dynamics: Callable + The states dynamics function + motor_noise_magnitude: DM + The magnitude of the motor noise + sensory_noise_magnitude: DM + The magnitude of the sensory noise """ if controllers[0].phase_idx != controllers[1].phase_idx: raise RuntimeError("For this constraint to make sens, the two nodes must belong to the same phase.") @@ -371,6 +388,45 @@ def m_equals_inverse_of_dg_dz( out_vector = controllers[0].stochastic_variables["m"].reshape_to_vector(val) return out_vector + + @staticmethod + def stochastic_covariance_matrix_continuity_implicit( + penalty: PenaltyOption, controller: PenaltyController, motor_noise_magnitude: DM, sensory_noise_magnitude: DM + ): + """ + This functions constrain the covariance matrix to its actual value as in Gillis 2013. + It is explained in more details here: https://doi.org/10.1109/CDC.2013.6761121 + P_k+1 = M_k @ (dg/dx @ P @ dg/dx + dg/dw @ sigma_w @ dg/dw) @ M_k + """ + nx = controller.states.cx_start.shape[0] + P_matrix = controller.integrated_values["cov"].reshape_to_matrix( + controller.stochastic_variables, nx, nx, Node.START, "cov" + ) + A_matrix = controller.stochastic_variables["a"].reshape_to_matrix( + controller.stochastic_variables, nx, nx, Node.START, "a" + ) + C_matrix = controller.stochastic_variables["c"].reshape_to_matrix( + controller.stochastic_variables, nx, nx, Node.START, "c" + ) + M_matrix = controller.stochastic_variables["m"].reshape_to_matrix( + controller.stochastic_variables, nx, nx, Node.START, "m" + ) + + sigma_w = vertcat(sensory_noise_magnitude, motor_noise_magnitude) + dt = 1 / controller.ns + dg_dw = -dt * C_matrix + dg_dx = -MX_eye(A_matrix.shape[0]) - dt / 2 * A_matrix + + p_next = M_matrix @ (dg_dx @ P_matrix @ dg_dx.T + dg_dw @ sigma_w @ dg_dw.T) @ M_matrix.T + p_implicit_deffect = p_next - P_matrix + + penalty.expand = controller.get_nlp.dynamics_type.expand + penalty.explicit_derivative = True + penalty.multi_thread = True + + out_vector = controller.integrated_values["cov"].reshape_to_vector(p_implicit_deffect) + return out_vector + @staticmethod def custom(penalty, controllers: list[PenaltyController, PenaltyController], **extra_params): """ diff --git a/bioptim/limits/objective_functions.py b/bioptim/limits/objective_functions.py index 0c0260c48..24b0bab00 100644 --- a/bioptim/limits/objective_functions.py +++ b/bioptim/limits/objective_functions.py @@ -314,7 +314,7 @@ def get_type() -> Callable MINIMIZE_FATIGUE = (PenaltyFunctionAbstract.Functions.minimize_fatigue,) MINIMIZE_CONTROL = (PenaltyFunctionAbstract.Functions.minimize_controls,) TRACK_CONTROL = (PenaltyFunctionAbstract.Functions.minimize_controls,) - MINIMIZE_STOCHASTIC_VARIABLE = (PenaltyFunctionAbstract.Functions.minimize_stochastic_variables,) + STOCHASTIC_MINIMIZE_VARIABLE = (PenaltyFunctionAbstract.Functions.stochastic_minimize_variables,) SUPERIMPOSE_MARKERS = (PenaltyFunctionAbstract.Functions.superimpose_markers,) MINIMIZE_MARKERS = (PenaltyFunctionAbstract.Functions.minimize_markers,) TRACK_MARKERS = (PenaltyFunctionAbstract.Functions.minimize_markers,) @@ -364,7 +364,7 @@ def get_type() -> Callable MINIMIZE_STATE = (PenaltyFunctionAbstract.Functions.minimize_states,) TRACK_STATE = (PenaltyFunctionAbstract.Functions.minimize_states,) MINIMIZE_FATIGUE = (PenaltyFunctionAbstract.Functions.minimize_fatigue,) - MINIMIZE_STOCHASTIC_VARIABLE = (PenaltyFunctionAbstract.Functions.minimize_stochastic_variables,) + STOCHASTIC_MINIMIZE_VARIABLE = (PenaltyFunctionAbstract.Functions.stochastic_minimize_variables,) MINIMIZE_MARKERS = (PenaltyFunctionAbstract.Functions.minimize_markers,) TRACK_MARKERS = (PenaltyFunctionAbstract.Functions.minimize_markers,) MINIMIZE_MARKERS_VELOCITY = (PenaltyFunctionAbstract.Functions.minimize_markers_velocity,) diff --git a/bioptim/limits/penalty.py b/bioptim/limits/penalty.py index 9928243a3..ef20baf11 100644 --- a/bioptim/limits/penalty.py +++ b/bioptim/limits/penalty.py @@ -102,7 +102,7 @@ def minimize_controls(penalty: PenaltyOption, controller: PenaltyController, key return controller.controls[key].cx_start @staticmethod - def minimize_stochastic_variables(penalty: PenaltyOption, controller: PenaltyController, key: str): + def stochastic_minimize_variables(penalty: PenaltyOption, controller: PenaltyController, key: str): """ Minimize a stochastic variable. By default, this function is quadratic, meaning that it minimizes towards the target. @@ -1005,39 +1005,6 @@ def continuity(penalty: PenaltyOption, controller: PenaltyController | list): return continuity - @staticmethod - def covariance_matrix_continuity_implicit( - penalty: PenaltyOption, controller: PenaltyController, motor_noise_magnitude: DM, sensory_noise_magnitude: DM - ): - nx = controller.states.cx_start.shape[0] - P_matrix = controller.integrated_values["cov"].reshape_to_matrix( - controller.stochastic_variables, nx, nx, Node.START, "cov" - ) - A_matrix = controller.stochastic_variables["a"].reshape_to_matrix( - controller.stochastic_variables, nx, nx, Node.START, "a" - ) - C_matrix = controller.stochastic_variables["c"].reshape_to_matrix( - controller.stochastic_variables, nx, nx, Node.START, "c" - ) - M_matrix = controller.stochastic_variables["m"].reshape_to_matrix( - controller.stochastic_variables, nx, nx, Node.START, "m" - ) - - sigma_w = vertcat(sensory_noise_magnitude, motor_noise_magnitude) - dt = 1 / controller.ns - dg_dw = -dt * C_matrix - dg_dx = -MX_eye(A_matrix.shape[0]) - dt / 2 * A_matrix - - p_next = M_matrix @ (dg_dx @ P_matrix @ dg_dx.T + dg_dw @ sigma_w @ dg_dw.T) @ M_matrix.T - p_implicit_deffect = p_next - P_matrix - - penalty.expand = controller.get_nlp.dynamics_type.expand - penalty.explicit_derivative = True - penalty.multi_thread = True - - out_vector = controller.integrated_values["cov"].reshape_to_vector(p_implicit_deffect) - return out_vector - @staticmethod def custom(penalty: PenaltyOption, controller: PenaltyController | list, **parameters: Any): """ diff --git a/bioptim/optimization/stochastic_optimal_control_program.py b/bioptim/optimization/stochastic_optimal_control_program.py index 2f3ef2de2..d2cd620aa 100644 --- a/bioptim/optimization/stochastic_optimal_control_program.py +++ b/bioptim/optimization/stochastic_optimal_control_program.py @@ -203,13 +203,13 @@ def _declare_multi_node_penalties(self, multinode_constraints: ConstraintList, m def _prepare_stochastic_dynamics_explicit(self, motor_noise_magnitude, sensory_noise_magnitude): """ - ... + Adds the internal constraint needed for the explicit formulation of the stochastic ocp. """ penalty_m_dg_dz_list = MultinodeConstraintList() for i_phase, nlp in enumerate(self.nlp): for i_node in range(nlp.ns - 1): penalty_m_dg_dz_list.add( - MultinodeConstraintFcn.M_EQUALS_INVERSE_OF_DG_DZ, + MultinodeConstraintFcn.STOCHASTIC_HELPER_MATRIX_IMPLICIT, nodes_phase=(i_phase, i_phase), nodes=(i_node, i_node + 1), dynamics=nlp.dynamics_type.dynamic_function, @@ -218,7 +218,7 @@ def _prepare_stochastic_dynamics_explicit(self, motor_noise_magnitude, sensory_n ) if i_phase > 0: # TODO: verify with Friedl, but should be OK penalty_m_dg_dz_list.add( - MultinodeConstraintFcn.M_EQUALS_INVERSE_OF_DG_DZ, + MultinodeConstraintFcn.STOCHASTIC_HELPER_MATRIX_IMPLICIT, nodes_phase=(i_phase - 1, i_phase), nodes=(-1, 0), dynamics=nlp.dynamics_type.dynamic_function, @@ -229,25 +229,25 @@ def _prepare_stochastic_dynamics_explicit(self, motor_noise_magnitude, sensory_n def _prepare_stochastic_dynamics_implicit(self, motor_noise_magnitude, sensory_noise_magnitude): """ - ... + Adds the internal constraint needed for the implicit formulation of the stochastic ocp. """ - # constrain A, C, P, M TODO: some are missing + # constrain A, C, P, M TODO: Charbie -> some are missing multi_node_penalties = MultinodeConstraintList() single_node_penalties = ConstraintList() # constrain M for i_phase, nlp in enumerate(self.nlp): for i_node in range(nlp.ns - 1): multi_node_penalties.add( - MultinodeConstraintFcn.M_EQUALS_INVERSE_OF_DG_DZ, + MultinodeConstraintFcn.STOCHASTIC_HELPER_MATRIX_IMPLICIT, nodes_phase=(i_phase, i_phase), nodes=(i_node, i_node + 1), dynamics=nlp.dynamics_type.dynamic_function, motor_noise_magnitude=motor_noise_magnitude, sensory_noise_magnitude=sensory_noise_magnitude, ) - if i_phase > 0: # TODO: verify with Friedl, but should be OK + if i_phase > 0: multi_node_penalties.add( - MultinodeConstraintFcn.M_EQUALS_INVERSE_OF_DG_DZ, + MultinodeConstraintFcn.STOCHASTIC_HELPER_MATRIX_IMPLICIT, nodes_phase=(i_phase - 1, i_phase), nodes=(-1, 0), dynamics=nlp.dynamics_type.dynamic_function, @@ -258,7 +258,7 @@ def _prepare_stochastic_dynamics_implicit(self, motor_noise_magnitude, sensory_n # Constrain P for i_phase, nlp in enumerate(self.nlp): single_node_penalties.add( - ConstraintFcn.COVARIANCE_MATRIX_CONINUITY_IMPLICIT, + MultinodeConstraintFcn.STOCHASTIC_COVARIANCE_MATRIX_CONTINUITY_IMPLICIT, node=Node.ALL, phase=i_phase, motor_noise_magnitude=motor_noise_magnitude, @@ -266,7 +266,7 @@ def _prepare_stochastic_dynamics_implicit(self, motor_noise_magnitude, sensory_n ) if i_phase > 0: multi_node_penalties.add( # TODO: check - MultinodeConstraintFcn.COVARIANCE_MATRIX_CONINUITY_IMPLICIT, # TODO: to be continued in penalty + MultinodeConstraintFcn.STOCHASTIC_COVARIANCE_MATRIX_CONTINUITY_IMPLICIT, # TODO: to be continued in penalty nodes_phase=(i_phase - 1, i_phase), nodes=(-1, 0), motor_noise_magnitude=motor_noise_magnitude, @@ -275,7 +275,7 @@ def _prepare_stochastic_dynamics_implicit(self, motor_noise_magnitude, sensory_n # Constrain A for i_phase, nlp in enumerate(self.nlp): single_node_penalties.add( - ConstraintFcn.A_EQUALS_DF_DX, + ConstraintFcn.STOCHASTIC_DF_DX_IMPLICIT, node=Node.ALL, phase=i_phase, motor_noise_magnitude=motor_noise_magnitude, @@ -285,7 +285,7 @@ def _prepare_stochastic_dynamics_implicit(self, motor_noise_magnitude, sensory_n # Constrain C for i_phase, nlp in enumerate(self.nlp): single_node_penalties.add( - ConstraintFcn.C_EQUALS_DF_DW, + ConstraintFcn.STOCHASTIC_DF_DW_IMPLICIT, node=Node.ALL, phase=i_phase, motor_noise_magnitude=motor_noise_magnitude, From a8c0f51700f5ab88151f28877789eb065a6ff8d4 Mon Sep 17 00:00:00 2001 From: Charbie Date: Fri, 14 Jul 2023 14:18:58 +0200 Subject: [PATCH 39/54] made requested changes --- bioptim/__init__.py | 2 +- .../arm_reaching_muscle_driven.py | 4 ++-- .../arm_reaching_torque_driven.py | 4 ++-- bioptim/limits/penalty_controller.py | 1 + .../optimization/optimal_control_program.py | 2 ++ bioptim/optimization/problem_type.py | 2 +- .../stochastic_optimal_control_program.py | 18 +++++++++--------- tests/utils.py | 5 ++--- 8 files changed, 20 insertions(+), 18 deletions(-) diff --git a/bioptim/__init__.py b/bioptim/__init__.py index 7b1a5106e..e39bd0d64 100644 --- a/bioptim/__init__.py +++ b/bioptim/__init__.py @@ -221,5 +221,5 @@ from .optimization.variational_optimal_control_program import VariationalOptimalControlProgram from .optimization.stochastic_optimal_control_program import StochasticOptimalControlProgram -from .optimization.problem_type import OcpType +from .optimization.problem_type import SocpType from .misc.casadi_expand import lt, le, gt, ge, if_else, if_else_zero diff --git a/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py b/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py index 5ae4364e4..04d844ee1 100644 --- a/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py +++ b/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py @@ -31,7 +31,7 @@ DynamicsList, BoundsList, InterpolationType, - OcpType, + SocpType, PenaltyController, Node, ConstraintList, @@ -655,7 +655,7 @@ def prepare_socp( skip_continuity=True, n_threads=1, assume_phase_dynamics=False, - problem_type=OcpType.SOCP_EXPLICIT(motor_noise_magnitude, sensory_noise_magnitude), + problem_type=SocpType.SOCP_EXPLICIT(motor_noise_magnitude, sensory_noise_magnitude), integrated_value_functions=integrated_value_functions, ) diff --git a/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py b/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py index 9fa9ef6bb..5da90fac0 100644 --- a/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py +++ b/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py @@ -29,7 +29,7 @@ DynamicsList, BoundsList, InterpolationType, - OcpType, + SocpType, PenaltyController, Node, ConstraintList, @@ -780,7 +780,7 @@ def prepare_socp( skip_continuity=True, n_threads=1, assume_phase_dynamics=False, - problem_type=OcpType.SOCP_EXPLICIT(motor_noise_magnitude, sensory_noise_magnitude), + problem_type=SocpType.SOCP_EXPLICIT(motor_noise_magnitude, sensory_noise_magnitude), integrated_value_functions=integrated_value_functions, ) diff --git a/bioptim/limits/penalty_controller.py b/bioptim/limits/penalty_controller.py index d14d6b8eb..b2bcb2b1d 100644 --- a/bioptim/limits/penalty_controller.py +++ b/bioptim/limits/penalty_controller.py @@ -160,6 +160,7 @@ def stochastic_variables(self) -> OptimizationVariableList: ------- The stochastic_variables at node node_index """ + # TODO: This variables should be scaled and renamed to "algebraic" self._nlp.stochastic_variables.node_index = self.node_index out = self._nlp.stochastic_variables out.current_cx_to_get = self.cx_index_to_get diff --git a/bioptim/optimization/optimal_control_program.py b/bioptim/optimization/optimal_control_program.py index 61c23a8a6..c0b420cfa 100644 --- a/bioptim/optimization/optimal_control_program.py +++ b/bioptim/optimization/optimal_control_program.py @@ -141,6 +141,8 @@ class OptimalControlProgram: overrides an objective only the latter is preserved when saved """ + # TODO: OCP should not be aware of s (s_init, s_bounds...) + def __init__( self, bio_model: list | tuple | BioModel, diff --git a/bioptim/optimization/problem_type.py b/bioptim/optimization/problem_type.py index 4b0c4a3bc..ad940b27d 100644 --- a/bioptim/optimization/problem_type.py +++ b/bioptim/optimization/problem_type.py @@ -1,7 +1,7 @@ from casadi import DM -class OcpType: +class SocpType: """ Selection of the type of optimization problem to be solved. """ diff --git a/bioptim/optimization/stochastic_optimal_control_program.py b/bioptim/optimization/stochastic_optimal_control_program.py index d2cd620aa..643dec412 100644 --- a/bioptim/optimization/stochastic_optimal_control_program.py +++ b/bioptim/optimization/stochastic_optimal_control_program.py @@ -19,7 +19,7 @@ from ..misc.enums import Node, ControlType from ..misc.mapping import BiMappingList, Mapping, NodeMappingList, BiMapping from ..optimization.parameters import ParameterList, Parameter -from ..optimization.problem_type import OcpType +from ..optimization.problem_type import SocpType from ..optimization.optimal_control_program import OptimalControlProgram from ..optimization.variable_scaling import VariableScalingList, VariableScaling @@ -68,7 +68,7 @@ def __init__( skip_continuity: bool = False, assume_phase_dynamics: bool = False, integrated_value_functions: dict[str, Callable] = None, - problem_type: OcpType.SOCP_EXPLICIT | OcpType.SOCP_IMPLICIT = OcpType.SOCP_EXPLICIT, + problem_type: SocpType.SOCP_EXPLICIT | SocpType.SOCP_IMPLICIT = SocpType.SOCP_EXPLICIT, **kwargs, ): """ """ @@ -192,11 +192,11 @@ def _declare_multi_node_penalties(self, multinode_constraints: ConstraintList, m multinode_objectives.add_or_replace_to_penalty_pool(self) # Add the internal multi-node constraints for the stochastic ocp - if isinstance(self.problem_type, OcpType.SOCP_EXPLICIT): + if isinstance(self.problem_type, SocpType.SOCP_EXPLICIT): self._prepare_stochastic_dynamics_explicit( motor_noise_magnitude=self.problem_type.motor_noise_magnitude, sensory_noise_magnitude=self.problem_type.sensory_noise_magnitude ) - elif isinstance(self.problem_type, OcpType.SOCP_IMPLICIT): + elif isinstance(self.problem_type, SocpType.SOCP_IMPLICIT): self._prepare_stochastic_dynamics_implicit( motor_noise_magnitude=self.problem_type.motor_noise_magnitude, sensory_noise_magnitude=self.problem_type.sensory_noise_magnitude ) @@ -231,10 +231,10 @@ def _prepare_stochastic_dynamics_implicit(self, motor_noise_magnitude, sensory_n """ Adds the internal constraint needed for the implicit formulation of the stochastic ocp. """ - # constrain A, C, P, M TODO: Charbie -> some are missing + # constraint A, C, P, M TODO: Charbie -> some are missing multi_node_penalties = MultinodeConstraintList() single_node_penalties = ConstraintList() - # constrain M + # Constraints for M for i_phase, nlp in enumerate(self.nlp): for i_node in range(nlp.ns - 1): multi_node_penalties.add( @@ -255,7 +255,7 @@ def _prepare_stochastic_dynamics_implicit(self, motor_noise_magnitude, sensory_n sensory_noise_magnitude=sensory_noise_magnitude, ) - # Constrain P + # Constraints for P for i_phase, nlp in enumerate(self.nlp): single_node_penalties.add( MultinodeConstraintFcn.STOCHASTIC_COVARIANCE_MATRIX_CONTINUITY_IMPLICIT, @@ -272,7 +272,7 @@ def _prepare_stochastic_dynamics_implicit(self, motor_noise_magnitude, sensory_n motor_noise_magnitude=motor_noise_magnitude, sensory_noise_magnitude=sensory_noise_magnitude, ) - # Constrain A + # Constraints for A for i_phase, nlp in enumerate(self.nlp): single_node_penalties.add( ConstraintFcn.STOCHASTIC_DF_DX_IMPLICIT, @@ -282,7 +282,7 @@ def _prepare_stochastic_dynamics_implicit(self, motor_noise_magnitude, sensory_n sensory_noise_magnitude=sensory_noise_magnitude, ) - # Constrain C + # Constraints for C for i_phase, nlp in enumerate(self.nlp): single_node_penalties.add( ConstraintFcn.STOCHASTIC_DF_DW_IMPLICIT, diff --git a/tests/utils.py b/tests/utils.py index 6b3a89bf2..293598d43 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -60,9 +60,8 @@ def save_and_load(sol, ocp, test_solve_of_loaded=False): TestUtils.deep_assert(controls, sol.controls) TestUtils.deep_assert(parameters, sol.parameters) - # @ Pariterre, merge problem ? - # os.remove(f"{file_path}.bo") - # os.remove(f"{file_path}_sa.bo") + os.remove(f"{file_path}.bo") + os.remove(f"{file_path}_sa.bo") @staticmethod def deep_assert(first_elem, second_elem): From de63b711509d2437ffef2a85cb3b735e7b39274e Mon Sep 17 00:00:00 2001 From: Charbie Date: Fri, 14 Jul 2023 14:24:32 +0200 Subject: [PATCH 40/54] blacked --- .../LeuvenArmModel.py | 1 + .../arm_reaching_muscle_driven.py | 31 +++++++++++++------ .../arm_reaching_torque_driven.py | 21 +++++++------ bioptim/limits/multinode_constraint.py | 4 ++- bioptim/limits/multinode_penalty.py | 6 ++-- .../stochastic_optimal_control_program.py | 6 ++-- 6 files changed, 46 insertions(+), 23 deletions(-) diff --git a/bioptim/examples/stochastic_optimal_control/LeuvenArmModel.py b/bioptim/examples/stochastic_optimal_control/LeuvenArmModel.py index 3a818af78..035fa011c 100644 --- a/bioptim/examples/stochastic_optimal_control/LeuvenArmModel.py +++ b/bioptim/examples/stochastic_optimal_control/LeuvenArmModel.py @@ -6,6 +6,7 @@ import casadi as cas import numpy as np + class LeuvenArmModel: """ This allows to generate the same model as in the paper. diff --git a/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py b/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py index 04d844ee1..854680e22 100644 --- a/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py +++ b/bioptim/examples/stochastic_optimal_control/arm_reaching_muscle_driven.py @@ -42,6 +42,7 @@ from bioptim.examples.stochastic_optimal_control.LeuvenArmModel import LeuvenArmModel + def stochastic_forward_dynamics( states: cas.MX | cas.SX, controls: cas.MX | cas.SX, @@ -53,7 +54,6 @@ def stochastic_forward_dynamics( force_field_magnitude, with_gains, ) -> DynamicsEvaluation: - q = DynamicsFunctions.get(nlp.states["q"], states) qdot = DynamicsFunctions.get(nlp.states["qdot"], states) mus_activations = DynamicsFunctions.get(nlp.states["muscles"], states) @@ -106,7 +106,9 @@ def stochastic_forward_dynamics( return DynamicsEvaluation(dxdt=cas.vertcat(dq_computed, dqdot_computed, dactivations_computed), defects=None) -def configure_stochastic_optimal_control_problem(ocp: OptimalControlProgram, nlp: NonLinearProgram, motor_noise, sensory_noise): +def configure_stochastic_optimal_control_problem( + ocp: OptimalControlProgram, nlp: NonLinearProgram, motor_noise, sensory_noise +): ConfigureProblem.configure_q(ocp, nlp, True, False, False) ConfigureProblem.configure_qdot(ocp, nlp, True, False, True) ConfigureProblem.configure_qddot(ocp, nlp, False, False, True) @@ -146,6 +148,7 @@ def minimize_uncertainty(controllers: list[PenaltyController], key: str) -> cas. out += cas.trace(p_partial) * dt return out + def hand_equals_ref(controller: PenaltyController) -> cas.MX: q = controller.states["q"].cx_start qdot = controller.states["qdot"].cx_start @@ -362,7 +365,9 @@ def track_final_marker(controller: PenaltyController) -> cas.MX: return ee_pos -def trapezoidal_integration_continuity_constraint(controllers: list[PenaltyController], force_field_magnitude) -> cas.MX: +def trapezoidal_integration_continuity_constraint( + controllers: list[PenaltyController], force_field_magnitude +) -> cas.MX: """ This function computes the continuity constraint for the trapezoidal integration scheme. It is computed as: @@ -512,7 +517,10 @@ def prepare_socp( ) for i in range(n_shooting - 1): multinode_constraints.add( - trapezoidal_integration_continuity_constraint, nodes_phase=[0, 0], nodes=[i, i + 1], force_field_magnitude=force_field_magnitude + trapezoidal_integration_continuity_constraint, + nodes_phase=[0, 0], + nodes=[i, i + 1], + force_field_magnitude=force_field_magnitude, ) # Dynamics @@ -625,7 +633,7 @@ def prepare_socp( min_bound=stochastic_min[curent_index : curent_index + n_states * n_states, :], max_bound=stochastic_max[curent_index : curent_index + n_states * n_states, :], ) - + integrated_value_functions = { "cov": lambda nlp, node_index: get_cov_mat( nlp, @@ -673,7 +681,7 @@ def main(): # --- Prepare the ocp --- # dt = 0.01 final_time = 0.8 - n_shooting = int(final_time/dt) + 1 + n_shooting = int(final_time / dt) + 1 final_time += dt # --- Noise constants --- # @@ -742,10 +750,10 @@ def main(): with open(f"leuvenarm_muscle_driven_socp_{problem_type}_forcefield{force_field_magnitude}.pkl", "wb") as file: pickle.dump(data, file) - # --- Visualize the solution --- # if vizualise_sol_flag: import bioviz + b = bioviz.Viz(model_path=biorbd_model_path) b.load_movement(q_sol[:, :-1]) b.exec() @@ -777,7 +785,9 @@ def main(): with_gains=True, ) dyn_fun = cas.Function( - "dyn_fun", [states, controls, parameters, stochastic_variables, motor_noise_sym, sensory_noise_sym], [out.dxdt] + "dyn_fun", + [states, controls, parameters, stochastic_variables, motor_noise_sym, sensory_noise_sym], + [out.dxdt], ) fig, axs = plt.subplots(3, 2) @@ -808,7 +818,9 @@ def main(): u = excitations_sol[:, i_node] s = stochastic_variables_sol[:, i_node] k1 = dyn_fun(x_prev, u, [], s, motor_noise[:, i_node], sensory_noise[:, i_node]) - x_next = x_prev + dt * dyn_fun(x_prev + dt / 2 * k1, u, [], s, motor_noise[:, i_node], sensory_noise[:, i_node]) + x_next = x_prev + dt * dyn_fun( + x_prev + dt / 2 * k1, u, [], s, motor_noise[:, i_node], sensory_noise[:, i_node] + ) q_simulated[i_simulation, :, i_node + 1] = np.reshape(x_next[:2], (2,)) qdot_simulated[i_simulation, :, i_node + 1] = np.reshape(x_next[2:4], (2,)) mus_activation_simulated[i_simulation, :, i_node + 1] = np.reshape(x_next[4:], (6,)) @@ -851,5 +863,6 @@ def main(): plt.savefig("simulated_results.png", dpi=300) plt.show() + if __name__ == "__main__": main() diff --git a/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py b/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py index 5da90fac0..7377a9af6 100644 --- a/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py +++ b/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py @@ -159,7 +159,9 @@ def stochastic_forward_dynamics( return DynamicsEvaluation(dxdt=cas.vertcat(dq_computed, dqdot_computed, dqddot_computed), defects=defects) -def configure_stochastic_optimal_control_problem(ocp: OptimalControlProgram, nlp: NonLinearProgram, motor_noise, sensory_noise): +def configure_stochastic_optimal_control_problem( + ocp: OptimalControlProgram, nlp: NonLinearProgram, motor_noise, sensory_noise +): """ Configure the stochastic optimal control problem. """ @@ -469,7 +471,9 @@ def track_final_marker(controller: PenaltyController) -> cas.MX: return ee_pos -def trapezoidal_integration_continuity_constraint(controllers: list[PenaltyController], force_field_magnitude) -> cas.MX: +def trapezoidal_integration_continuity_constraint( + controllers: list[PenaltyController], force_field_magnitude +) -> cas.MX: """ This function computes the continuity constraint for the trapezoidal integration scheme. It is computed as: @@ -635,9 +639,10 @@ def prepare_socp( ) for i in range(n_shooting): multinode_constraints.add( - trapezoidal_integration_continuity_constraint, - nodes_phase=[0, 0], nodes=[i, i + 1], - force_field_magnitude=force_field_magnitude + trapezoidal_integration_continuity_constraint, + nodes_phase=[0, 0], + nodes=[i, i + 1], + force_field_magnitude=force_field_magnitude, ) # Dynamics @@ -709,7 +714,6 @@ def prepare_socp( u_init.add("qdddot", initial_guess=controls_init[:n_q, :], interpolation=InterpolationType.EACH_FRAME) u_init.add("tau", initial_guess=controls_init[n_q:, :], interpolation=InterpolationType.EACH_FRAME) - s_init = InitialGuessList() s_bounds = BoundsList() n_stochastic = n_tau * (n_q + n_qdot) + n_q + n_qdot + n_states * n_states # K(2x4) + ref(4x1) + M(6x6) @@ -797,7 +801,7 @@ def main(): # --- Prepare the ocp --- # dt = 0.01 final_time = 0.8 - n_shooting = int(final_time/dt) + 1 + n_shooting = int(final_time / dt) + 1 final_time += dt # --- Noise constants --- # @@ -868,8 +872,7 @@ def main(): # --- Save the results --- # with open(f"leuvenarm_torque_driven_socp_{problem_type}_forcefield{force_field_magnitude}.pkl", "wb") as file: pickle.dump(data, file) - - + # --- Visualize the results --- # if vizualize_sol_flag: import bioviz diff --git a/bioptim/limits/multinode_constraint.py b/bioptim/limits/multinode_constraint.py index aa0c4d35a..314bdc445 100644 --- a/bioptim/limits/multinode_constraint.py +++ b/bioptim/limits/multinode_constraint.py @@ -101,7 +101,9 @@ class MultinodeConstraintFcn(FcnEnum): COM_VELOCITY_EQUALITY = (MultinodeConstraintFunctions.Functions.com_velocity_equality,) TIME_CONSTRAINT = (MultinodeConstraintFunctions.Functions.time_equality,) STOCHASTIC_HELPER_MATRIX_IMPLICIT = (MultinodeConstraintFunctions.Functions.stochastic_helper_matrix_implicit,) - STOCHASTIC_COVARIANCE_MATRIX_CONTINUITY_IMPLICIT = (MultinodeConstraintFunctions.Functions.stochastic_covariance_matrix_continuity_implicit,) + STOCHASTIC_COVARIANCE_MATRIX_CONTINUITY_IMPLICIT = ( + MultinodeConstraintFunctions.Functions.stochastic_covariance_matrix_continuity_implicit, + ) @staticmethod def get_type(): diff --git a/bioptim/limits/multinode_penalty.py b/bioptim/limits/multinode_penalty.py index 9e2120e60..9ab9c983d 100644 --- a/bioptim/limits/multinode_penalty.py +++ b/bioptim/limits/multinode_penalty.py @@ -388,10 +388,12 @@ def stochastic_helper_matrix_implicit( out_vector = controllers[0].stochastic_variables["m"].reshape_to_vector(val) return out_vector - @staticmethod def stochastic_covariance_matrix_continuity_implicit( - penalty: PenaltyOption, controller: PenaltyController, motor_noise_magnitude: DM, sensory_noise_magnitude: DM + penalty: PenaltyOption, + controller: PenaltyController, + motor_noise_magnitude: DM, + sensory_noise_magnitude: DM, ): """ This functions constrain the covariance matrix to its actual value as in Gillis 2013. diff --git a/bioptim/optimization/stochastic_optimal_control_program.py b/bioptim/optimization/stochastic_optimal_control_program.py index 643dec412..6a7a9e1bd 100644 --- a/bioptim/optimization/stochastic_optimal_control_program.py +++ b/bioptim/optimization/stochastic_optimal_control_program.py @@ -194,11 +194,13 @@ def _declare_multi_node_penalties(self, multinode_constraints: ConstraintList, m # Add the internal multi-node constraints for the stochastic ocp if isinstance(self.problem_type, SocpType.SOCP_EXPLICIT): self._prepare_stochastic_dynamics_explicit( - motor_noise_magnitude=self.problem_type.motor_noise_magnitude, sensory_noise_magnitude=self.problem_type.sensory_noise_magnitude + motor_noise_magnitude=self.problem_type.motor_noise_magnitude, + sensory_noise_magnitude=self.problem_type.sensory_noise_magnitude, ) elif isinstance(self.problem_type, SocpType.SOCP_IMPLICIT): self._prepare_stochastic_dynamics_implicit( - motor_noise_magnitude=self.problem_type.motor_noise_magnitude, sensory_noise_magnitude=self.problem_type.sensory_noise_magnitude + motor_noise_magnitude=self.problem_type.motor_noise_magnitude, + sensory_noise_magnitude=self.problem_type.sensory_noise_magnitude, ) def _prepare_stochastic_dynamics_explicit(self, motor_noise_magnitude, sensory_noise_magnitude): From 77aebcce65dc81ef7444e74bb6e008589edeac05 Mon Sep 17 00:00:00 2001 From: Charbie Date: Fri, 14 Jul 2023 14:43:00 +0200 Subject: [PATCH 41/54] added a test for arm_reaching_torque_driven --- .../arm_reaching_torque_driven.py | 40 +----- bioptim/optimization/solution.py | 2 +- tests/test_global_stochastic.py | 126 ++++++++++++++++++ 3 files changed, 130 insertions(+), 38 deletions(-) diff --git a/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py b/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py index 7377a9af6..ca49222b7 100644 --- a/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py +++ b/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py @@ -177,7 +177,7 @@ def configure_stochastic_optimal_control_problem( ConfigureProblem.configure_stochastic_m(ocp, nlp, n_noised_states=6) mat_p_init = cas.DM_eye(6) * np.array( [1e-4, 1e-4, 1e-7, 1e-7, 1e-6, 1e-6] - ) # P, the oise on the acceleration should be chosen carefully (here arbitrary) + ) # P, the noise on the acceleration should be chosen carefully (here arbitrary) ConfigureProblem.configure_stochastic_cov(ocp, nlp, n_noised_states=6, initial_matrix=mat_p_init) ConfigureProblem.configure_dynamics_function( ocp, @@ -441,27 +441,6 @@ def expected_feedback_effort(controllers: list[PenaltyController], sensory_noise return f_expectedEffort_fb - -def zero_acceleration( - controller: PenaltyController, motor_noise: np.ndarray, sensory_noise: np.ndarray, force_field_magnitude: float -) -> cas.MX: - """ - No acceleration of the joints at the beginning and end of the movement. - """ - dx = stochastic_forward_dynamics( - controller.states.cx_start, - controller.controls.cx_start, - controller.parameters.cx_start, - controller.stochastic_variables.cx_start, - controller.get_nlp, - motor_noise, - sensory_noise, - force_field_magnitude=force_field_magnitude, - with_gains=False, - ) - return dx.dxdt[2:4] - - def track_final_marker(controller: PenaltyController) -> cas.MX: """ Track the hand position. @@ -602,22 +581,10 @@ def prepare_socp( ConstraintFcn.TRACK_STATE, key="q", node=Node.START, target=np.array([shoulder_pos_initial, elbow_pos_initial]) ) constraints.add(ConstraintFcn.TRACK_STATE, key="qdot", node=Node.START, target=np.array([0, 0])) - constraints.add( - zero_acceleration, - node=Node.START, - motor_noise=np.zeros((n_tau, 1)), - sensory_noise=np.zeros((n_q + n_qdot, 1)), - force_field_magnitude=force_field_magnitude, - ) + constraints.add(ConstraintFcn.TRACK_STATE, key="qddot", node=Node.START, target=0) constraints.add(track_final_marker, node=Node.PENULTIMATE, target=ee_final_position) constraints.add(ConstraintFcn.TRACK_STATE, key="qdot", node=Node.PENULTIMATE, target=np.array([0, 0])) - constraints.add( - zero_acceleration, - node=Node.PENULTIMATE, - motor_noise=np.zeros((n_tau, 1)), - sensory_noise=np.zeros((n_q + n_qdot, 1)), - force_field_magnitude=force_field_magnitude, - ) # Not possible sice the control on the last node is NaN + constraints.add(ConstraintFcn.TRACK_STATE, key="qddot", node=Node.PENULTIMATE, target=0) constraints.add( ConstraintFcn.TRACK_STATE, key="q", node=Node.ALL, min_bound=0, max_bound=180 ) # This is a bug, it should be in radians @@ -795,7 +762,6 @@ def main(): biorbd_model_path = "models/LeuvenArmModel.bioMod" - ee_initial_position = np.array([0.0, 0.2742]) # Directly from Tom's version ee_final_position = np.array([9.359873986980460e-12, 0.527332023564034]) # Directly from Tom's version # --- Prepare the ocp --- # diff --git a/bioptim/optimization/solution.py b/bioptim/optimization/solution.py index 92562ab24..bef2a2ac0 100644 --- a/bioptim/optimization/solution.py +++ b/bioptim/optimization/solution.py @@ -1700,7 +1700,7 @@ def _get_penalty_cost(self, nlp, penalty): s = np.ndarray((nlp.stochastic_variables.shape, len(col_s_idx))) for key in nlp.stochastic_variables: - s[nlp.stochastic_variables[key].index, :] = self.stochastic_variables[phase_idx][key][ + s[nlp.stochastic_variables[key].index, :] = self._stochastic_variables[phase_idx][key][ :, col_s_idx ] diff --git a/tests/test_global_stochastic.py b/tests/test_global_stochastic.py index 736841ad6..c3af48cc4 100644 --- a/tests/test_global_stochastic.py +++ b/tests/test_global_stochastic.py @@ -340,3 +340,129 @@ def test_arm_reaching_muscle_driven(): # simulate # TestUtils.simulate(sol) # TODO: charbie -> fix this # for now, it does not match because the integration is done in the multinode_constraint + +def test_arm_reaching_torque_driven(): + from bioptim.examples.stochastic_optimal_control import arm_reaching_torque_driven as ocp_module + + final_time = 0.8 + n_shooting = 4 + ee_final_position = np.array([9.359873986980460e-12, 0.527332023564034]) + problem_type = "CIRCLE" + force_field_magnitude = 0 + + dt = 0.01 + motor_noise_std = 0.05 + wPq_std = 3e-4 + wPqdot_std = 0.0024 + motor_noise_magnitude = DM(np.array([motor_noise_std**2 / dt, motor_noise_std**2 / dt])) + wPq_magnitude = DM(np.array([wPq_std**2 / dt, wPq_std**2 / dt])) + wPqdot_magnitude = DM(np.array([wPqdot_std**2 / dt, wPqdot_std**2 / dt])) + sensory_noise_magnitude = vertcat(wPq_magnitude, wPqdot_magnitude) + + bioptim_folder = os.path.dirname(ocp_module.__file__) + + ocp = ocp_module.prepare_socp( + biorbd_model_path=bioptim_folder + "/models/LeuvenArmModel.bioMod", + final_time=final_time, + n_shooting=n_shooting, + ee_final_position=ee_final_position, + motor_noise_magnitude=motor_noise_magnitude, + sensory_noise_magnitude=sensory_noise_magnitude, + force_field_magnitude=force_field_magnitude, + problem_type=problem_type, + ) + + # Solver parameters + solver = Solver.IPOPT(show_online_optim=False) + solver.set_maximum_iterations(4) + solver.set_nlp_scaling_method("none") + + sol = ocp.solve(solver) + + # Check objective function value + f = np.array(sol.cost) + np.testing.assert_equal(f.shape, (1, 1)) + np.testing.assert_almost_equal(f[0, 0], 561.0948164739301) + + # detailed cost values + np.testing.assert_almost_equal(sol.detailed_cost[0]["cost_value_weighted"], 0.0008000000000003249) + np.testing.assert_almost_equal(sol.detailed_cost[1]["cost_value_weighted"], 1.157506624022141e-06) + + # Check constraints + g = np.array(sol.constraints) + np.testing.assert_equal(g.shape, (177, 1)) + + # Check some of the results + states, controls, stochastic_variables, integrated_values = ( + sol.states, + sol.controls, + sol.stochastic_variables, + sol.integrated_values, + ) + q, qdot, qddot = states["q"], states["qdot"], states["qddot"] + qdddot, tau = controls["qdddot"], controls["tau"] + k, ref, m = stochastic_variables["k"], stochastic_variables["ref"], stochastic_variables["m"] + cov = integrated_values["cov"] + + # initial and final position + np.testing.assert_almost_equal(q[:, 0], np.array([0.34906532, 2.24586853])) + np.testing.assert_almost_equal(q[:, -2], np.array([0.92562684, 1.29034226])) + np.testing.assert_almost_equal(qdot[:, 0], np.array([-1.57899650e-07, 2.41254443e-07])) + np.testing.assert_almost_equal(qdot[:, -2], np.array([-1.55837195e-07, 2.43938827e-07])) + np.testing.assert_almost_equal( + qddot[:, 0], np.array([-1.46193801e-08, 2.26087816e-08]) + ) + np.testing.assert_almost_equal( + qddot[:, -2], np.array([1.44183405e-08, -2.27987398e-08]) + ) + + np.testing.assert_almost_equal( + qdddot[:, 0], np.array([288.28080732, -477.76320979]) + ) + np.testing.assert_almost_equal( + qdddot[:, -2], np.array([288.28080727, -477.76320985]) + ) + + np.testing.assert_almost_equal( + tau[:, 0], np.array([-3.26925993e-09, 9.16460095e-09]) + ) + np.testing.assert_almost_equal( + tau[:, -2], np.array([-4.74280539e-10, 6.73868548e-09]) + ) + + np.testing.assert_almost_equal( + k[:, 0], + np.array( + [4.64142689e-03, 4.64142689e-03, 5.12302385e-03, 5.12302385e-03, + 2.56803086e-05, 2.56803086e-05, 2.56805175e-05, 2.56805175e-05] + ), + ) + np.testing.assert_almost_equal(ref[:, 0], np.array([2.81907902e-02, 2.84412318e-01, 3.52327872e-09, -7.24617190e-08])) + np.testing.assert_almost_equal( + m[:, 0], + np.array( + [ + 9.99999999e-01, -5.52232186e-10, 9.99999999e-02, -5.57651141e-11, + 9.99999999e-03, -6.57964810e-12, -5.52264505e-10, 1.00000000e+00, + -5.57686152e-11, 1.00000000e-01, -6.58097541e-12, 1.00000000e-02, + -4.41781681e-10, -2.20857111e-10, 1.00000000e+00, -2.23035836e-11, + 1.00000000e-01, -2.62121430e-12, -2.20831950e-10, -1.09915662e-10, + -2.23011389e-11, 1.00000000e+00, -2.62129367e-12, 1.00000000e-01, + -8.82781541e-11, -4.41283053e-11, -8.81407350e-12, -4.46497667e-12, + 1.00000000e+00, -5.30124698e-13, -4.40763326e-11, -2.19521899e-11, + -4.45974851e-12, -2.12087407e-12, -5.29581943e-13, 1.00000000e+00] + ), + ) + + np.testing.assert_almost_equal( + cov[:, -2], np.array([1.00022400e-04, -2.29971564e-13, 7.19999318e-08, -3.40720475e-14, + 7.99999888e-08, -5.56777152e-15, -2.29971564e-13, 1.00022400e-04, + -3.40758584e-14, 7.19999830e-08, -5.57519308e-15, 7.99999972e-08, + 7.19999318e-08, -3.40758584e-14, 2.60000000e-07, -2.93958506e-17, + 4.00000000e-07, -1.62077043e-17, -3.40720475e-14, 7.19999830e-08, + -2.93958506e-17, 2.60000000e-07, -1.62165579e-17, 4.00000000e-07, + 7.99999888e-08, -5.57519308e-15, 4.00000000e-07, -1.62165579e-17, + 1.00000000e-06, -3.78659436e-18, -5.56777152e-15, 7.99999972e-08, + -1.62077043e-17, 4.00000000e-07, -3.78659436e-18, 1.00000000e-06] + ), + ) \ No newline at end of file From e6fcde95c6802486d82fb5670f4b3198a0dd0c97 Mon Sep 17 00:00:00 2001 From: Charbie Date: Fri, 14 Jul 2023 15:13:58 +0200 Subject: [PATCH 42/54] fixed plots --- .../arm_reaching_torque_driven.py | 1 + bioptim/gui/plot.py | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py b/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py index ca49222b7..8a54943da 100644 --- a/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py +++ b/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py @@ -806,6 +806,7 @@ def main(): ) sol_socp = socp.solve(solver) + # sol_socp.graphs() q_sol = sol_socp.states["q"] qdot_sol = sol_socp.states["qdot"] diff --git a/bioptim/gui/plot.py b/bioptim/gui/plot.py index 9086f2e62..3f28b1586 100644 --- a/bioptim/gui/plot.py +++ b/bioptim/gui/plot.py @@ -684,7 +684,12 @@ def update_data(self, v: dict): else nlp.ode_solver.steps + 1 ) - n_elements = data_time[i].shape[0] + if isinstance(data_states, dict): + n_elements = data_states[list(data_states.keys())[0]].shape[1] + elif isinstance(data_states, list): + n_elements = data_states[i][list(data_states[i].keys())[0]].shape[1] + else: + raise RuntimeError("Invalid data_states type") state = np.ndarray((0, n_elements)) for ss in nlp.states: if nlp.use_states_from_phase_idx == nlp.phase_idx: From f1fa883072e7717130be9e910563bc6705a461b2 Mon Sep 17 00:00:00 2001 From: Charbie Date: Fri, 14 Jul 2023 15:14:22 +0200 Subject: [PATCH 43/54] blacked --- .../arm_reaching_torque_driven.py | 1 + tests/test_global_stochastic.py | 142 ++++++++++++------ 2 files changed, 101 insertions(+), 42 deletions(-) diff --git a/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py b/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py index 8a54943da..21fb779b6 100644 --- a/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py +++ b/bioptim/examples/stochastic_optimal_control/arm_reaching_torque_driven.py @@ -441,6 +441,7 @@ def expected_feedback_effort(controllers: list[PenaltyController], sensory_noise return f_expectedEffort_fb + def track_final_marker(controller: PenaltyController) -> cas.MX: """ Track the hand position. diff --git a/tests/test_global_stochastic.py b/tests/test_global_stochastic.py index c3af48cc4..d247a6c9d 100644 --- a/tests/test_global_stochastic.py +++ b/tests/test_global_stochastic.py @@ -341,6 +341,7 @@ def test_arm_reaching_muscle_driven(): # TestUtils.simulate(sol) # TODO: charbie -> fix this # for now, it does not match because the integration is done in the multinode_constraint + def test_arm_reaching_torque_driven(): from bioptim.examples.stochastic_optimal_control import arm_reaching_torque_driven as ocp_module @@ -407,62 +408,119 @@ def test_arm_reaching_torque_driven(): # initial and final position np.testing.assert_almost_equal(q[:, 0], np.array([0.34906532, 2.24586853])) np.testing.assert_almost_equal(q[:, -2], np.array([0.92562684, 1.29034226])) - np.testing.assert_almost_equal(qdot[:, 0], np.array([-1.57899650e-07, 2.41254443e-07])) - np.testing.assert_almost_equal(qdot[:, -2], np.array([-1.55837195e-07, 2.43938827e-07])) - np.testing.assert_almost_equal( - qddot[:, 0], np.array([-1.46193801e-08, 2.26087816e-08]) - ) - np.testing.assert_almost_equal( - qddot[:, -2], np.array([1.44183405e-08, -2.27987398e-08]) - ) + np.testing.assert_almost_equal(qdot[:, 0], np.array([-1.57899650e-07, 2.41254443e-07])) + np.testing.assert_almost_equal(qdot[:, -2], np.array([-1.55837195e-07, 2.43938827e-07])) + np.testing.assert_almost_equal(qddot[:, 0], np.array([-1.46193801e-08, 2.26087816e-08])) + np.testing.assert_almost_equal(qddot[:, -2], np.array([1.44183405e-08, -2.27987398e-08])) - np.testing.assert_almost_equal( - qdddot[:, 0], np.array([288.28080732, -477.76320979]) - ) - np.testing.assert_almost_equal( - qdddot[:, -2], np.array([288.28080727, -477.76320985]) - ) + np.testing.assert_almost_equal(qdddot[:, 0], np.array([288.28080732, -477.76320979])) + np.testing.assert_almost_equal(qdddot[:, -2], np.array([288.28080727, -477.76320985])) - np.testing.assert_almost_equal( - tau[:, 0], np.array([-3.26925993e-09, 9.16460095e-09]) - ) - np.testing.assert_almost_equal( - tau[:, -2], np.array([-4.74280539e-10, 6.73868548e-09]) - ) + np.testing.assert_almost_equal(tau[:, 0], np.array([-3.26925993e-09, 9.16460095e-09])) + np.testing.assert_almost_equal(tau[:, -2], np.array([-4.74280539e-10, 6.73868548e-09])) np.testing.assert_almost_equal( k[:, 0], np.array( - [4.64142689e-03, 4.64142689e-03, 5.12302385e-03, 5.12302385e-03, - 2.56803086e-05, 2.56803086e-05, 2.56805175e-05, 2.56805175e-05] + [ + 4.64142689e-03, + 4.64142689e-03, + 5.12302385e-03, + 5.12302385e-03, + 2.56803086e-05, + 2.56803086e-05, + 2.56805175e-05, + 2.56805175e-05, + ] ), ) - np.testing.assert_almost_equal(ref[:, 0], np.array([2.81907902e-02, 2.84412318e-01, 3.52327872e-09, -7.24617190e-08])) + np.testing.assert_almost_equal( + ref[:, 0], np.array([2.81907902e-02, 2.84412318e-01, 3.52327872e-09, -7.24617190e-08]) + ) np.testing.assert_almost_equal( m[:, 0], np.array( [ - 9.99999999e-01, -5.52232186e-10, 9.99999999e-02, -5.57651141e-11, - 9.99999999e-03, -6.57964810e-12, -5.52264505e-10, 1.00000000e+00, - -5.57686152e-11, 1.00000000e-01, -6.58097541e-12, 1.00000000e-02, - -4.41781681e-10, -2.20857111e-10, 1.00000000e+00, -2.23035836e-11, - 1.00000000e-01, -2.62121430e-12, -2.20831950e-10, -1.09915662e-10, - -2.23011389e-11, 1.00000000e+00, -2.62129367e-12, 1.00000000e-01, - -8.82781541e-11, -4.41283053e-11, -8.81407350e-12, -4.46497667e-12, - 1.00000000e+00, -5.30124698e-13, -4.40763326e-11, -2.19521899e-11, - -4.45974851e-12, -2.12087407e-12, -5.29581943e-13, 1.00000000e+00] + 9.99999999e-01, + -5.52232186e-10, + 9.99999999e-02, + -5.57651141e-11, + 9.99999999e-03, + -6.57964810e-12, + -5.52264505e-10, + 1.00000000e00, + -5.57686152e-11, + 1.00000000e-01, + -6.58097541e-12, + 1.00000000e-02, + -4.41781681e-10, + -2.20857111e-10, + 1.00000000e00, + -2.23035836e-11, + 1.00000000e-01, + -2.62121430e-12, + -2.20831950e-10, + -1.09915662e-10, + -2.23011389e-11, + 1.00000000e00, + -2.62129367e-12, + 1.00000000e-01, + -8.82781541e-11, + -4.41283053e-11, + -8.81407350e-12, + -4.46497667e-12, + 1.00000000e00, + -5.30124698e-13, + -4.40763326e-11, + -2.19521899e-11, + -4.45974851e-12, + -2.12087407e-12, + -5.29581943e-13, + 1.00000000e00, + ] ), ) np.testing.assert_almost_equal( - cov[:, -2], np.array([1.00022400e-04, -2.29971564e-13, 7.19999318e-08, -3.40720475e-14, - 7.99999888e-08, -5.56777152e-15, -2.29971564e-13, 1.00022400e-04, - -3.40758584e-14, 7.19999830e-08, -5.57519308e-15, 7.99999972e-08, - 7.19999318e-08, -3.40758584e-14, 2.60000000e-07, -2.93958506e-17, - 4.00000000e-07, -1.62077043e-17, -3.40720475e-14, 7.19999830e-08, - -2.93958506e-17, 2.60000000e-07, -1.62165579e-17, 4.00000000e-07, - 7.99999888e-08, -5.57519308e-15, 4.00000000e-07, -1.62165579e-17, - 1.00000000e-06, -3.78659436e-18, -5.56777152e-15, 7.99999972e-08, - -1.62077043e-17, 4.00000000e-07, -3.78659436e-18, 1.00000000e-06] + cov[:, -2], + np.array( + [ + 1.00022400e-04, + -2.29971564e-13, + 7.19999318e-08, + -3.40720475e-14, + 7.99999888e-08, + -5.56777152e-15, + -2.29971564e-13, + 1.00022400e-04, + -3.40758584e-14, + 7.19999830e-08, + -5.57519308e-15, + 7.99999972e-08, + 7.19999318e-08, + -3.40758584e-14, + 2.60000000e-07, + -2.93958506e-17, + 4.00000000e-07, + -1.62077043e-17, + -3.40720475e-14, + 7.19999830e-08, + -2.93958506e-17, + 2.60000000e-07, + -1.62165579e-17, + 4.00000000e-07, + 7.99999888e-08, + -5.57519308e-15, + 4.00000000e-07, + -1.62165579e-17, + 1.00000000e-06, + -3.78659436e-18, + -5.56777152e-15, + 7.99999972e-08, + -1.62077043e-17, + 4.00000000e-07, + -3.78659436e-18, + 1.00000000e-06, + ] ), - ) \ No newline at end of file + ) From 2e4c1d3a7799b6e95c82d1891cafdae9d4fdbe60 Mon Sep 17 00:00:00 2001 From: Charbie Date: Fri, 14 Jul 2023 15:28:38 +0200 Subject: [PATCH 44/54] test mass_matrix + nleffects --- tests/test_biorbd_multi_model.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/test_biorbd_multi_model.py b/tests/test_biorbd_multi_model.py index 89c3d4c5b..735d503b8 100644 --- a/tests/test_biorbd_multi_model.py +++ b/tests/test_biorbd_multi_model.py @@ -100,6 +100,8 @@ def test_biorbd_model(): center_of_mass = Function("CoM", [], [models.center_of_mass(q)])()["o0"] center_of_mass_velocity = Function("CoMdot", [], [models.center_of_mass_velocity(q, qdot)])()["o0"] center_of_mass_acceleration = Function("CoMddot", [], [models.center_of_mass_acceleration(q, qdot, qdot)])()["o0"] + mass_matrix = Function("MassMatrix", [], models.mass_matrix(q))() + non_linear_effects = Function("NonLinearEffect", [], models.non_linear_effects(q, qdot))() angular_momentum = Function("AngMom", [], [models.angular_momentum(q, qdot)])()["o0"] reshape_qdot = Function("GetQdot", [], [models.reshape_qdot(q, qdot, 1)])()["o0"] segment_angular_velocity = Function("SegmentAngMom", [], [models.segment_angular_velocity(q, qdot, 0)])()["o0"] @@ -250,6 +252,23 @@ def test_biorbd_model(): center_of_mass_acceleration[i], DM(np.array([0, -1.2543, 0.750037, 0, -0.097267, 2.34977])[i]), decimal=5 ) + for i in range(3): + for j in range(3): + np.testing.assert_almost_equal( + mass_matrix["o0"][i, j], DM(np.array([[8.99991, 5.14091, 1.44319], [5.14091, 4.23625, 1.61812], [1.44319, 1.61812, 0.954331]])[i, j]), decimal=5 + ) + np.testing.assert_almost_equal( + mass_matrix["o1"][i, j], DM(np.array([[13.3131, 7.56109, 2.76416], [7.56109, 4.75431, 1.87716], [2.76416, 1.87716, 0.945231]])[i, j]), decimal=5 + ) + + for j in range(3): + np.testing.assert_almost_equal( + non_linear_effects["o0"][j], DM(np.array([7.01844, 7.1652, 3.02573])[j]), decimal=5 + ) + np.testing.assert_almost_equal( + non_linear_effects["o1"][j], DM(np.array([10.3449, 6.41134, 2.68226])[j]), decimal=5 + ) + for i in range(angular_momentum.shape[0]): np.testing.assert_almost_equal( angular_momentum[i], From 6e6de63f6e1f1aac5af43e81823d18ef75575bcd Mon Sep 17 00:00:00 2001 From: Charbie Date: Fri, 14 Jul 2023 15:29:32 +0200 Subject: [PATCH 45/54] blacked --- tests/test_biorbd_multi_model.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/tests/test_biorbd_multi_model.py b/tests/test_biorbd_multi_model.py index 735d503b8..b656fe565 100644 --- a/tests/test_biorbd_multi_model.py +++ b/tests/test_biorbd_multi_model.py @@ -255,10 +255,22 @@ def test_biorbd_model(): for i in range(3): for j in range(3): np.testing.assert_almost_equal( - mass_matrix["o0"][i, j], DM(np.array([[8.99991, 5.14091, 1.44319], [5.14091, 4.23625, 1.61812], [1.44319, 1.61812, 0.954331]])[i, j]), decimal=5 + mass_matrix["o0"][i, j], + DM( + np.array([[8.99991, 5.14091, 1.44319], [5.14091, 4.23625, 1.61812], [1.44319, 1.61812, 0.954331]])[ + i, j + ] + ), + decimal=5, ) np.testing.assert_almost_equal( - mass_matrix["o1"][i, j], DM(np.array([[13.3131, 7.56109, 2.76416], [7.56109, 4.75431, 1.87716], [2.76416, 1.87716, 0.945231]])[i, j]), decimal=5 + mass_matrix["o1"][i, j], + DM( + np.array([[13.3131, 7.56109, 2.76416], [7.56109, 4.75431, 1.87716], [2.76416, 1.87716, 0.945231]])[ + i, j + ] + ), + decimal=5, ) for j in range(3): From 1b615e0ef4081a66e6a09bbf6bc34478faa44d1f Mon Sep 17 00:00:00 2001 From: Mac-eve Date: Mon, 17 Jul 2023 10:19:08 +0200 Subject: [PATCH 46/54] fixed acados? --- bioptim/interfaces/acados_interface.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/bioptim/interfaces/acados_interface.py b/bioptim/interfaces/acados_interface.py index fe4531aa2..72a64c9db 100644 --- a/bioptim/interfaces/acados_interface.py +++ b/bioptim/interfaces/acados_interface.py @@ -279,20 +279,21 @@ def __set_constraints(self, ocp): x = nlp.states.cx_start u = nlp.controls.cx_start p = nlp.parameters.cx + s = nlp.stochastic_variables.cx_start for g, G in enumerate(nlp.g): if not G: continue if G.node[0] == Node.ALL or G.node[0] == Node.ALL_SHOOTING: - self.all_constr = vertcat(self.all_constr, G.function[0](x, u, p)) + self.all_constr = vertcat(self.all_constr, G.function[0](x, u, p, s)) self.all_g_bounds.concatenate(G.bounds) if G.node[0] == Node.ALL: - self.end_constr = vertcat(self.end_constr, G.function[0](x, u, p)) + self.end_constr = vertcat(self.end_constr, G.function[0](x, u, p, s)) self.end_g_bounds.concatenate(G.bounds) elif G.node[0] == Node.END: - self.end_constr = vertcat(self.end_constr, G.function[0](x, u, p)) + self.end_constr = vertcat(self.end_constr, G.function[0](x, u, p, s)) self.end_g_bounds.concatenate(G.bounds) else: @@ -465,8 +466,8 @@ def _adjust_dim(): else: raise RuntimeError(f"{objectives.type.name} is an incompatible objective term with LINEAR_LS cost type") - def add_nonlinear_ls_lagrange(acados, objectives, x, u, p): - acados.lagrange_costs = vertcat(acados.lagrange_costs, objectives.function[0](x, u, p).reshape((-1, 1))) + def add_nonlinear_ls_lagrange(acados, objectives, x, u, p, s): + acados.lagrange_costs = vertcat(acados.lagrange_costs, objectives.function[0](x, u, p, s).reshape((-1, 1))) acados.W = linalg.block_diag(acados.W, np.diag([objectives.weight] * objectives.function[0].numel_out())) node_idx = objectives.node_idx[:-1] if objectives.node[0] == Node.ALL else objectives.node_idx @@ -475,14 +476,14 @@ def add_nonlinear_ls_lagrange(acados, objectives, x, u, p): else: acados.y_ref.append([np.zeros((objectives.function[0].numel_out(), 1)) for _ in node_idx]) - def add_nonlinear_ls_mayer(acados, objectives, x, u, p, node=None): + def add_nonlinear_ls_mayer(acados, objectives, x, u, p, s, node=None): if objectives.node[0] not in [Node.INTERMEDIATES, Node.PENULTIMATE, Node.END]: acados.W_0 = linalg.block_diag( acados.W_0, np.diag([objectives.weight] * objectives.function[0].numel_out()) ) x = x if objectives.function[0].sparsity_in("i0").shape != (0, 0) else [] u = u if objectives.function[0].sparsity_in("i1").shape != (0, 0) else [] - acados.mayer_costs = vertcat(acados.mayer_costs, objectives.function[0](x, u, p).reshape((-1, 1))) + acados.mayer_costs = vertcat(acados.mayer_costs, objectives.function[0](x, u, p, s).reshape((-1, 1))) if objectives.target is not None: acados.y_ref_start.append(objectives.target[0][..., 0].T.reshape((-1, 1))) @@ -495,7 +496,7 @@ def add_nonlinear_ls_mayer(acados, objectives, x, u, p, node=None): ) x = x if objectives.function[0].sparsity_in("i0").shape != (0, 0) else [] u = u if objectives.function[0].sparsity_in("i1").shape != (0, 0) else [] - acados.mayer_costs_e = vertcat(acados.mayer_costs_e, objectives.function[0](x, u, p).reshape((-1, 1))) + acados.mayer_costs_e = vertcat(acados.mayer_costs_e, objectives.function[0](x, u, p, s).reshape((-1, 1))) if objectives.target is not None: acados.y_ref_end.append(objectives.target[0][..., -1].T.reshape((-1, 1))) From 4c974c0114f46d8536e81f2a7c5d0fc67c96f5e2 Mon Sep 17 00:00:00 2001 From: Mac-eve Date: Mon, 17 Jul 2023 10:29:23 +0200 Subject: [PATCH 47/54] fixed last tests ? --- .../examples/torque_driven_ocp/example_soft_contact.py | 8 ++++++-- bioptim/limits/penalty.py | 2 +- tests/test_penalty.py | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/bioptim/examples/torque_driven_ocp/example_soft_contact.py b/bioptim/examples/torque_driven_ocp/example_soft_contact.py index 15042916e..0d2b98c6d 100644 --- a/bioptim/examples/torque_driven_ocp/example_soft_contact.py +++ b/bioptim/examples/torque_driven_ocp/example_soft_contact.py @@ -75,8 +75,10 @@ def initial_states_from_single_shooting(model, ns, tf, ode_solver): x["qdot"] = [1e-10, 1e-10, 1e-10] u = InitialGuessList() u["tau"] = [0, 0, 0] + p = InitialGuessList() + s = InitialGuessList() - sol_from_initial_guess = Solution(ocp, [x, u]) + sol_from_initial_guess = Solution(ocp, [x, u, p, s]) s = sol_from_initial_guess.integrate(shooting_type=Shooting.SINGLE, integrator=SolutionIntegrator.OCP) # s.animate() @@ -87,8 +89,10 @@ def initial_states_from_single_shooting(model, ns, tf, ode_solver): x["qdot"] = np.array([0] * 3) u = InitialGuessList() u["tau"] = [0, 0, -10] + p = InitialGuessList() + s = InitialGuessList() - sol_from_initial_guess = Solution(ocp, [x, u]) + sol_from_initial_guess = Solution(ocp, [x, u, p, s]) s = sol_from_initial_guess.integrate(shooting_type=Shooting.SINGLE, integrator=SolutionIntegrator.OCP) # s.animate() diff --git a/bioptim/limits/penalty.py b/bioptim/limits/penalty.py index ef20baf11..f2ecbcf11 100644 --- a/bioptim/limits/penalty.py +++ b/bioptim/limits/penalty.py @@ -557,7 +557,7 @@ def minimize_com_acceleration(penalty: PenaltyOption, controller: PenaltyControl controller.states.mx, controller.controls.mx, controller.parameters.mx, - controller.stochastic_variables.cx_start, + controller.stochastic_variables.mx, )[controller.states["qdot"].index, :], ) # TODO scaled? diff --git a/tests/test_penalty.py b/tests/test_penalty.py index 2b5067fa1..5471df168 100644 --- a/tests/test_penalty.py +++ b/tests/test_penalty.py @@ -959,7 +959,7 @@ def custom_with_bounds(controller: PenaltyController): RuntimeError, match="You cannot have non linear bounds for custom constraints and min_bound or max_bound defined", ): - penalty_type(penalty, PenaltyController(ocp, ocp.nlp[0], t, x, [], [], [], [], 0)) + penalty_type(penalty, PenaltyController(ocp, ocp.nlp[0], t, x, [], [], [], [], [], 0)) @pytest.mark.parametrize("assume_phase_dynamics", [True, False]) From 37309af151e3b004652c7eb57cec0b6ec49a8993 Mon Sep 17 00:00:00 2001 From: Mac-eve Date: Mon, 17 Jul 2023 10:37:13 +0200 Subject: [PATCH 48/54] error acados --- bioptim/interfaces/acados_interface.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bioptim/interfaces/acados_interface.py b/bioptim/interfaces/acados_interface.py index 72a64c9db..5bf02c6be 100644 --- a/bioptim/interfaces/acados_interface.py +++ b/bioptim/interfaces/acados_interface.py @@ -98,6 +98,9 @@ def __init__(self, ocp, solver_options: Solver.ACADOS = None): if not ocp.assume_phase_dynamics: raise RuntimeError("ACADOS necessitate assume_phase_dynamics=True") + if ocp.nlp[0].stochastic_variables.cx_start.shape[0] != 0: + raise RuntimeError("ACADOS does not support stochastic variables yet") + super().__init__(ocp) # solver_options = solver_options.__dict__ From 6bb2632536870eafdb3bed5a3cf2f56196db0535 Mon Sep 17 00:00:00 2001 From: Charbie Date: Mon, 17 Jul 2023 10:37:55 +0200 Subject: [PATCH 49/54] blacked --- bioptim/interfaces/acados_interface.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bioptim/interfaces/acados_interface.py b/bioptim/interfaces/acados_interface.py index 5bf02c6be..4681adae8 100644 --- a/bioptim/interfaces/acados_interface.py +++ b/bioptim/interfaces/acados_interface.py @@ -499,7 +499,9 @@ def add_nonlinear_ls_mayer(acados, objectives, x, u, p, s, node=None): ) x = x if objectives.function[0].sparsity_in("i0").shape != (0, 0) else [] u = u if objectives.function[0].sparsity_in("i1").shape != (0, 0) else [] - acados.mayer_costs_e = vertcat(acados.mayer_costs_e, objectives.function[0](x, u, p, s).reshape((-1, 1))) + acados.mayer_costs_e = vertcat( + acados.mayer_costs_e, objectives.function[0](x, u, p, s).reshape((-1, 1)) + ) if objectives.target is not None: acados.y_ref_end.append(objectives.target[0][..., -1].T.reshape((-1, 1))) From 50ce6e2303984cd42c8d144509637895d7bdf865 Mon Sep 17 00:00:00 2001 From: Mac-eve Date: Mon, 17 Jul 2023 11:47:00 +0200 Subject: [PATCH 50/54] added doc to the readme --- OCP_equation.png | Bin 0 -> 493636 bytes README.md | 14 ++++++++++++++ 2 files changed, 14 insertions(+) create mode 100644 OCP_equation.png diff --git a/OCP_equation.png b/OCP_equation.png new file mode 100644 index 0000000000000000000000000000000000000000..e4ed1079e28fcfc6f601f9e70624f1b1bf398d66 GIT binary patch literal 493636 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𝔴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%0DEKTe)nST~G3-{}`K9})#j1QQ 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 O{OD-vY2>S2zWq;^(`YpS literal 0 HcmV?d00001 diff --git a/README.md b/README.md index a13b46212..c844183ab 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,8 @@ As a tour guide that uses this binder, you can watch the `bioptim` workshop that - [From the sources](#installing-from-the-sources-for-linux-mac-and-windows) - [Installation complete](#installation-complete) +[Defining our optimal control problems](#defining-our-optimal-control-problems) + [A first practical example](#a-first-practical-example) - [The import](#the-import) - [Building the ocp](#building-the-ocp) @@ -236,6 +238,18 @@ python setup.py install Assuming everything went well, that is it! You can already enjoy bioptimizing! +# Defining our optimal control problems +Here we will detail our implementation of optimal control problems and some definitions. +The mathematical transcription of the OCP is as follows: +![](OCP_equation.png) +The optimization variables are the states (x = variables that represent the state of the system at each node and that +are subject to continuity constraints), controls (u = decision variables defined at each node that have an effect on the system), +algebraic states (s = optimization variables that are defined at each node, but that are not subject to the +built-in continuity constraints), and parameters (p = optimization variables that are defined once per phase). +The state continuity constraints implementation may vary depending on the transcription of the problem (implicit vs explicit, direct multiple shooting vs direct collocations). + +The cost function can include Mayer terms (function evaluated at one node) and Lagrange terms (functions integrated over the duration of the phase). + # A first practical example The easiest way to learn `bioptim` is to dive into it. So let's do that and build our first optimal control program together. From 9188ab3494a64e40f032a9fb99ee500af6a15b60 Mon Sep 17 00:00:00 2001 From: Mac-eve Date: Mon, 17 Jul 2023 11:53:03 +0200 Subject: [PATCH 51/54] forgot g --- OCP_equation.png | Bin 493636 -> 315439 bytes README.md | 1 + 2 files changed, 1 insertion(+) diff --git a/OCP_equation.png b/OCP_equation.png index e4ed1079e28fcfc6f601f9e70624f1b1bf398d66..61d04e57b52a41c884dfe2139e375c76d48830d0 100644 GIT binary patch literal 315439 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𝔴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%0DEKTe)nST~G3-{}`K9})#j1QQ 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 O{OD-vY2>S2zWq;^(`YpS diff --git a/README.md b/README.md index c844183ab..018b87208 100644 --- a/README.md +++ b/README.md @@ -249,6 +249,7 @@ built-in continuity constraints), and parameters (p = optimization variables tha The state continuity constraints implementation may vary depending on the transcription of the problem (implicit vs explicit, direct multiple shooting vs direct collocations). The cost function can include Mayer terms (function evaluated at one node) and Lagrange terms (functions integrated over the duration of the phase). +The optimization variables can be subject to equality and/or inequality constraints. # A first practical example The easiest way to learn `bioptim` is to dive into it. From e45bc110965b91754df38703034858368e8638e5 Mon Sep 17 00:00:00 2001 From: Mac-eve Date: Mon, 17 Jul 2023 13:21:39 +0200 Subject: [PATCH 52/54] fixed acados? --- bioptim/interfaces/acados_interface.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bioptim/interfaces/acados_interface.py b/bioptim/interfaces/acados_interface.py index 4681adae8..2bb2886db 100644 --- a/bioptim/interfaces/acados_interface.py +++ b/bioptim/interfaces/acados_interface.py @@ -593,14 +593,14 @@ def add_nonlinear_ls_mayer(acados, objectives, x, u, p, s, node=None): if J.type.get_type() == ObjectiveFunction.LagrangeFunction: add_nonlinear_ls_lagrange( - self, J, nlp.states.cx_start, nlp.controls.cx_start, nlp.parameters.cx + self, J, nlp.states.cx_start, nlp.controls.cx_start, nlp.parameters.cx, nlp.stochastic_variables.cx_start ) # Deal with first and last node - add_nonlinear_ls_mayer(self, J, nlp.states.cx_start, nlp.controls.cx_start, nlp.parameters.cx) + add_nonlinear_ls_mayer(self, J, nlp.states.cx_start, nlp.controls.cx_start, nlp.parameters.cx, nlp.stochastic_variables.cx_start) elif J.type.get_type() == ObjectiveFunction.MayerFunction: - add_nonlinear_ls_mayer(self, J, nlp.states.cx_start, nlp.controls.cx_start, nlp.parameters.cx) + add_nonlinear_ls_mayer(self, J, nlp.states.cx_start, nlp.controls.cx_start, nlp.parameters.cx, nlp.stochastic_variables.cx_start) else: raise RuntimeError("The objective function is not Lagrange nor Mayer.") @@ -610,7 +610,7 @@ def add_nonlinear_ls_mayer(acados, objectives, x, u, p, s, node=None): nlp = ocp.nlp[0] # Assume 1 phase for j, J in enumerate(ocp.J): J.node = [Node.END] - add_nonlinear_ls_mayer(self, J, nlp.states.cx_start, nlp.controls.cx_start, nlp.parameters.cx) + add_nonlinear_ls_mayer(self, J, nlp.states.cx_start, nlp.controls.cx_start, nlp.parameters.cx, nlp.stochastic_variables.cx_start) # Set costs self.acados_ocp.model.cost_y_expr = ( From 7ef44d4d56b324dea3c605fd4f4a08f9deb498ae Mon Sep 17 00:00:00 2001 From: Charbie Date: Mon, 17 Jul 2023 13:22:02 +0200 Subject: [PATCH 53/54] blacked --- bioptim/interfaces/acados_interface.py | 34 +++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/bioptim/interfaces/acados_interface.py b/bioptim/interfaces/acados_interface.py index 2bb2886db..caead0d38 100644 --- a/bioptim/interfaces/acados_interface.py +++ b/bioptim/interfaces/acados_interface.py @@ -593,14 +593,33 @@ def add_nonlinear_ls_mayer(acados, objectives, x, u, p, s, node=None): if J.type.get_type() == ObjectiveFunction.LagrangeFunction: add_nonlinear_ls_lagrange( - self, J, nlp.states.cx_start, nlp.controls.cx_start, nlp.parameters.cx, nlp.stochastic_variables.cx_start + self, + J, + nlp.states.cx_start, + nlp.controls.cx_start, + nlp.parameters.cx, + nlp.stochastic_variables.cx_start, ) # Deal with first and last node - add_nonlinear_ls_mayer(self, J, nlp.states.cx_start, nlp.controls.cx_start, nlp.parameters.cx, nlp.stochastic_variables.cx_start) + add_nonlinear_ls_mayer( + self, + J, + nlp.states.cx_start, + nlp.controls.cx_start, + nlp.parameters.cx, + nlp.stochastic_variables.cx_start, + ) elif J.type.get_type() == ObjectiveFunction.MayerFunction: - add_nonlinear_ls_mayer(self, J, nlp.states.cx_start, nlp.controls.cx_start, nlp.parameters.cx, nlp.stochastic_variables.cx_start) + add_nonlinear_ls_mayer( + self, + J, + nlp.states.cx_start, + nlp.controls.cx_start, + nlp.parameters.cx, + nlp.stochastic_variables.cx_start, + ) else: raise RuntimeError("The objective function is not Lagrange nor Mayer.") @@ -610,7 +629,14 @@ def add_nonlinear_ls_mayer(acados, objectives, x, u, p, s, node=None): nlp = ocp.nlp[0] # Assume 1 phase for j, J in enumerate(ocp.J): J.node = [Node.END] - add_nonlinear_ls_mayer(self, J, nlp.states.cx_start, nlp.controls.cx_start, nlp.parameters.cx, nlp.stochastic_variables.cx_start) + add_nonlinear_ls_mayer( + self, + J, + nlp.states.cx_start, + nlp.controls.cx_start, + nlp.parameters.cx, + nlp.stochastic_variables.cx_start, + ) # Set costs self.acados_ocp.model.cost_y_expr = ( From 377de7b9ac0a9539ed26ff36fc0142550eafc3e8 Mon Sep 17 00:00:00 2001 From: Mac-eve Date: Tue, 18 Jul 2023 16:24:14 +0200 Subject: [PATCH 54/54] made requested changes --- OCP_equation.jpg | Bin 0 -> 88195 bytes OCP_equation.png | Bin 315439 -> 0 bytes README.md | 2 +- .../arm_reaching_muscle_driven.py | 2 +- .../{LeuvenArmModel.py => leuven_arm_model.py} | 0 bioptim/optimization/optimization_vector.py | 2 +- 6 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 OCP_equation.jpg delete mode 100644 OCP_equation.png rename bioptim/examples/stochastic_optimal_control/{LeuvenArmModel.py => leuven_arm_model.py} (100%) diff --git a/OCP_equation.jpg b/OCP_equation.jpg new file mode 100644 index 0000000000000000000000000000000000000000..95b5b4860fec9699fa5893c7241712514b2bd943 GIT binary patch literal 88195 zcmeFY2Ut^0w=lXxLhnV88Uz%OrWEN!RGNr1rK*u$A_OTC1QSK+3IYlWDk>@}Akqbq zNLNwmEg)4zDUv9JErf6f^?kqZeE)gwbMAfq`<(wg_uG)YS7y(wnYCukYBO0MTpx!7 z_M2OoLkI)}T?T*9`UG^#j1b@pK{htfb_jwvAXbDBgai-*{6Po_i1il?LHiMsf5Q$4 zr9X98ASfXKLj9@Z2A&%iz`W7=&l8yu53z%9Lf~`ZHp^eN*`D1-{spsSfp?Ip<6bK( z@O1PF_3;S~^T&s;PjGJW4-XG9(9j4DQ}^)3d-|w*;e#{?9w8b#)puw>Mi@efhZoK# zT-MXaFCf@hZs9puPBy^XSk76;W`|A4ULXGe%hRDgj;9YE@;Z(4()X6bn8+Ft3MKZA^nj8u=*Qpbn-Y3$V3*VovgsiCQ<25P88E2Ke__O=SOl{hI^-=D@!>@NW+Mn*;ym!2ka^ z@DFdtCm6Umk-(RM*5@HTJK!qefxi?YtEIjJ(%WNYgW7P(!1W8>`U@23mA*KX29=?{ zp5?qY2k#-SPYQ5Y?cIyDbFekHI$-w8E98egLPAck2tZI!aCoSL#U5D~S2tPq>0j>P zCWs$0^zaG`F}1Thuz~Zh=P&$!-{}3noIj{XZ3EZe#s4)x$Q!stz&zu~%Hbq+b~1$8=sf6L?H z5$Xp)d?TP-_LP?&z{AG?@Qz^bfM5vXR|T+%m%oQMfH%gj8We=zfUf~q3Dge(@Jj&e zdHxelzkh-~JUsu#@8RM1H~gC}&=L${UqD#M36H2>U;cOAf=)yL-u=3^fjf_XsHFpV ziU1xC;_%iRFb{y|f;|t~0vI^t2si*x_Zw#6@{h1Q3}8^7ManB|?}j@s3g8{y9{a2T zECpcm;1dTA{3-YJ4KUyE*MYRK5CX!j4gq*GfD?Vf%pCvJxgCmk_|q3lm2c=?(?8{} zJVF8VyRXp*+~JM#4gBBzeXRcANAjKaKjaL`xgZFsa4Nv*Ab|M*tR9AQ+!zlS8`9{s z|K5%AUv)ww95%+U0LmSFf-Uv{7|?<|2y9XhC-R1e^Zh3G$Rrn9Ii4Kz)`fZ=Zc;00y)pzxV_n-k^5_4;&J{ zXQMCB7R42E;@3I>ppR1k&-+sR_hdiKA$Pe;?)c%zG)x!DLn_zHv zgib^AP%x+y_IJBIzux*lr$G7I-=)9XszJWL-k$o^0tbBtJp@74&D0?&0oDa zK_5X$z~A5h>fHn2^aA5O0X`e=|MT*{O8-&Q6wrI%PuqyUdX(k=t38_;+dei+Hgh&* zlmyBIWr#We?z_Q96QzgJ|BH@))Mx$7+QmA_+Q&N1I)n{~4gD7$*+AofqTf990sQ?Z zUZA!CoI0pIC}V&fU`C0eBp@}EHt5F`g#kV5fYQBxDBR%6Uo-O0H2qBh^pDy2Q;%~8 zCkv+-=Wb4=e{IRPoloa4dVlfypE>z^te$`K`>zrFul@hyO#tK##%cZcZ2TDkG7(vh zY(q96UnA>~)sQTbjC_WCi+r&G|LNcS*X;WJ-J8R&@!-I`1pHm+FM9u)@eTP1+flgV z>kh_mEa5(ca3IgnUVKPYXn>!8xU4C#4nDG0!CvaBvYI77cBppf0QZdL69If1ih;9iU>XR8y{-p!3wklKUitv zkPIXbDFJ#kpP&m_CvPNA;=Xv2ISQr$ayFf3B^F?pm-<+q%p2SIZz&y4?Tp6 zp)#l%s)HJ!R;V57g!-UiAU&U;S%?bJp;ZI|!H(cX2qVN1Xv9{83PKa1hcH2yAr2rM z5Uz;h2tPzHA_5VEIFCp{WFT@7cMy*drHC3t1L8HJ3o(S4Kzv1fN35_QS$J4PSfp9D zv1qX9v6!-0vm9bM%HqdzlI1kZ1(sBnYbx8d%y{`dG$UW?7by5Rw}yirj)! zL+T;-B5jdwNMB?ql88)3W+Cq)pCD_&Jog~Sk#oqOC^nQZN*1LCB-j#l80CdJi6Wvd zqH<6VQB|mBR1azbMMW`Ld0C}cRagyJtyo=H{a7Pe<5{yjDJ9Niq#9IKoHoLe~!IBhw-Iion!IPY=Ra&~Zj;#}nt zq=dTJ5^L^vz z+z83r< z#4fZ=$V|vv=z>tbP?OMuMN&kHMc#{0HwkUh z-sH52uqk)bi%sLANYQPgR-z|F(?rWe`$bp8q{U3de8iH(o``jeEpL|GynD0H=H$&K zoBKAeh|7wbiQ~l6#jC|XNT4LPOV~?9O5BoYk(iSdku;R_l1!E?lcY$oNNtyLkcyVd zmwGF;BrPLtAsr%pUAjqnPDWH_w@jeS6`6XOuV`Vk2|56M1x-fJ$ZnD~l|3PQO}1H< zx<(7yocecFWvMQ%2cUUe~u0-yGJeRzlys!Kf`9^uF0$RaFAx5E4fwGlztKL@s zt=U`Kwk~f|+~&M3VO#aKFN&KLtrSly7AlS?@hV}IPAc71>Q!b_)>FnQ-&F40&az!+ zyZ`pw?HwvCD!WtyRBoztsj{l-s|KsyRUJ^{Q8QILrB)1qmsX!~g2(jL?i z*0Iq^&}r0J+oiiJbk~zzUv(99kL%vh9ncfev(vk%_e!5te~&&%zfS+B!7hVvgEE5! zLp4L3;bX%uMv6v0M)!=SjOC0yjPDqao5-3RH@R&xj@g3oz}&@5?v~%}z5BuLX;Wp> zK+_`AZ+mv^3Efk71TVMnavV@LX-J%`c`4IfrI9C5hOiQnmn z(<7&4=Y7r@&f_i`E@xcYT_s!tT%WnIyE(Z%a9eUWbHD2T>4?se_#^#C6^{~*zCI># z?8LDbSbnSrw){Bjap&WYk25@MJ??red0Khi@T7X}^~&~|_1^7$#rvy|u}_B2w6C#m zhVK_YW4}zlul^YSEdRNHy#YA^v_Q+iyuf9gEv^8!e!}@gNf1ZS@t~Sup-C881o65l6jC0$QqCVMBpN!gK-mBP5_ zb@9!motLg%T2J*&eV?`~?bcn!c8 zylk%Qi0tue2d+K4u5kVGbw-YVPG9bx+>#qoHX5=rm@zrw(`09^Mbl9b-6D#y-2I)s=rXbPCiXudKvO^uEDQisu9~b+~m^K z+ic(bzQwxbRjYYxQ=4fU`IYgjy4MD;Yu@O+sczrZUiDVzZRI2B!R*VEc-)!W{8u&=BCaR1=Ik%93+@4+uaCx&R0Qk{$sYth zWQ|IV-W^jOD;eK4{$gU^#M?>7$>Axlso9TV9~qx6eCGX}HI1Hr^hNVa-BPJ zKE$G>_4nrwx-efY&EI|SfH;M9bbb8?h}qaPA!zOL`ughK_4T!U5KoLi(97W8G3Z8Z zHV|*zHe2%y^8AD5KRkZNr=aLB8vpePDA&@`-e~h5p6f3mK@OHIwr5C$9K<4sKnfz( zn;|rynH4xR;QFf<1PcW2qcmPg=A&jNH`$QfcFqekX2~QPE$5v zdk=QGlOmeu((iD{?V3-+bk}zb(^A+@^)>VUAlVu27C9JnOj&| z?RPwM*vT2Va$ep(zJC4zfnnhhry>bar_W!Ai%&>QO3uiH9~F&ULDw({Lw-}mf zMEe6z9v ziP(^e+g-mWTSP+Xmq@Uj2ST$UIClQO<$;S=s|j|=>I#kT1?z3@ffkQYOFN7IT|};XqD>F?h`vqw?h}QX>syCV1M5&MiPWHp@p`prjX}T$pL<@8 z3gx=eNEah)MBhw1^?m9II`(-Tva74TrF(Vg&8shQ^nDjBHXpKM9~WatSgh`ZRi>~F z>rg7Wx}z1(NjSX@Ily_egOlwC5*&Jho_JPNK6N73tO~V@yWGi`b@aa`YiCmyyCY>c zx{uV5Hr!4}uiY~`KE{vnBVWXF*F}`vzmap^|CRvl;MF2*ip&0@%v_vdlF#?f+W0fi zSmP~Ul@u~7;hu3@SaCXzDX|VU1U@03K*wYGEATu77v_7#M(5M-;{yB&C^ItK>S>#w zouSi*rN7;IT45GNG13l|!yE3#4h8w&3LKNy#@Za(A`g#UU=C((@XAeZ56#W>1Uj!*LD3xT!apTLTczIRfexa<+cnV zjTRY!&TlsLr8H;v9;TFQMbK)4UqtUNMrUJ><&uEpN!sm1>)E`M0GA1 z!qV@6byNlGG3(%)!JSR1lUVvq&1E;SBG7bSG0R&|8I#kWfE(ypJ>?@EIlr@}X9{6+jMU79i%2$^{ zwl35w1?MNQUzUd!O9pFD@w)^!ImyneY9i(@bG%}hK}0@MLp!-5jiH5S2tJ=|`E;o* z{Si#*?wP31su}*ACvfoTm^uI2d8hf(F`4TnBrr}<;yW_+4T)-nKR3n|T+HlvXggj= z+B7RzHhGv#)2c5w3SHLVKKfI!Qx`l6Wu1sr~7jx`f zhXTfuZ^^(n1+6#7?4pRpdQv@lwp3dQd0*YqyTtKr-|d$2z&&z<=9~2>h@~~)VE&JA zIMNr)&^i!lz32Z>I?9&Nyw7VKKe`0RlOS8l1dkt55YqIN5Dul{B7O<*M>>T4o1VN%)3Fo%=I@fV0J{Y0f0 zo4yl^7=A*u&9i=;VlVs4dxQLZ0>rZd?uWfRWTwEpu0w5O2uIWBXc`O=i-~&j>b|cs zNHUewWLiFg`o&P%^oFY zJ|-kVVs3noB+bzDhzVcY(oBWYkpw$&^mYhi@BhEVWwA3e{jC)1;US^T9_CpAKF1Ri z&#S&|1E~xvMV7OQcggDO(D8K$R@NzDi0qx5ZniEtdrTw;8#~JJTt=dcsW$rI+7u0& zI6+z*tVj{${GmPTLd)&H7M1!&NK;pndG}Z3i2FYKGLPzT)1;lr#a{xfzdld~c<$=6 zMu($Nw`5^V@e68Q7bALN(ZM^~ilTHt;%2EU>$~&p+XZSZzsBzV&qmIufOoD#tUJ2b zp+L;=bPKjjW3Fu?frdHH6dUTm)3B3G$9_s2ygsS;hVsS08z+)S5%cJKHyo920hx>Y zHeTlMt^FOk{u5(U=!<_bmZ34e4*lnx72Dt}_77*d>JJg`cK&mWtTL51+(b`?D_6HM z-y4+7b5gS>mfD(Isddyq;x=l1Zj5T>-ig5^gR7%C#XN-(kvOphhrWx%z(Ry<(BqeA zFCeeu=(6c~W2!T~9p;@NQ*7zc{hk9cijyg<^*wm6p9*_8t%APEW3+VzEQ>|Dbl+wu zJND=-EdHnAJ9fH!9b%7VnDvwVONO7*LxCxXBxsK3W>uv*gcn2#XSP);}zjCH3+k<5>nbNP5tRV9ynKk@BO)}tU%XDB; zW0yz`${0@#@sSuUc!K6-O%fh@t6s!+W7YTuYcxfe?nE;#NoFXMPU>Wg4YwFqJUu!ru&t`5swP!=JjeLWek+NL zq9-*LPO@kld%L4Y-Cc&QqN5c;ns|a#yWcbj3bMIgPlF&$D?JwS4)WikkNG3|!a26F zqwLRR#5Y9$=(V1fTk`R?i(eK~&8FKXgA5A4jPO<)KB@zx9%?~>_S#3$*|Fg&y%LTE|#IccM0Set7 zI(Wna)6n2j&yLGujlt3iTA3nLzwB;(7rseToC1CsDXCuO`PDiE z&D}Ak#W-j|I! zK(qREw=l|sR&&jceG6CzMeES{=mNl;I%YS9k7?9E^Id*7B&MIZ&xnB z%KQxB&p-C8J*ej-_F{#D>U3ygt*7I&`Oj7?AKf;#n-foeC|^-q9+Ba{r|^-`lWz%O z-sje0iNok}aw|V2a=aAAQ8AMP$tFCw!pD0bDqf6H#05p2@=R8?FIGsNhMKmdAFVRN z*XlGOF7Gy}y-V)UU~;6bx&W4VtV1VA6!s~0hVU1LKTXBz0emi);YZ8FdiPiI^L#li zvg~%IB|D+05Qtq|@)EICWQKrZE1Cm?vpt8EVX8A6 zs1}KJ_8JLBXU5SNDV5~JpoN%+ahS8pzn%J7RK6%w$p@1tSMnbdcOQwegfUY%U|bD9iAlaM5I{tCYv{b#?{!wb zvNW#X`gg)ld(O|~b}Wcd>k-^2_r5EcuwmZ_8!cYhYH)%Uo*w@og+ z&(%_P#rZo}FRW2(WTqjrpHv}2qV64ow_c)VPU+cLyXlPHeZUd;F{Qkm%E1?sR_Z%)r7IwgGC#3E@a zTFfa(v)}utchB5CO7~NRBL_v&KA5NJF27!7iP@Y&k624E5s2Zk+^0#fohV7rHmqpv z9ynDSt{ggtd7;qoflS#(?yzQZyRM>QkZaf0p`g6MY9^;7m8+e2Rk|wEr1DJ2V|?X1 zY}+w~l>K$R8rO-7%g6(!)!*8L+Jq1ivgohvb08c(2>3ounB9n7)8>Cr(M%3k>h~F! z7~{#=SyD1q`kU$}@30AD8CUf!JvTd<3mu}FR_8lzoEW~-L~^(#N+l;42~ONJY#{PI zt>|97B-hHTW!HsWQ;M{6eM(a^jKXNJ_!DvsE> zG9~_*Dsu@>?XfZ!Po?Oot7(5$;{Sk$Gcocd*S9d`v4e*p5ea5Y-PXx8iZhdY6RoMu zAiD{jRKF88UfspmMFZCItoBXoiF>qwQB^o$Qca=g^i8<0AlA36t7v-L=!n~s*#|;~ zweyEukC`wJcsG(y$mgd&%RLwN%G!nkg>i)q% zCHsPV2PrHfBEUbpd|wBC%hkU9S1fm9YWFkrfF?Ol#*@W~4P>hA8Hefd<_!L%JmCl& zDIUYu4RqiAriZg!lekwRF{3_}WtJYnDIuNH`VFu!lcNWy$A)8d8bH!4;c2QOJ)shA zIkO6W^%QXl(DJC`zXUjph~G;E~5tR_%@7rVj^KUOM8%YDdlm7=nWx zrv?~e?R2iS44o{EdtYkbjtPA$I{U^}4qM#F>71{wz3bp<74q^Wh_stTwZ;y*H)5y< z(+0y{lFRuM=I5Oc^@KmH4(-X8ClS{o6(j0%~&CS>?V^f8gcVP5p2L|bBUS={`FIi&xb}1-On?;^l7K@*8b-DJLO!C~F|hmqL&%n%zm`t+8;f<$##W>?yW8@9JQ-l?wbuVkIOyeO^s@)#G&H=W z_#>8uJpPr%O?1DHGHJ;TUY=={vBn=pE)N%OlGQ$YdG~Gp z$NoADkmG5v0E`CCh%$*GoaVZA-NcB{H07LHxeldaB#itcFq>ioDlT)k}1a=I&b&DN;Tm#yWhmPRl@s$u1{d3)VC>s189ZS7I`PuUa)Dk-*-`vdEf zLq>{jH(8%tDU%O*wcNA2sNkXA!ftfvzz+`dTA>(W*DNN3w2{eVD{)#5W zRHkVpM|>bIALt9751Ln(w5%p)yl1_tmY=M(I=Ib$`1o5hc3C7go2XY~OVMKTi&Co- zD*LtEV))^$Tl?bfh$kLB_O<8TXU)YCzS<&5@wX?}q449#mE5&lj9*FII#fn_iREOz z$FOOCsUY(Z49%*$!V6ul9=Z}ojJm&_?dSC6iXKa1z}8cz+IQ;E&v?8`C3($VzxtRexAkk4NgBj*|~jW*$!`62(n-qx%&ZlJk?c6igeIYK6J5 z4hdlbOGI$DG-&vwq9t2_U8R%yqd)9|cKvXyIiv4WbNRaOyMik--9imVWDO7FvVjsj zhw&=*qvx)jtxQW^hdA#AX-$^AoIOWNn8;2ndg;EZvJUYhA|qMrZi}J=Dw7)9ZWf1J z)jHGA7DKz$%Od)E;u}xh}=~=gfm;CNE;czFis*YRZ z5w$HvCrh$dKQy0vam`zIHns5nSIXz?u)8zVwvz!-sH|$I@0YsTc^=z$C4{`OlAZO4AK%S?D><5f^5IdEzO&lSM*LCRw%QeU%NTM6YAj| zY>HyW<}iU!jsqnwaEzca!9Txc75!SfjKbIfPo1jb4vDl9(WU96?>WQ$^#BaTyls0y zI{s$^6!+5s-n44T?8H)!*bbLZB{YsDki}yhsb1r0FOQzaaJYX(b3F+PUl1oecL)eR zp6U3!FIcW7qyMFKfMTYUV8ON2JBjJ8vk%u2fX+*!L{9KC#N^w^)B|`vLiXf31dR2C zW0G(*AGsLLoI;$pukX_N>QPk_w>a->h>Lons+juO@TBzX$bbuJ;zN=~XVJ%iXn?(* z>amNY<72R5)uS+~rxkm1M^bGixe1*R5J>8t?2Wi^Qs*O=30{*jq_Csf?3sV0pB@H8 zzYS_64?G8W8elv+SeS2R(AAYk9c{WjdyV`axhs8mOvs_@WFGq4Y$O4*A!}&o{NpDu zZqI6L)38*m#-Iw_vfrgX^X{xxjCE}}QrRepSk1BZ*u`g^Lpy#MD3Zq^#E*q}KiaVM z8jvcVu|#sksq#;`Bo|~>G3x? zvLpmUa!^B(^fRzxRK%(!!>ocjntgkakmm~P%4Ft0Ns|6tk>J=H z-ddBv{(MJD`=dyci7nFs2X~z%g26Y~1J#hm1pqSubVxJXYZsjgAI;P{j=`8i&+Kn% zG-qx1?a>gjCCd!GOm(=RWvY;LLw^%(nISo~N`kBD3^0r+|CQ=imqaeB4X^HTb=haI{c68`2>bR#O#E5Q)0tnp`Y{QsXPA9C7ITKHn;BMXMLH>j z1*z?Z1?}(&KUXr{ zCEMv!nO@@IB1e#~d4Bc&^+qeXnD>`fKp=+Na0O!n$Ec1NSTQ@69EcWk9d;qy8XqN) zTIf~V9eQyRhgv!BpR@8zA1TNVd1&>W@$P!i^F;QK*tt7JuK@<&eaHTU+nJoRft@Z4 z@wJEAuj|!fG`pu*RBZTL9%g`5JmmgxSjsAlZhciy2~sM(v@=$6<@E;t`EJ&wjAPq0 z2FvM`u5;CWF`Tq}ZdT#vlY+M1YO>qWp6YtiM=tLDu2)kpNFKevPFG;I1DSn9s;+Lv z4w_@mrcq}tx^zge+gOF|1){)g-te9<`cZl8sx2j0%_zyUr8`RHlXmWuxM6G1wr+u6sr zGorzIHNn8Tgg_GY5I?MeX(PegEmA#i&Dv5c+*0!=^20fC;&m1ZIZg?|)})U5grEox zDXE7>cI>kW^B;hN`-RyyDg=gUJUa$qd@&bR{E~?pFs`X8TSlDLa`kGF%#HygQ|Y&A zVaD%o&!y6id_GF=e$#0t9CYc>UBSfyh9uBFsP}96Kq9WApN`gyqbb>QyJVDTd6#@? z=i%VSuNvlQ!F18A0N!S5*10D)hRdx!)}_Y{A~QDgf5}OPn0}z?M=ZsC@*bI|UK~uS z8p$`MA%MnDzfbcd$l(SD7kcVc%bH{!Y0c?dPHWwB*f~)g_e$zw$wJ!P(5i8a`dTKF z1$LyLgf$Ax9uT}5C~Ea7_uZNw-_O|e^YfL5lGC^L^w@0qdGG4b@YbY~Pnm6E%B$v} zqsdV*D!sN9q%X!$_iCS3$nR9^`<7=k>ZLptVleYGxF!|zEt%Q)5V}j|V5$LUazn}I zW2&kzl09vQ+}jM=8uQ}v*xu&_(XuB=aYAU=YAH`B&|dOdo!0FmAI!8x1912%_tid& z>k8g+hfTNHHjO1=EAb4GA9SE)W9tJ!m|{j6(wbzFX&G4c1*msE4SIiLhWnNbqnXXapcgn6!6bkjqZK&*FlWyRG9eIbg9$~INhzWvYC9ak9O?3Bv) zY$n%LkY5XcE$%V&)~;f_3sVd+7xU0D?i#Um;zih()ggp1o6;)Whv?=Ew`a;B+J!r$ zx8Sed&(LhRths}IrjL!BN*-*d-(9;`j{ux)aVua5EjMArhzc?OaHLq%ROD1)Ns@Et z%(8)P;_dF%2g|3znox56Xie*A-|DpG{mZPI#mrQeY#GwRKt-#-t3a%NuB96Z-X^}L zERIS8w@ki``@Tz{QEqiy#Bs^)c;hw`7L9{O=?(p@j?>E(~3Ul1;cXf_iJX zt%}5Lq!U1Mm{jQyF`HO3zz7|EnIh#llM=MKE?v;%u=5Q=)?<*Klrw2#i`%U<9*_Pxb{w4yK7&&mG z`MYXWeg;wV=02@j63UsJLy>@h9czW8z!Hl5A)3u{lQL6HntlA>qk^v{Qa#0Ewg&ek ze6QxW`4~BuaCsuPzAY-d>{=DNv?2*;-m=jUJ-nC6SukFbhOYc{p?_4PzP5J`Q}Io8 zz&6vZXYR=@$)i^D`Ib|c3QQ|6p1c>TDK5B48f?Zlc5WPfQ~9|G&~lO3iLEG^7kt1R z7^@&PkuKI7!`9Scx^4GZ0})jPM@Nf-@SW45ImJ+~Btp0UfxmY~w0m?)u8qFhrr6T3 zZT8jd;G9paD_qUw0^Sg7+1gbjNm>VRkn<-sK#a$`xMp&cPrqJB@{D53m|!K2^VsP0 zk(xf4p&si}E8*AfIHiP}n(v$Ma_okfmAIdIz)!ziFG!f3&}}S1kQ#tT=zA}=V=`^7 zZxUzYH2KLH7swRoQ*<}Bu&z~3$Qp~8d3*mU(0SFoTXa5wg<{;0>#1 zvsO?S@tEPzW2E5&ND*t|mmyr+tC%P{R5Z6_JNIG#XOWA?c9hri_(qJDHOQjn@0zXB zR*5lc-6p!kChX>VLEPn^bfz5aGZ~~%!kT5ZIMlCrkWWT`SFOxj#BF}NwHx&Yusr=1 z%sSpdQJJWy500B6@q8Us?0&uFrfjdQRkMTFz0%;FuU;JPeFVj_S2+IwUKHCk2DZ0e znbaW8*gCOx&`}FUx6~_8F9b85UI4kGfaVLg?g*{fpAkWT6zO=`7}c44i3AaiU~VQS z@V8N4dlp}W(UagpojRwL)W?M<3kbHhb$*r$>RSxczj0Y?ed&5QKYmnRyYy92;yAjC zSe_psBi9`qjuvop$GVK}p$}v^r>l0_@|?%DDFk!X?oilt+*BF|gM{??h#3CyJW2wS zo3wh2I6BJOwfMrY(L~}!JvIBh+G4Itv8sa_-jOh`7^`&HOGp}Hwe9Hn;@65>8%k<` z?z=-O$Iq{UF}AOrGqPTdBnZ<>He9I0Tm0Q#*=-WK%_=EYb%IaaXSyHch1LeAi3n6> z8`ou98)r6!ysOGxJLrk%-~zZO?7KSFBY!Q+Wigy|!&^JK@xTl!?$(Sp<%jGtfR zW7mLMn_dI&9c{dep?e%W3Pz5XeH#jKwUzB;ze{T9Ls#SHbyp2x?s3vw`Kmaf+?|@8 z##AGGv#U*rSHIQa5N&MusxrRQR#3=7y6@W^grTMS7NyYVz3Y&(3A(Izah|R1VE?yw zYac~Jnj&Lfl}cVuXL-GIAL7t+mf=Ik{gCIdpO2ea;A1@8R zSsriA4w|%NZl93|zNUlW8wu#&iKB75yU4ri?woO??0YAdcQf($FiYNo7JcVhj)@-g z-7)e03T!Gyg5g7Zu;5r9KhtJUi%ZS*TsdLiYJcZk_!qg6vYjKX=E1uuVmDu+{r^8d z!zwPbX#c~GeZBAhkOLznd}{@ykHaQgNP}r5q_3#HZ`;WFnDKkJSb+{oW!S^}O*UKu z;{_AmfNnyHb$_^q_zYT zA6ScBHrQ5vhPV`Iiq}LlZRJsa-b!FR`BWVVcw!Bw7-p*~E-JkHl!<@4O2ZdK09jv>fzMH7>{O*QraK&8TRScZ@ylUocd@udE5CK9HT zq#<%MmM7-ust>}P1W zDeXMii0`tgTZej%^sPM|_^u4726@!jeWV6&(s+r)hw7%>F(Kx=QAyZuf?ssz^w>GM z*s10&LhKA>;(%yz(Q}uh?%WruC$a`kcnqbw1hvh{q_Z=`42J1eIB5slAvaR$4)}@Q z@jA814tTG+k*aF1cF)}w>6O6NA19U04sSl&;G}2AKON2F)u^l@4M);vUJ!cUp;N;N z84hfptaM01*>#7{WYSh)clm#OUX(KwsCPm4jDDonHb=XgkISFq_qFp|(ynlBo9FCFiqi zpJYqN-<-%DyCCl>IN~~N`sv-S2Rh*w)!J(xv3x)gMnW`2&d~nl=MvbaX@;l;{Vp&J z7lAn*gSS`RFCjL`h|=ga)Iz(?#iQH}Ij52)nkMsjv0@de*01sM@#1DTCuf8XKCqJE zjJekH*?;F{{(k=C>ZDa7sUg}(n2NQ*R}uK>80x(|!MbCP{CM4Fw5S>V4Bz`B-ceaj z`|)>q_AOL^8gGx;XgE-#S$!R}UEN6Q!wMe-(Y92|HlV)!1gs`u@Ba=2p6Muc=y zln{L1$U`k@K6wos+l|#CzGRxL#e=z8{a{T`>NO|R3MLB@gX_1(c+$8v-~5R&gbOAT;El( z1nrwrXEKJ}an}>BsxB0$I*7aPbT_ckp8mKmdj;g9WA~66l$e`I4XPx+uQ6K#fPct| zY0eXUTRYZ*PIQj`ST~>(IWqT1wdRW3?(cf%q`rA}s4(dkI@iH6+-R@7k!Y~8k#7!- zVLxx*&#<11ew~^>g%-Nz+vjZk!P6@R9HdIYP0rz zo;XM1O9Z1743TXrvk^@_vH&aPovS=9`ooU)eU_?{{#i0W=Y>;*%B@pZ>J#%G(o5zn zX0fjP%2Vd1_1<>dJ{UT?TmOtH zsjiviK(4T8;&q>joLh&c@?ux`DkCPIFNnd0ZqyebUwlqi;>b$zm8$g7M&uSv_lnp< zP0Azr>HTMwzl?5$*{SEp>7|plh&*0!wt;#>qN?z*V!UX-nn~MStNXm!#Z$SSR*@B% z2X<_JuBH37dEh&+U~KWQH5Oh5T7&{Zt)Qtv&OQ@)#$E%R`%T}ya-tp#RQfkXvM$Wk zh8UH?igVIn-sJ#cx0vt8%Cgfi<2k3_7mV|B61XSxlHX0YU{Y$)iBFc!c-c`K;?(YU z#~9vef8cKBV>}{Qp)00aZfR7LCs@_%w#rTC2WZX!{$R=D8EEbp{Hh4E?G&0V=FE68 zsWtMJGF796UwSrj<>=>gGIv;CR3sJppE@O!J0$NO5iYu{bbncB*v0%Tx{K6QLJ1qs zYbgPGLIC5pkU)9WTX&dRYa@Y{axudjv=!KtxEp`CXg<+ts+xxK`5+hRUv_u*{j->M zkoa!Yk5L4s!IjuDYSbHBoRvQ=S;9YDm+(>7kg-<~iD}9GQu@uJlC*CO=(fSgrgi9P zTLU;m!qM?$jL^|quTEo~PBq!aFzw5?EUB}e3_1}1ypAyS^Z2<_MNa)Q`!t5Fx4FKB+W)*^qj4zQ4 zLH3)(0J#==Sv8oHdIkt&Vw;#Pr)0Qk4+Hp^kX67XTmH!7nY~?OqHAkiw!S|6lLT?XFlJBuXw=8r>P|J{ z07*MdBuKhqr`cJBoB7VC1n>A6;>L)TKdn{;iGaTnby~EsW^(nw{6w+8i9Gya@|^^R z^DBjPp}DQegq?ar_{?2nVRPI)>!ciD8cETS+Y4>fHyySQU56f+7}CgbL~$4mesVHZ zI2isxxM}6^Xm!zyF1w)H;2=1mb#S_@O+pLpu^auWgCUIAMgws@W)(*mJ7~7cfD}6) zu9A=@Y4$36Zz9VXtFkNUGkmyJ?i_;JU9BSq<|&unf83rrl8Jo{vg=*csb-RhwgyE5 zvW+8Uag z+{A+@c?~jg3r=v_V^V{>iI98Dq5je-*>Jh zj|y@IA278l8QKpqB`VKspJH+W1sbc_er&zbyfD>FWzV0HplxOwr>}V zp>N(ibLJ#=FJljoIZx&YsZ4{hX{4mJ4`jp2Z)GsmWzszXM| zgG1l6=gn2D2dnDnI}f%VMu}zZxF~+qWWz|DCpCzGZXf4S?Mg%ld+B5F>nYp#658I0 zu@voj+Xf7B@oS0L%YGSj`7`V1xz2qLs&#cG?$6Qo1S{eQ6W*qqw}={_MR)SgnPD0< zhU6Q_Ad@+Mm3|tesvBQY{a$`hY0h>t68)iBpIu+zH{igXEnLNHQ7EfZwOf59!m3PE1uHhUG{hUl*wyMZ%wlXom zGrP!7tHTCc*$+1`r*J>d&@c>PdHT<_%jEH=WD(N%1JcvfH0r=4-%VO(L&?M}*wloV z-Jf@=8|gnjNQucj8rA7KD*4GFf94 zYlt6670dA$FaE*VNsD=l$>GHL`8u%)m9=AIZ`&41ntctqeb{4{b@4n({H!A^;4Hvr z5|j71RpkN&O`n5v0}I!3pD<3@`_j%mt#GD%YKoJ8Y7I^)vZ$PBIW_R)XQwbfazJ3j2jc+t?McBqNJSHO1y1qi(~h zJ6kr*Es@GXPCDiIPRUpVPj@`JAr3l_>wL?>;U!tu(OTP$Otd#`rVQ?xBRU zmo7G|i+!_&cNNe-0OnmFOiwPfflVy%gN3~gWEv)!$T{MApPablnz3pZH~KjmmuvXK z%u4sw+a#T$?^TA_v4n_%U-WRQRuH-T~!6pLgZ4Wr=Cc{c2zL>&`*wVNs zJ6f#fiqom}!Eh6(8ZTALy`doVtW z8GPQBbD7)cA`?dUZS;;UfWlOA&efI-F$3E%+6VaA}oFMZ=9?>TEmp|p^ zo1+5jr`6Klo%0{4)t)>M=kF7zpVGLs?50oZSj0C6=yd*OCMk}m5us%Rr_ipysa2N8 z3@#bHMjo%{ zW%mB)*BDmZM53&GNuNnAtc%}SA&^-Uw0t>>Fk-OV*S363IDFQ@>4w1j!3oS96XP0mf-?R1oamxyu++WX(aru3+t7{BIn+2b z>l|->0M2HubDNCH_&Xq_Cf7on8M6b9jQjUt{}!HfG_Ja$|XYw^vX)e=QDvt zEoV-j^x$8;IL4d-v)N+T1dcet<9N!n@z6bdXECfdcIah93q|j6!?uIc6G{J+HmrYU zeof_QGx}TB`#T8AUY$?B{e`mE=YQhgQ}*t&MR+b`+9)AGMGb!R2tNQ?W+X*QU+@*S zRTO4;Re6Kn*jl0W5DKNKm!K}xH}!M$^Xb{W1)-t{oCU?@6l!r2OkF2GU2KsX6cWpCCks- z?kNVp{-9NGu3(jqg<%9cFXqh>CZu`7vW%5Bvb4^Zp(qP_Pc0%*F)jCEqed;kJ@-bk zZSlQ3<3)`PyT#Hvw{Cpe95n(S_ztla0&FN&D}%fQ_VT8b;U?uk8Yv;8w!57)u`;td z^1kFrw`p32Sy$t8Ps?CdiF!ogkHUD}%omp)>369oJI+1Xd0h4&&|Wm#$qzHZM0RB0 zBzgVF>i%|JUD;LL@Y&j&@uwTE`c~#sMG(imJ{xu!-X3EiS4p1^@I)>ZPl69>0iJ}8 z0})S+(SCz$2MhaMVHVPNS~QCq2QHzO%9c-u1>)PiRfJmHKYtY);YNHAM9mUJz!|&= zt0L6cG+YDM=IJdQ$v!@??Dn2Fp+^rmI$AIM!_w5d-b(d*8vhn6$V?YpKZiLI=XIb! z@}#9Y=yP@UCj7~F?+h1t;vljW;KFQpLPQ3c<&nS&;kCdsZ2O33povIiIJZxd;bW%3 za;4mRxY8S?_`;%dZK&#?jZULI)kYqrecKKzp}F^~t=z(605f`l)Fo%{I=I8+5? z)tbc2!gqoJuO0fbfuhJV~1qDUaydVm$II;g#` z;y_e-GT-WzzY!_Qa?r zMtqahn+V*LN7U_+2#!oHPv{pr3Je7feL-o;n3Xqnp;-*yPZU@AlkXTDTpW01a$%jC zgnCLLlz()$*c~mjypf<*o<%r%Mo^- z?Gx?5NJObUZ7!ojh=3}y*}ywirdJ1bN8Z_v4!qAik~q4AdidmF0cD(b0uAz;jZo_s zR#guprhA>*K53>J;X5?cZEp6GvC65_KN4p?B$k7GaAVJaf7E%puy9n!+pkDahi2IH z!)o2FC|I4)nrGjxB0U@ubDX!tW)1XfmR?a*^9a($#bZl+l4N>z|4=w#ZF_=1C-a1|4e(Sn z;}UrZ?6XaR_fxotmbvg5wAl2GPsqTRp3+D1lnQ?A$y1&EjQlY~B4OAFs8s?@14TuK zBPt2n#xY~4b)XTe+T>KdhC@-;K-|WU<)|dDN%vlgGToblXP1TXJ`7ra$8hua-xYuN z;vMw}z8%f5gW#RT97$<9u7mu$7HuAEt^!CpkxY|Go1C|}q-#HU3Zqd6p3j~5xIKsA z8n~v9aW|%5F1PrkM;EBLiuv;K?#*zE%|$$TLzh8Cit;9#u1t=$>98-`yi*HOv%t<2 zYrL!9Vg5c|XWK<&4Ru4?csf+Kd5ol~t9QsK#q))nc)j?FWr}T{gHLw;pPerL7Q%!scq=i7}8WD2XuaxD>gLCwX6bifPR-?ZrN${Nb#Y z{%R{g)@XzCWq_DKSzA(IsH}?}%8QZ5zFknTcaPaP}IZABy}wvHU`k zujNb(f0}#__{CZq5HrEWNf3>HhpymgE#)BE797x>c-0yxN8_bab_XT)@|NUm#T#+A zZ60Z~ENd^3VXbnJE zGz$p_U32bG;Hge|z#)_N%q=fUw>AwG*3>rW7P(rF9NafzIHTGtFhY5KR$Ch@-zc3W3A>uvuR~;BpVX(H0AuJ9=Adc+yE^@V27a>s*aXXZt z!jT!~sd~9bgv_tIG_jGAE`jUkA3d|WE~bIfawQE57~GDG>AP@TkX3|90PE#6CYi`M zikjTD{uM+3K>f4wRHGw1*w>8*_T12( znpwY9>h(4p@48dtTz6T=KeVzUJ^QTS4`a3?fVH7%RcMBVW85{;QZQQ{{~`NYe>-)v zhfOK=T1ZNGWMR!kyNl^5Dg9eK?ZTdVwZ9&Fe@gwu2Hns1HYKcq9)kdlTf{lR_TjZ5 z!4L%@Ksos-)@v{0SZ>)o>+1YKOMR79-3-lIr&l0D+fG8qHZ@y)mDICBfmo(sSSz7c z*Qf)6fCA}BOhEEA3wq5v)i)b|Fh?$A+zFR{4cVOj_)<)3qFDs8s-Lv|Ms+Jx9uhC(<~JnaG~CA^b#c4OB6M z|0v;DHP$hv`hHeMvdmR0Duz(2LL~3lqE8D(>o?<15OznFCG&;@_zrJr+up}nN5gI$VtI>{@_Uv3Oa0zkHjLF~g>PNzH!L_o^^*l2&6gTzu~0bCqv>YTIbOKQP@m&Nh7- zQ5vku<7gUSFjP}HQj;x;pVmzRyyRbw7>S>o5bJ;9HQ&3p1o0X+b8PZ=YQzs zJ*Jdg2=N=BMQThEQIhd|wzb^BsIW0zQ+pYxw`ftGf?r$YgSPS)u87YRFThG3M&1t)2dA#{hWe{1OV+EbJZOJ|qCi zI7*r%@PvQ2H56eII}mE!`;)LC>JY=Y`yeGD)m#DYbtksVH#jwn8F+HbyLj3M-uTu@ z_g|b*;NSIrK;VGf5k3YHHcen9HNc>eB=8AH6O7D!4IcpjW6P@Qj4quAdZA?-@YLOB zwpGe^JMwMdc)cWjbR6$?fe~y)&H)$${;KoU$V?rx|5h{q+_d&^XlFETXP}~``&{_? z!!ZlkiTrbL&;YDV4x8ipX)xJi| z=r($~M(qVGU{F^ZW0|E6SJ+2tELI;@f7P6CJ#DvK?*A(1%l9*h)_#<8EpG}C zEeP1i-+|06BZpup;4pebxAoQP%-@ySKCPU8X21On?D1Te#yWxTkEew~hedlPZ(h5? zjp1zgU2(+^%jIhi;{~y59<`u|Qj1P#;C^)a(JpZ9%WYNT3Jdjt#~;--{Vexr(Df9~ z^f>YVB7l7liV3ZHXj&zeaSSuD&;@=_CsxkDHUI_IiAN8c+6A)@*+Eh3tOrl#owDkr zaxvn%1=b@ON>&kW?n5}4)S8;)=c`;D{2NSFb{l$}z`DZdUhHHXqC}XYXRd43$6p_l znx=a6sX2zBKmAo-Y`-b zT-^f+NH4ga*2gL-2Az@nl}wd-uiG{e;~1r+iGW1^&)jr7qndcPt^4MsCCGp25Y_%LYmv`tYEz#OK~kp{|pkxR0! zS}FEJT6^#Gh#k_*r_VHXW$a`f7yKD)h2M{9GcR`MK!AjQUypH z--gsr`dzr?Wv8o*p^w(jpZPT;+avZZ{mL6p&y4wr=17pcF*V(t5a`FXK`GSQvBZ_8 zQ?ro#TsCiK(@5=Bda{4T@TyX7s=i}JdI_eYX4A2OxE(fcH}T=?jt7uhAb6i6Peg-> z<_RycjbQ#$aCiv@KGIK@@8F_ZRdnIZr*i}I_4zW4pFJ8~g^}KY1~mrrn}vvry{c85 z@`KY7Hxbli?O&(3S-d^-NM$IP6l1Oh_L&23U|J0xVvLKQ$59NA0v?lhi5DgCoRIXf zS1Ii|wYBAs0(G*tur({Iwv>j3(=0^vXt zDZ7QdHG(*cS>k8z>ZR4k@YEKjw=y>MC+H0wWm1z=t>ObPuFUO;Q$~4rrLA{JL|*PQ z%}6TJZ{HTWflC;`ywB!Htg(jR&rD}l61N2CBn-@E8u?!KH5qtA9yR%MJ)m@NHF|u_`0O8re%E zrWUIimW?dH59Z4an~F1wXPOK0x4`u?_6yGS$-3wEwRc13IGsjmg>rh^Bl13M-c|ms zRE?Jl#9e<2eUemRHp6hHc*%(2+=;AS>2la_gb{_?4>x=WE0u3S1&79oTEho4Zr@?r zng@J36Sn=C(L&8}!5?6^2;5@&FDbA$bL>HO6TO=^&X`wxVJ=_UFhcexBQ1Lx}b;Y#1<&O%kzKM~P9*BY{hmT^W&$Zu3IC^47WLE46o+cyi>#v2od?-JCM^D~$}qx8`KN@3@=bS@23g z*ln{ZiXlkj5mmBh2!h|TayBQOyRUh`eP2g_CvYWzQ9218uf7`eBBOtY5d6Ze6m3Z z9dzQLiY|K}M*xmw>u>}Z(BfxC{x~J#N~@Pj72`{$679_g*Ta>+s;X`^2ih7OfqUP) z>(0PZe#6Iq^Q$njztb{ravT7c5hvt9>8#4Xv+|Q`L|XUN2c_K-S+h1HWrPPl&khQE zG)eQhTB05(L?nqUVS)w@B9n*=8zLo~b?-HU1&|H`Yux6axl;#bajjT;taj@4p7ft& zrHE6P>IXSC#nZBq?|g++Unxv$DCM2B$=FH0(D(ZR-q|e8%;1vI40qI|<|I#eh=w(D zwBzQQOGZ2%a^@CruIQX}*Gl4878~^8W|VhXQ~V?{6u+O=ICpvLy#Q}{wsy3}D1NmU;!FYxp$@TF~b5NCtz8Qf8B0r^U zqadOXGr!w&DT$p z`8ZzSZF?g`c_LTX2c!6zf{VrM%@L^!ED(>6_`7LHCc~XXg5~} z)f1=T+SiBH_p2pe=f99B8T_E|$KjN?c>QQQ(l<&npY|+ra)I^c18A&IkeuMz8;^sg zwMX6P;{2`oVjqG(zZ#CRqB|VE|8vP;YKPrcg(nK(l&jX|E&3bW7w32KGv#?g17H=f z;A-}s0Q3FaO6bC`G9x5KZFai6c^8~w^vov4qE=zAIkGy;U*$~BUiI(ekIq)cr*BWQ z<~ICQ2YIX8*Eo(L{gyw#BI@P&Jo}T+pKA5oa88ll)v-*1AC9fnBi4MPr^GV$v(B7!9K4C{^LHOW&wwZv zDb^4bvvds;+pOEF@s^msbq9=jx+B#4&7{V1cI7Qv(@Qff7nKU-0i=%t%?!i(U3b*00+oZp4H+bCG zBZg^|IW9<-=NypciEJ9GG*I7bqn)TzH()R;f^RJXlzCYd~8J)-wy3)9BE4vD8DNrs=I0v;JB!63PHiTyMXV5(7 z4-oA>_((cX&uSE?*0=ezK^ziklCqQk#}LZ`U|9l56JNXCvXh&Q@dNp0aCfoSoUS*v z04CWEgtD;*V)k4Xee-EZx8U9rp;VR8bB!JkeMM%`-pC2V+3;IDea=a44WL+S=gEDg z6FZgI!J0!y7(WL+=kU@Dr`W;r)W@zL`?le8HMUc-q~8|p0yL%r=UKz6eqI*2KDile+<9-1Rj4J9q(=;$W}>=4by2&UsGx(YAy-fW@H&HgJWZy%X8Y{S z$CT!>KG+ThI}xyz9{T&<$gYb6n$}rf8@dY9wZb3e0~fJ_@Z-)Vx?`Q_WRtkM%)p|E zYk_({$s!Tjha#P=2XvOt+fFVr2Ns4cpd|Wcs9*)IaU$*>L&QN3-*w9K54h6vVFm;EDpI^FZk@ zUmtwDdXS5eTG6s_Y3F+I=so#(P3FDMvZv_+AKY9I1}~exUG@^yw!mdFU-5c{ILRV<@X9FJ*k1=4R@W^!u2h#h{(9VCd9lX{Y+tt z0ZD)cxE`IxGvf_Xz$S_Tl1{I$j`3uj+m_BxkDB?kH!D@tN!}=RzJAd&Oxf+~^#^6@ zS(wU#WZl+|=q5g(u6&*RZ3lY?L?d@WoCluNHZ~5{72zBnaG$kWTWsb@Dc(gg(zW6i zqnuUBN0k!tb#j*HXwr-C+jrf4Z=in=xt{?4k+2j#LxOd0kU7%rbf8w8hok}4_ny-G z%_|&qQp)XsKG9<;8Px7hcc_*KGKYE>8Ov zo$BVPyMf&r5eROof|HJ&Da}vF-B#BEg=H#QA1L()Vu-_ zJ`O;UMbAWCgBRG>!5{09AU`UsNo@I(?{*G3o>o0zgiyvTcu9;z?G9a1JN&9XBGmJM z<4EvQ`6~9)t2Ft%P`EgG>)9)>*TnE+;01PbJegR!Tqy|yLk>)I9OS0NUBX5nL;2F9tX#D{z#@KUi0@Tg}h(vmQc-7aaR7b-v#*i#*GDXDRnhKk6cL@8&(2 zd@s%ymC6QE(?=mJISs=&<#?M~k+5XXxcqhIefo^M@~IB82**aZ_NQfs7jn=jAhblU zudiiq{W++1@)#lDjE~qr#nnv-X}m#Zm5|u+CYKz6KEV?K^D6n1NcllWFWq7e zxeTuAI(t;qFp%wi$iuF2qy&y^v7-j%N&jw3y}}Z&BOxdky$;D%u?xKl=YPHbKExC4 zX7xbTtB8rM7GI3hzXtLQewa3K8kym#;|pnq2a%c7iZPCK_6#~1G*_+}b7bUM8n781 z$n0&7lBC^mwi;IIP_+6Q2hEr;x0K0@zNLi6uWpc?dP)q&nYNeLw08Fc=J z=E%kHM7-IaU^YghH5idaPw+pwkaFw@dnDR9-F=9 zxb3}zG3h8>#$QdokldM5QR%!n%t=fxQsGy%vP=C7Eoq1RU= zBEs9UrX@!-2TW~H$$GvcdtRS&l(rOPSv5b@UD3^0c;A>tpX?2AL+Kmf*TEL~0S3ba zEW$?s14fLKLsoS!E|o=TGWy%op9MB+j2R(hsSEnp`t^Ia8aDR!R1GZ$XLJbfxQo8; z7kKLNa}KqJSba5<2_1xyGgJJtU3s)6t}vna0(beX zu9Gg^Hv2;E-H_v3Z{l5`R#7tTzBzb+=*zr*ye3nA2~je+04d;65&0Np&WYg{ML)_O zzkcvJLdW~gt|U`}xvRz03)OwV)@OUSgWl-zYp{@E!;R%Rb4ub(>S!jx*}}Ik4ZU&0Tg=5n(&h9lSyz zsB8?A`OvgXx9|>b&}7dDUI!+fVwOITztH=%#o4~X8mQr9^ey|aUiL?AS>cHqu}=aL zZ^BY3dmq%gqj>{Na%Gs3m1?nNIJ$FklkUY}BQ{Pb(EC%?(6I)O*QL`MwOq{YGYluPvt2^SoX6Os>QCS;Iq0;eKZ+vik0wK_m6P*zl~d}M#l%d6 z_f~XIZzgL)v|0A#0R*gy>+V^3a7L+};<3wxrl2{xsCN5?ebucMFR)()ECyG(NS?4H z+higlYronnT%3t)oBBiJiE`bJ(c*8x(*|aV1&HDK|Dndie<}n0|F74ScfcOvEzURo ze^?m(tEB5M6swL4u2+7@$>O#K|5zvpBRB!)i*JGFuZc5WHVoA|?E1DeWfWgj+=sg! z)L$9?%W(UR(wEAG+p-s9z%rWVCX>BIQ~l3y@0*JH6$J6rf_Xcb8lOj&E6e9?b|k(U z3A0-!DT}6lLGQ64e-X{cE(0quQWqKC^_3&-PDd_5K&}N@8@^aw9x$y4&j1iqcL#oR zBUAM#MTLYlv>t0Pe-<2b?2gB;T>_P*2K=gVDuH3#yC6w^_$S|F0t>{B=v=7PgD3ax zPrl0TZX8I9XpU`-T-?!-X6=P*m=r>a(d)}YM_#5an;BcxCpgx|3r*AaWG~4FzdEwx zd)go%x>%SCG5q84+hCL}97!v+{mE6b7+eYsR&Cq%>*}b}2^~2`x!nPuR9S1geX>J; zt%(1>Vtw@wyQhDc*!}Mu`~Jn(?H~3-zbza7#eV4jNrSq7-spd?)-(U`gZ#herTH%# z{r`?V!r!#B|KS1ouQ}L%VJ!Z6qyN1~2K`rzUyXhRGJHTeq=+{R)%PcpeK8Y+b_5*~ z;35ZA)2f(PN!5mL_jibe*wbf|B^k*-*8=iuetw2 zH=6$jf8T$JN&oX`GZ2sd7GkrL^mUde8VJfD8gM6jPm~3$!QRY!oAW+t#xaRpgG!NZ zuj83B#U!UF5%#vm5^na-G-_T{Iz)W`xUFZG&JZa$p3o9o7rw$G z!qRLD{4iP?$kdzfA2c;A4piCM4ERBDM)sw(8P}h!D$4}UXR)f<1u9$W%Bz!nQ_qaY zsPaLWP{rA1iOhjf;AI0@{@`tFg`vi-KToxn!zUQoKA;-v5cyx&DKJB}ty0Daj) z4>!B;#Msr`F`zMOkjP^z23QA-FHuV_Xe95JKf2UZR4+XB4+~0w(B(1QXIp* z9T26+zK*iIL9ztT$dlv4yxlg`ny)pqCs#C}c<57YUG>AdT(Qe?*HaIwYKtd`9egXo z1F)5|NLbTs%ye!bfC_huStgOn-^_Fha<^{RR zu4c?ixYTBr_siXai+^oPrgkJs$zR#nu~VJzhMfiJGlC~PJJS#Up~aEwZIOrS!1Uj;X5bp&T z;VCo7c0{y%-MTWZqV_=nZ)kYcJ;gmGrC`wdZTg!>e!hWc)NYL$Gx}kzevXViPlQBA z!YDI9_m(2h%6EwKcS8uCbO291q0?=uImQqBY$4}HEjhO+D11$#{M@ilKC5dqtX|(e zuUygi?gLxF1vFL{FB>dw)JuVxi<^>l4qY^1#o7Jm7m zTb5xd8tNXOaP>+I3&D{ZV*!5)j&vbw8w0i2I>WwxW@OKlrmkhzwR=^ml;R|kkE@Y= zk2-rWBv-$~C8NSdiobRfgeEfFQ|`j6V1In)Mw5M0{Zi&k^s0?J8cTN@WWLE>xEOur zTW_j(rr_hoKlviYSh4^&MwSIFGzyB90khfOfxvSD8V~QVr`_;2-Ib4q2bkv%xU7@| zZN|nVUcXQAoW!xz5K7nc8J6isclXkx&lfES3{W!HVjl;sZHNXYjd2_okF54zOk(T!>O&_MakP^4mL2;${YGURzUG+Sen!6P8X|?WjMldTHC6adD+X8@L@O zFr8F@pyG#GFOz-I@Gf!-A|AbgW zwYGNKNl8iOMp@o{DwzEHyb)=9 z2eAU#NuuOBW(d`ygd(($zy6T(*|IIHWN5MBq-|Nd8r5NA#j>!>hBe*I#x?avc;dcQ+xb3zReowRNyX3@3|mxUen?Y zAMxXF*WKo8+%j|kRR}1OCq1FKOd2Nh9lr@}N615+OXyQS^zrlN3IYyi6 zIa>Kf_n%yu{5EPVHCbDpf1w~9SR1)Kd6^w08r^r`4r1vo8G)wJ9LE=2xlcg=)b*j0 z+X9u2f=09nEy^3Hq-yV$!B{z^6MPgn755LPOJg$ z9r8TU#u*%}5#C8innuBmjOG?nz1CMs2(TB{f zpSGUP(ef~`_2bnVd7_Su?P<)DcaA@hV*f_HwxRxRNSce^$+X)C;!j$r+}*$ce!K0g z=|NyO230r$o0s<^!H)oJ>TzO}gHI3??oSH*ZuGQRq(mbFUDL55HLqxp7=_>**?|<)!A^Q$5;kjGDjW=X`z>b8KC0GjMDEIa0xQLwACos zbg$iBw|lSBmM1ea0FsF?Ew+#JNsu+fBzEE8y^T&ab=(wmP#?0pS9n}t@}VX7?nh>qb}Z?>8EJXSK1Mh zQL3Y>#QpvZD5*X-&er`x_{9h3>hDi_5b~vU^j~>h?5&+#zQ)J92+_U}fA?}a9APb+ zMXTZn3=3+`c7Pu+{av!#rWHnX6Xi`j<7%*)CC}V_k<`aMo0<-v?OIbkv!jrY?Y{^P zfz2Gy*V*4J&+8e5Hkq4888S#6M0u>+Ne7?^f=DS-8*Z|Bj?K1fUjHKQb`Ym4bM)PI zxgqNl8#DTLgyX(i@(>$Glsvev0eg|U!7C(VP`#nyJ4VxV-ee@!;B08GZdJ_UCa3@? zO{-8Dhf$OiI&l#P=KCN#00Nr~JVy6C)oH$s;Zbk0)@p|7kk?!}Q8Or~eI2ez(o{3h z4h+BKp~@){ZQXrPc0igfOrr7Ar=Lwr0)WJH)c)sS(i?AB)HJ&1C4dG_EyoON*f{oS zvb%ysTH*bBc=mtc4)-6@&%eR}H~m}f`ho!~;N}CqenX&>!B>pcUyVh6qX7RqU*ext zY5yLuIR6_O45Wo-oIp>s^MvmKER5m88c_f`PfnF|i*kp>H7NEk0kn~&mwS5bC{Ick`rMqf}8nzpGKGTM~YetPI@eYHW|gs%Df9~o|EK1yf} zH3Q~i^acDlu@=yZOKG^tT%JgES%lmH$JoKXXHlB47Gt7(rN-0HiRf)oS5`7FX{kH) z$x-IAb^0MSSGA;j!`e>@kRL=19%o(V<5$nT$+sM+7Mi86?rTsX_F}()O03H2uXM0G z;<$-CJ+Ltkqt7B0@o$j=rrv_l;53!oOH@}(Wj@ded0f?)Om|nB(7pH7{(784`9NVl z-_AF##~eA5*(@=*1bo~H?oEz1dnf3>h5}oHpV#}W*T1YeX3!n>_MyrZeJd-lMRpD~ z+ds*rnKtehD!6qJ`5v)klFEjlRw`ADx5Z}(zm1z8Wn8>ql2P0*iq|UIE7^-_s`#VMm5$^RM5t#3}V$ z{3o@n7xQs4wGjF*oDv@%6gG5cbu=KO$sFF?he9ewR;r?9=V?y{^dB7@jbbEedC{JXH+gS@uCVjS6y3bKRh; z>(q`F1-FC2F9gR6ch9ZwCGhjUi)$Z^y8_(|mr4ZD1TM zsL<_k{t4+b)d@`VR^F&0I1H8%@UErq&PgPE@N9F+NrHtdF0(^e!0l`$uiYgJ4UR7V z>f4Qxv>M+S;maO>@|^(XL!J^ypjN3$QP#tFWnei~jf+#nEm9TX_71nasfJ3IawA<$ zU6cM}&T28Yo_k0Lt)vf8y1?euSlt>TIuGEAB@Zv^cKixWddp^it85F4@LdK=xrHw zvv_?!@o|j92OTG^mv?{iSqZ0)vokSo=81PC0K!nzlrvA9?jX)oWYB}hC z*S8}~`&I4K$&V^Gt*hqVK5yE2+~iyX8P@9{GF-?)!1b4dE8|gsE*vn$KGiO#cr|y1 zJ*7=6drH!*o?YM`Sr*+93`Lge)?5qA)$R$qf(umoRoShsar@Xot}_VVzG$GJdme}h zsD-x;H`lYxOJ-}xaOU%E!9SpSEnRP|lJ^f}iRRPy3lQ%i_>bF{BOG~Ks<|mmktKX} zZiJg5P3VyCH`*^_I`kzByB4WdX}{Dc)Xi^oSnc91&rl$74hnvdECS- zot1lozHhNh^M=yN*VQkbuI@Ya7h%iI`=-LvV#ikPXgEa}LwAl2g%XKpi0%2=50i7X`NL*_Vz7C((Zg#&x@&v ziIub-(vfp?+ebeg(DT zq=oG&pE@V&2TZ~_l0!TZEE^o{t={G+@EzbP&Kok;=;~m+vjI3M7JUZrok%|;qIUAO zKhW?l4Xj%a8>ZZrlkBP+t(crry?;-ku0kXiWd0mUEKdZSmjaKtRkesof7a2lC~dYy z5LwD}M`Tfy=OA8n9yg;j$FV7yZZGi)qJ({}y|)PYUw@O5=yyuBuu57@Hk}V$45{FU zhypyNs4xa{ab#B9*Bu<*9@pOS5CdxU`H`p{4DPe0VT}yi^uqeIor&%5-jsh*mAjI> z7FZllF*NIa551KV-Kl%B9R~ zBJw108(~*Xwhhba&RS5tyu7?2etn&F#wne-EvS;zPXkV*NRZdgu5e^?S&odA7V-qU zE5|r4OdQd5F(T`GcSnENmh|WC$~CMR|E%{)Nm;gH&Aymdq3U;9lwTAe8*AT1{8hDb zqDhS@_%EuJM@NHIU)N;(t!ia?a&P=`>~}|=`1(k*dJvIeOO4H<${IaossQmLI$FH7 z{DGHW^H3;SGRQ3?SLd?bUqq)8n~Gl<9r064pXi zgtLM_`Pq_=3`dqN!@mts+-~GQAu}pW6&S`xn98GsO-=7eMRS7|Pp0M#Jf7e9i(sX; z!o}sNt~0xC+k7MBA@W$kb6eQ6H=KbvTqL6k%gwr!r(8zfM<*)C2$gv%at_wk8!#e!lsN^tGDB10V4m zZ=76BA%u?I?`CTF+K6k;TrEHB?{T~$sy*3~_qPWsx<6DbDUGlq#H zQGe7V*yqlC?O^9ww_A(`U%&ySieL2CLjoD@)2>q<_NqDz$6)=P8V=7aZ$ieH8bOW{ z2(Ftf!HalBU^+21;lCZi<3~bjpe>XsIOk8kLqj-HlU7;3x3~1M`45v0dc z%OviK=|rlU@JM7@G`ijq+=StszbOE%P>o~vn;B@U($uN;hA+jzAz2kcnSss@8!_to zaj9aJi$4wrm3-C7m30;|Rb!>Y;QqAH8`R?%&H`-)gsHgq%f{AhY z)f&yY&jLjyVku_PbBw81sx;%f!uoQX`dPCFk++D9Oa7hxoAEtJhMi*?RjNt5crFK% z+^jj51GP`49(hmEzCPvV;GKE&QrN}hs$(Altry!r6 znt%)Dq&jw*sFNjDowRFDPxXw{*gtcYU zZWR?ra}3$m^Cs^f=X9vZ)jC$YzU8Ud3-4Vx?i%Z8yo3Cc5!)o967s6cR(tOJmN z5W{Ze78o7UO=qO2`PM1Vh=h)5)dqqSb0w{Ik0ce_5F6Br$WrK#`+&P7uwnB2+WGMG zsmVD26e6+m0r%dUtsG^`ea3OWr2M)*nxg@gPX4;jU4?IVdtWGEczs!#iQ7PHylE@5 zfdfbrtuKW4zGhqUrijwPXQ1jZYT8?!>D_zflGz?FFFv^{9EPM>LFZ&S)8JQ2p(;Wm z`g}jE&bl>A*k+{;4xi2y2@L1NYxY5O09&Qt4rQ)r>Xl#4;OK#(Klw<}*D^7KvY;Za z41wDvtViTXudqZ%m1aoEO?H=NNl6CBbO1*-$|x2)t(wD38?Mja=VBSCrjOL6>d$0tZL&g{b=Zm=j_fs&jWPqAJ$Ya%>Emen;XdNS$}eQkZv}h< zs|A3w+KS?+1kRW_wqleZKN7`z=KNsjl%?w+ZaLjfqR%h9I7mV*|3Mbov|v7}j`Vs(BU&6W*p_-F(Oa+&~Nn4opQXi zrG5q{Whs;&EbUS4?2heBtP(!un_;=fFFVShp;S#aj5Es30}d#yQIIbVxF~V&n!2*h zBaCMeiBZTWHb5er19F=kfeqFPke|O|tM{ena}BW<=g-@o6VcSyoO_#p;{Gc>&dJIT zsAgbZx2zanH1o1~s5nAu`T*CBj(%tX5_W((wCPqccG`3c>3~INE{#0M{^x=D5hDz4p?*&XdK( z*M0(S$fh><=K~K=wW7AOl{bGKWp**M_b%w%I_ZQnf1W2o9+Sl&+8q@gZXxMLf`eH zIYms(u!YXogq0~qF9Nnp)TJ5M99%|Q*Jz*EhWQY@$GmdJ; zNb5LoV`ei+7i9~~Zz5jw7XlX&efq;M@A%K-4ObO1>v_Un%{UEQt$rZS4SNK*;#v*y zw#xZ1QO2`~U34QxR>bZQ1obv#chd)blu!k82nn!?CtvqcdvUp^wl-4Y-;e>MGs^Iu z#y}hfa>Vog#6Q3bnurawJd?<#%P;Wg8ip%5%Ce`~)HF3WwA#wr{7y3}PcMr)JUluM zreNXpqtSi2n8iAb50b7Cn98&Ru7B?pN-;y)j|8TF{(d?}8>o0In}E)kdfR!jA#o#) z;z|P=f~9DG(Zt(Ruti&`5S$JELlFN+TZ9X#-oUIa-Mn=xviA90X+R(BB#?+a4Sk}4 zSJ!D_q(oU-a(SP~(FKp9!phK^bqnpUzHvr*HcqkRp7zyLMp4 zM|RnAVnBSKPF1$YQ5GWp(yM$}4+09{NJf17f${PC>tXGy>AS&3yMz=F?0ZQOVt5OnoJuzI+kKP>L=lQF$mabCSjUP~=-z^i6LuYHB?=208JkD?eFXd3gfrz(Q zNxT=}S=_wOG@^SqkN7b8>0)CGmmuU~qIh9b$7Gv#*-U%IJg!XcMK3q%&ZyNMtl$&) zP}*0GX9^JyLrT|r?zrw7uQED-^23ywUG>+Wl17WRP&V5#im)sBHa(z3V=K3wzOqCR$B;hmX69Oy6&q zZcw{!-TGD|I&u%Wz?TCtz13A=O*E+^_jhmO`=m6_j2PJm6*vqNZQvGdJ}3GH&!>xc zmxYBDrzqwqe^DztU^chM-{qGui~SD)T1bc!D4K~5Qr|X$R~HCL44)sxcnsfnRj!`^ z^0kQlgTh&Fi5UKsp*knX;#6AW6I1!vwoI&Ok2b!}(IN^H<%Q2oUKueYH>KCDt@pMUda-J1$GVLOB_Q^F+Ug~{^Gr|TG zF5?RZlv#g+^x%Pa2axv|nTVLhLIFPb-*y)ClSpzl{Cg0x@hfxxtRM4&{ZEV;3%Z6T z0U#cT^{eEA{RETfCEEviCXLl?Ep4^}=(Ce}T*I`<)PaXRTi2Au22u+xYhKx{S}CoD z{#RDw|9krZZ?;~f=0qa?82J~N$^B3J0GB)DDN1o@$wk_xD1<*-I~rJ_HR{c`1J8$q?OFsJtGBc4x!SmFG31T>nNJBRq8=f`gRRq(AIWb zP0@-}Sy6mk{`^Tb_jJq8=DaC|Wh!ifd^Z4M@3yoK6iv{K-M%R?)ngN2`9W=?id0|b z-G1Y{)+wzkRl+lz~KQko)WI} zBM`N{-Gpz-K0p5agOSpr@ore-8dG7iGG#Vg|5P3COVnq-OBaq0)+SwNC7n`b?F#LC zPSoT<<;hIc&$dgff~DiynnyN=Y=Yd>M#|djNvv-L(nS^a_ie=7o9VfdyS;<=`mIEr zVN`(%9WQ!M8>7(V02m#0l_7T|Vo>k|4{~y0@RXxQ<}I4i#D;p#<-+v$!?8`@+0sh| ziCU#SVVm8cmk49(pp8Z%)X*vu>mX9$gA&g~+mGnxYT4;le90Z)NVz;0#0xupT?iV6Tf^^kBwFaeY&$c-`6)VZ{0dL+bp_ICQ3w8zV^*$Kn9~W)Wfn%o*1dK zvuaI(1!;{Y7%}du+(AaHf1!9UE~MyI95Hl7nTSoT2TAs%80~p4;gg|Z#&bMbS|ak!Q; zIwUd^t*%pk(JeV%oc8{2ersX7ot?tqa63Cy^^cu;`u9#DV4c)Yn4Xr2ky*c&E0?Z5 zdgm`Ez5XgX+no(;)k%xVY9p0$B$U`SnLX{{gi=qowhBH`_wyCn%3Aiy5;wnieXhJ<VPMIjnPH$uNb&5Hv|D8*7;el?Eq7p{r65G1E*tSZD->>+&N>d1Xu-{A6-vTk* z;s3!_{nds3ADC1ABMJO(pKo!s23b;nG{S51-uxkG7e!D`FM0{dyXq=BF>)Bc-jZ9N zHCih)GT~e+{TzT-TpP?-Fa`*+k6&Mvq!mpjq>jo4P3vtwK-O-hHrU2E&iPv14Sc+z zkYU*jT7!do%<^XDQg|;79G8j0yjW!(#1P8hyAdelbODp6fczD3T4O1xb`X03b803C ze-AMKsUuF*QTXt5g?XveH#M=uE)p?Ozf2+N@R2lmL8JFP$!kb71me&t5P@RJ`XJ4b z3~6O@TbF!9IhtVoOK)UP!8v~_Bmgg~mxa2H0CT41&NoJVp+f zur{#Pow{$b&yWdXTCv5X&HKr^Z54u}guOAJ8Dk}%`(MfNx?w+pGT6al(!DSmJEqgv zL^WbkLUVd=#iA|Gn|W!cFF(|09mf??x=#!CKXfsf_7@0b^L0*2`Wztv%u6Mf%j7T` z1mqOZkSe2@u1$4lK=&y49?VArSYq38PmzY+g;=^`oGq@&+xuG0>$jE4()-r^32ZXHHV_?RDd5cVbOB(wI?{WZ;iI zlX#&8SCj4(=58r6&zX5IURcMSOEOVt`wKE*0T9Ga%Q3kVX|i5Gvhe`m#{{fY?=EgCjs~&JUT}#16(>hM@y)0wBu-u6Y!f&I7p;Tmmm6yOTcJzHwhPA!U2I2p+(? zX`Cp;Zj6_vsB=if4+m)FmCI_5-}+Wzh&CzIBeC#UgcK4*c zsa?Fx#>Ps^3byr(Dsz3ys963LF{bvo zBI_Q9pm!&T8?y5&H_5$ui-4{3oBaALcCfTq&m?ezGPLJ}AH^?5&hlG@2 zq@AbLVC2!m$@o*0`}V9|Im7X2mweY71|~0C#=G1Y8Q#1jZ+&Irta03~CoXYi9tsv@ zL5wQdkLpzMqx2m`TfP0l+`|17ib%P0-a2CZr;FqhF3*Vs1}QjP=07fz1pFVUd<|1B zfpP{LV5Ev_LYsk4H7M39V-eZIql!(!)NDjrDESl$efqE6OX>!jto6!3nP z7ww9!$EYlj0~E%Qb*ZEx8jLx=Eg7BzShnz@PTiqH1z*GrE^O)P+pso$)_jP25N`Tz zg&?W`lI?y53sVoX z$P)&V;wdWvu&76Y1s_}T6GcVvjp`tiRfEfJh;IATSrcrIs?ZRTHU=B z7i(FVCH$z&KtACV=uG^0$*7C?^U#1x4jt(x;MU712qLVDq>K#FH{<8MH9wR0j_u z3MhRIKY%y%r@D#hnQ)WoElHx1Jsz~PnOO_AwR}RBLZ)JfjTL5XR2E=tp;a4T6|`6XDW!6$d1 z1x%+Y1~ndTyM!gF+>Ve5X?4Z3SNhZ&;k9_w(iqele|u=ahf%kjpwL+5vls4Y6ourr|&S~fLH;|Z$y6| zc0cpb4V)va8^N<0P%q)$^0AYeZ0#~BpA>)IdUUa;?g2hbMRk9OnhOiU`dig!`@hUL zCpf5inEznC;lO$ua3r^h7eOXtUD-KCH79U;T=r~8#>+Qx#&j|2ANC6Cjp==h0H!7? z21psS@QKKmC{c)SR*p!@@`I48+VMp6&lc|?pEoLpVMiMUb?aR66HXU;{ z5A1!YX0<<2LpUoK(+;XlKW;Yg-4=NHI#_d$rBche!=3Iws{l^{VOBF*56=GQ2m^cIY!I>@ zinGL1@}3{sr!`o4LrlzHbj#W!R&9$@nRV*~{&7_zoO}^BgYQ9*Z`(%Vca-3EX$C&- zko3wE%Qy=ayPIJ7hPK4Cy`~KCkEia7SM(e;VsEj<#2d zTcGk$hPwb9_qdPLT1Y}HR{;g4n-Duz@A``9|JxGN-TaIz#YMKOe!1sGUx zF%pNP3v*Coz>CUe4g+Y1OHoLd>b*r{&z?Mu51P7C@bfOdR}VAaHpE^}pF6%c+gG?X zy?Ur5y6NFAW}0J1T2V-}72pP5a|)Z4oV}~Ad9!lKA-^fgT}A#}AEB(EQjhqxBfOR&Zq6%-Ex04*?hTg-s#DVXUau9d@H{sNPRR6{>rhhYG47<$5GExFyLHxJO$d| zsU(BcQgi^LNW-=VF6KQ&Xn5Bccc;%r$hvW_Rn&;OQAv+#WXCnr+tsFGL?mR`-8-|8 z0RAmd0it(K^bV@9SaAB4t&zY{=x~124n|uwxNk z0fBLn{u2DbR?Y=r_KZ}Bxrj56lQ*ik+ef{qVSGFG4ReBD&^g1Cy)B#XXuz_;W9k7F zCnVXqDgj(U02c8CJ(^+K8MHQ(OO7^!tX_J7&77C&Ab+CgDP5e%S~%r3c2>+B)?gKU z`yJ1Nu2-s=zpbiB7( zp(&eBPff_3n>5I*d84XZNW1RLzi)T)qdVt+`-7YQGhz-d3R2DK>|R7|G09FXm4c<- zqMTmfF$z-{>I+MRZsuIpVVrP~Tu%Ee`opQM-0BHw=30OT$4?GqKW=?3NNgSWe~w`E z70BT^KC=LQ3$o#em+s!k2NZQ`Rnq>cZN2MNPqDu@n2&Zb?vDUiI-rQ}!$PWn>vgPe zp~iTs8#Y}>_4*K)Dopo>NJI=|+OdD7LpIM+$HfrFdw#X0;AFhS{HG0B>2q2-Pp(M{ zRLj6?$ESjldET6O#a3g)!g0<9qXH+NL(TxFLi0wfa=Ximn8xqDta+nDubPz{EV90|^&RI$T z_3?+Rts_-cOnztUmnTDb?L))A#`~Nb7(YTNr+%MTwAh*w-t`+m9oYI?k&s#yT||=T zM;Eaty0oq$c}%$01kq}Yr-7}t*Q>2R#ytUJkOvU0`sd6)45ah-{u$=?bZ@`W-4Wc_ zGmRFnhE%~qZ5fe-q5VxhH z*};#!hB(3sd&#q=nUd&S*NOVCFi7vcGrGnqR zw3kp`fE6yk)ruC}d?av}|2DaWR`mAvE$$1Wc zIR?K8I|?ZgXnWsrZzj#`#`fO!C9j(&LQ?I??~+=4vx9<~Q`Wp4zT{Yrq3mJ<(z&{# zgjq1Uz=_@`so^@D$pT445Lall6bV7~U^a3n$uK`6%5!IFTCa%wb&o2ho3jC(!L zGTEjtTA|-#SG;P6a_lGzDAl11`}j`zDL15yxz!&s0b-E&Pslny5*IL1p5O)I(1*tm zsMKki3wdk3fs8vh^89I+Z6$Pjp)XIJVoW}!;ink28dAOd9?>q? zsnr@iKdyRnC3owbcKBUzSU}e`sv3Qn(GrA7#Mk z6`el80mVe9dqb!ZK;?1wWi_Ep)r))tY|R zEz8|_y`4A_gi_~8PSgf)gv9BJwTxV8B`_lHHvF8fJgQTsBr`j|FwoecbbnXI=U$`R zE2H}IJTW&zG0wrF)U8{_MWbppr(%!FJ=|k|Y2U%u7_r-`)Cot`!F3pTbqq^mwO={RkB<4bD!=>uX}0fF!4Y}Z zZ6+fVRyehPy0t%azyuUNg?03 zPpv1?z|uNR0K+N*TtPxX1TUmc#H4fp>Rke8b8rn4+AU6jxW{tR_e|EPebC}R(3~W&wq)t1Jg5x&V{g?Pattqt| z!HL>#EGt}*R7?Dp6+9U2=?D|4sJ31pRu+9GiI=jY6dAV0b@4hSn6}3RPS0LZq`rkiVa> zJ3aGm4ThaBuDf{Z9K^h~ywjwTyj zV^S^i9MM>F9Vc6M7Piadr&}uNeE)(_hd5f(M#3*XXCpa3 zIT%?>?u(r19lwP4n{1GEtE*}F;eehkixR&UueBM)Vl+ibg8}>|lY5v9ru$0>3qT>e zPcyC&E2yg;v1yN#M2nL57I>QA3E{GvR!_}FNjH6~eAU-~9j&-IuUT*0nt%6x{_b?~ zeiE#^>fSHCE{rFn&r3tbRaWv5 zO3+DSa@gYLgP&{FZmso!9T{gEtlVyD-N&_BURV;3$u6yCfxlQFJHTg5!F45DV^iS! zD~f6AR4hT2p=#d5*HADK^t$Ct-qOocE-pPErTmdu3*;O9op4yh0B}2>RF{-e73)XN z_lHhBFj4YuNhy|{?M1zu)u*DhZFTM+Jk}U`dv3#nyX=5lQbRacBl{OdtcfNlq96!Q z@{R&b*6z2yXr%i4Od=obOk0zab@&+{+3$wgHR+ze1zyHGpKvaZ2uTfl;TuGsf$Yf$ zDwENGxaJoFCtJgX=`s}f`WCskJA#9}a6iHzWU41LD`z_o@0ss(oP9ZNG10|fm55Zm zm<3;0)!%cd+9peW%Y)Pi25k5us&g`#zpry11~uNjrx=mC>DdsHV1lTvO)(-LUG0>jklq_$zMy zpnZAF`Z-_B!?ZcpUNk7+3fO?B;>CZf1Kq4eDWIr(VQMq0WYLe;J0LOF^Gr?aBaKdl zcWt+;?cTF$Wu)GC2e5151kffpWDGu7KtM`VW+h{ovQKwBksH%mcbF+K5901G7kwcl zb1$&%QSu@EJuR5~f$*dNtMJl=}$u^20bHkakFL7l3C?6&3G8_1*gv%d|Zd;(ZTdF_vpZF{Qq(Dmk>UJZ$7w7_C z5e>ui{l96*h$%57!0zAkY4GDfWh3vJk{2AkM70VqLF<7}A9j>ZuY1!Bpm!8a3rL-e z>Ba7&n;#paD=k*o_Dp?A`Jn!@)j^}^E$O?t_is3`(%L4lkOa+X#1bIQT+($bMW2Tr ztD8*7E>;pgTtVd!q*teMaz`=klAu~~!5acKh3FRrVX&DkDhtJBTWk!}{Zca2$wmh> zOG9p(@rI9zBY3B%^4`C}^^OMq+p|g(Z42Jg^^bH66ucili)ZhUK}j1rCHg;kK32F; zJlCRmPBw=)v-pNq!sYf_XBWeCDtQ%Nx6oPPv^4pYW_u%)uaIdpLe~x=Ff@B^*H`FP zriJ@UP4u?eWq-FH%92++4u6tVNs4(i%6JlC0NGNpj9fa5W)>pq^>q~Ov*@DTL$wij zV>+%r>LwWs6FQtc{=K~D45u!=C*l)w7dT#(@V(%()m5C))F$FaK>`jIVE=(JoN7dNyN`JY(ihi5{&5 zUUDu|>urbg^=g7dif4c2TICoTN+NZ$-?cOy$WqSGfMi(TVZ;S6ohD$Z<-iEz38i_U zBoRfTUxUI>6s2=h8^7*TaGgk&RlR^UCda78&nNXR2PgYhsl@r=^Eor`h_sWlEgX+e zv8X8JA-p1_=zAGu7{Uu=BS#d*8#8~GRkH8)k`rW2&UWmmA4eZAhh7lnc7u82 zJzb~@ANC}*OI>f}vrIGd>~A&Mvta1^8(uD~f=PK;s$PqiN19IV?k`cd(Pe%DD;cN4 z{J#_kk&srHPGQaRAUM$6T>t7{{OZD=9wBmNxzm0BIc!PVWo+oSDwWE}O(pr!gwdB6 zIR^xu{=*?uUr0UMyyFl&jCM&4XVEF&fAmHGa^_OJv_&uYPF!3E%zM-d9?#^53Xo73 z(b(YIz73MJ;fgNLg)GJ2j}+QxP89DOQft2$!xE8*>Aa3d3DFdQVbJI}g1+5|UB^vI z@5YbTdq>`R{LAH*Mn-YdFO{HRp({bX5su)0D+MnbZA?1|{!3{o#99lP%XOPBA2O#RG2bfN6qX60wGBpvd$@@(1FWziu9K0+}dv(xrz`+V$g0ddlo=mN63;^ zhK>^v)0>O-v2@rXo|7I(sfyQC*ZpN2I()1#isv1yTeKx;qNn3hnHn5F?#p}i%3ZPR zNwdzZ+X>|0BqLP{PnUsxY8%(9X>SR|=3*yr3B9V9L)oI)llp0DlUs*u#8u?ao34Ia zwRD$>jz+%0(4|cZ&M~r?yF#vYA+*oqp%o9cV{hG(4VLxJ?%|sI-aq!i{ugNxIEAoI z6Y;S&@kL3)a6_w6HT9qGG|$u@-!IyjRa1WUq~Kl=x#WvG@>urYfjMA*G4_-S8c9)~ znY|#^w;kp^(%wKeDGs7!_fu=6M!Jig<~oBUJ_+>PB(G?jMlRwqVd6167R#4AtTjMR%dU&sr6ASc*SN<`2ltgHi{wCVQRPN z!U25?wV-he@0pjQNW~>~h^^uUekxEn65J?fQqPbf#4Z4X4v+{O zbRj{%8T}>Ex}tCP`29=`z3hCXx4qp=u3bf;iM{AjLK(GPJ{0Rhqog77aE6qVZ6+@U@b_J02y-;G9!;sFWjZO6XQXR8-+Uu zcy_4%&Q2@pMV(gz3@eJtaT%+E&I7xx3NJR+nj3XlRgPz(X3gBu0J0plQW_oa(M_XAk)0Z)cMCr!z5yM7@gtb|#a+nOykOnXtYId6Hm| zckxjPOBBEegCHY%fO%xi0J-i?#!(SuWZp_r zI5|K*$%^IK)FOs11|;n_Y1Z^WMg`#79-bX0h(%X2l~yopXm7t)(8A*U(_kOJQs&8ZJ zi5bLo;_pjLe0ll2@`j0A+k@Bh$`r2ZoG|O)`umT6(sa`u4y5H>3OcfP7wrkM-?NX6 z`4K$-kco(tBH}kYny1yEK*LtEaP7H6P3rGW?jI!N$6U+-B-uLmDB$mcj*J18aD3ob zv3Y*T=j9Atg53Un|7=Hr#LV=ZaoNwb3#i~Ty;jaHWxTQHkHM!(3f7R>SU@*$e*ve| z2eNjhVbGDqbQ%V=Ci4)(X)Etux}dhPRK@4I&-Bx*?)tfxJdt&>`V!+{nk;{%^7DM_ z7VII0Fo%_5&N|}P-Ifs1a2&I^#2dlS6hga9Fr{2p4f+amCIAA&W=vNh>g#zcPqB2T zL5!NKU#_CaMSUqylV+LvUa*tYf^&R31jFPpT+-x&iorfmT3_EmfTD-z;OqlkDaFAa zZeO+D&m*=h%}t{@#2?n}4b2T6jRBm4b!A$@y!eSAj0Cuo)|(%_mxk&5!NjkHXbF$5mO5NrP{hH(Ao z7(%aG**dH~=FH*8PeRMw)`lTX&Go~SU?%qg;9rI)!|RJ=QR{&JlT#P`;`XB_?2}Ny zD-MvA?Btj*81vuem>K<{3lAdx$}ydKJ^ztos@+o0dxkT75>@)<@{%IH2oTYCcj5Wl zEf1U1$a+?csJ=#L6_yDRw4FThXddSRNi(4Xzl<7`o?zk@(>d6LTb zGr0tyC$cr{uk7+SxvbmuAK7KjPIlS8lU?%t+w2ksvP<=SPQhttoX5-`EaP!8^uvpr zY>?*}GV=aS(od3-Wi@W}=R1=Twp)%fj(s&Jc`c7zNYTA`)_{eb1#lo%g`dbQP|fPv&a8^AR43`)4WvEzSyooB zb)0X>yo*cW_@L~Y3$-cv0>>nmQ!6l%Nb+$$B_K{h1F5=&kq=D)(`iSyAtD4mhO{n5 zlu_U(ko+Mp5h9!$I^lk{V_Dw^%$l3@^rloXTEE#&AO}xeb9sijUcZaJ6B3R|^O50Q zuxb1bFfPi3`NqJw@t)ffHa^(k<&(uhF2zhYOnrFP^mSC8)iYpY=EekvdJB{C^6ja? zFIK=z9w4Ghoo*aEmF4wwm;PLS4!6L{UauppxTNR=t=79S)*3$aO@GD=PB1WHI5lMm0~>0HzeOS zPyBj!D%^Klc~;V)LgAfH&vzVSmNZ|>qRVkaG567inNf#%7PE|@UITTWM3<_KPq&KA*d}laJ`gvfQIbNG1 zYUH_Fl7~C8ZSWy1A3>N^H=%*%Pm~;*y>XnsF!_bIJ@?+@-z#+)r!GHD5Am9|+@|zK zEKLm{sc<_uddR4VK4I@1zxdew_k)dP_dy$nPd%N9F(R zgvS3c)bl^Y+yAvFz9THa)iYyqMSMUuX7~EV;%lznB<*p*_`P zKR#vCmYn;H8_by9{l)W9Hfz=8RhpB<_g2G4@XCMY=EodF?l;md2LetQLh<%j(%K?P z%K_m5pRqn$GuEMJf|YE6g!t%(gpO zmoBB1A3Dx>CGc%3(Q=%UEu2vfkIg1H7Jg#+lOP$mc}0vJs{FOEcL zM|=?K)qAoS7P*Ys6LL@_2{m)_?mZU`g#^ifTS=@3J2`Kq|9*wIOLrr0y+#NesK!y4 zaRqB>D~?4S%|-p?4#z_qLo;7S4Bz!tv=?wb+1%EAe(w{*%N{M;EdQ*Dz)JrPDE$Dy zRC1yMk3xQ=EoEg=Qv32Wpecp;uRjF9|qapcOz{kT4xSG1- zs;2ALQv+`S6EZuzE<}@pIH;_Qhelj9S-M_YW&P$JuQE4{d`kJb8)82U=N9H$G)^?U z8?PO(SMnt_%XoAE%~o!ri6UB`Y}<#3bKL4e#)k$<;N#G?1@m48%h`ck2^(EZ(I}!= zCkITj_SycV&-~svFwdF20Lf=3(J{bj6)|3D;t3$nYPepD<(pf$0TfuXn6j?!K1Np0 z=jMz*%}2`@vbmgj`x$jwjxFmU3;(P*{*|0_c08SxfRy}%3hvMz3Cwl%ft^cr7*Uu| zTWkqOoQ-#oYi&T;C27BCWzRCMWaZ~%n{qn#C#~OKhZdCOJ9$9w`0rC|h46sQSp0cv zjqm%e5p4H8DHQFH$)Wu zXNtYmQ;J^RxMdN93i8p)Ocy6)Iv$k+*jRB(xhOssFH}obZu!awZwXWKCr6jAY(3ni z_qE+RTCc9B>z}xo`6#M<8bHVm)CbSeOC?Fa$jaj!6Y<|P<8I(I96sbjQ4qWkk? zBlYQLjI1Jr=be3TNfjg=bb5Vx&v)6>Tc27H5pRKQ(Sk@OD%Q`xk%%GnjUR{J({`$q)A*Z-qTDG z13bo6;2Tp~QP{c#2-h=Z6JDYt-X{~2>+`&;@>-0fmwW<^3ivT}?Ebu&@PX`p7_T>+ zd}0AQxTl#G3Wc3cx1Elorj4uVY$hjP{nMK$qD%&fTm{GOd~^Xrezr;nT<_lN4$nG@ zD3vliH`b5~rnxNhBwMXtom-w_t=7Yf_hh2e9GHsa{@6C}#kEaN zXwbH1qCWS`q_vc_^*AAAb#!9}KqIv~57yr{U$wk`_Of`{55XI4Nx@`KDxerZTLZ{i2wpFgBTg-8!84BU?mv4H zPjSP?rK*RvBbs4)D?d%X57zix}uH(qovKeemj-5=vZW7o-Wy z=S4=6iJmP*hzKfm!_?0s_U6z#+A&+<7SEVU)`tFQBN6UC9nyie*OeKA!g|Y#`}SOn z;$Kww@ep%j84P`YM^O0z#s2Y-HEPigrzE>5qx>fq`al)bGC8)0>(<=;$@yf!-Ngl# zZ(`cRlJo6lZ#iaz5~p3ay(T_?KWnz{_Q_q;VUj0him0?sB8Ot);XEA@A$7#}RZ_p& zpPBHJy#eE=?0ZYp;Jmf4xA5iPZ`9_JRK(?0LX}w|8*r>O=!d{(26GVTm?9Gw8m36z z;6k3pUSQ-K*+`X#GM@w&wim~g2eqR%8${c*KB?-~i#H+^IaB5$3o}I+(}0zg+cB^B z<+m1}zPfVf<0wxQTef|0um(u14y$;kTU-;dyC67Z$- zJqUdJg7F07DLKecC19wJ&Ll2j#eToipj+^s*>ls!BTAd?nQ!_$i-~{0e$4pG*5_V% z$|IUaxCfQ=Fre_?$2toJ z5C5j?|9@J={~sh!bp8~9Ve#7j;PofF?_Uf^|8Y|Me^?&!U!dg}{(qE){MXSHaTTGR zg?Nbiy@+XC{{mkJEF|hjSDyM*n^ZZ5(KYID3@KAE|t#0vi zl5AlWfZzsH3)%KE8bRH|7t?tZtxJR@ZQ0wy1?lW1NWd|ir7QGwlk{m#4O3kh%`-P*~aWnGndCQj*Rf2L@ik@7w{RRwkR5S=!ySp=JEM6TToCs+<{0B?F zGHW6Do6d-_KUmj;`_@#&_({LDMVEU;&-Z*U+8Y=X@7gMOOKaIrxGG8BA$g=ypMbZ~#2kj#{z|}kZ<+KnYn^)njJLNm~)eXmtFwm<|2IW zCK{gc1q92QNie>qMZMb2=*5_TVO$^?Z%;bBh@9c*Tp*tU;4Sr-*kal-x_J$AVw`SW z(ub3gf?E$Tsg%rCS4U~-S&y=$&+fzyo$ru2HzI3 zQ%Zgk|BZz&-R9=h585IU(%ocoVhIaEEAyHkm_kVPjm+>pMINId&PCw_VTUuZHXhdJTY4 zueiOpVS-e*YS1u|Ii#<}S^mXgW?=b9?Fdm#oAVEr_EStzJOL*LXtwMzkOuNKNPsz_ z+|$2yF6{LHZR!%;GXAuNIlEPfbibr@F zhUD^W+^7Zbp}x^~I^_a#rs5tR@+=?)dA7?AHFF1ButG)|oEC7Lnd!=+PJWQFe378Q z{op|pcWFKg%WGB<`Y@(*6iYtu4g2UvWy3=P1gFoo5AYH`env_~X1tH{x{n2Z|CMVR z8LV;jq2q~Zj(6D5jL%K^Fllf!<-zK05I&laDuOOtwS?`Htm5Z^O%E@AN}87<+uv7H z^I44ASUZQ8vu>;$i&QFrq(+&B$hl6a zcMMn3&$qThxn*^l??2oKyE^*X?d{2zv$Ll-j*T9cvO4 ztm1muh{d~O@IU^Q)dY?#kZKw5f%;Z+3V94i&V-aMF%^7KqHYkk79kSMkq0(^fy>l)mrTa^~__-UOjf6C)7~f6kh!FK8csl0Q@IZL z>+_{MZX_z*hWbyrioOb%nB8+}}a>=6Y12`AvIvz5hElrV>fTt3tC_W|dDNZdu zYQc9KhxM%A{K+`MrB)wq09*fkeP2`NP0{Z{!n<<6T0PwTZQvN9rOsj!zYjymb5&zJ z|AXZwe#WmK$UWdC28jziXxRz$Q6B>A9vl`Fm)9GlE+~2LZWxhq^3=t>$@vGNNOGVIY((A#&RdLG=n9SHW7F{S9V3IK) zp0Ekmq!xp>GZ+%xBe<4#aJ*w5cuC|lPhZW-IzhLMwd7D&UpiU0=Ui?uzO!LimQ=d< zVAq*B+{S^buRj1X5fY#zQbCXvWsC+RB%Q{3f3P@?*XLTBQgoTgMLj=0xvb>4uiyUk z+h0aq=^=JSEnlcn_L%&xV{qUko?~lMD#*c1uKrTy*#FhucLp`twd)1}ktRh1qy+&1 zrKwZ_iHLxRNK-mQM1+VC8xSQV2-2I1f}#)=5epENsvx1GBGOwZX(|c{Bmyy-;#t1m z{=PkX&Ym;-%$alEch7nMFvAa?XR)5O?zQggzV7Q1SaA21YH=u3E?(|+-|&uNH|_lw z3=NBeNjnh6n5olh{FPfWhulFZe@;e%=6s&|6f2(g@zyIKaV{<6J+M-QoVAx`--uR9 zv%PXb#n*YXrO6||UhMP{WI5R2Zn z2=R803FLSZOyBl=`T6fHnj_6SC`Q^H#I)Cs-HrNY%gReX5<{yE2pSS30 zy2H>#_w|V+SQu0RDxS+RBS{5u680qz zc~*49n0(6Vljivh+Wd&RZ1J}7Qz`~9IXdFNk^=X^m17uL@LL0ANw6Pp1Ri-C4gI6s zb{os|2!w<6M@LX{oqI~}6cb_?r6p6g$g64S6uPmhu2(eZQ3>~oXMyQ80! zhDpPDJNY=C>Z6A>Oal8Pp&+iJdPd(a1W#R6-4}kHp%`+@Lq=kN5W3e@3~7CSm3!WC-N=D#1vc;3Bt zQ7Z0{4g^~k(b2z#6Ge$nGJ~asNHr+Ff~A`!7)c(e3p%E1v(9T)M7g!SI}0X3H^||f zp;c*9(>oZFRNr*UNOYyGL)qj)oX^kKcZi8A9`L;d-9;8f5(V}RiqpnwijrBc6NpAwo%Fd&CZSgMMb;kGO6E z=#XFFAX$OIOuY`m#4;6@cYe1qpK-ol2@$f5*>~gNQ;AF28AqF%TxdRT+uz)4#E$_9 zQl|5M{wr8CNrsa=*Hx^<+c4ZS7Etx2>vIKyiWTXIxB7rh*cqITno)N- zWNaJEPU{yWS{3D=)b|vulrFN;uN>oo#4A93My|6^p}AB(cisvnTcAa zxpxF3DNZkq7=5*+vaGfDLLbj`Ng0ZqyPa#{a@1h^r^6PMX^EdeV-dabeTrUw;cN*HM-@ zmgfZP2$X0{Pv=i)D{{SaLPc;#B0{G)@42<%fYnvyE~Djc^3IgHk;h-`)qEL73La~$ zE3-UXw>e2%y<(3qX;ByS{DQpjZI@B*V{M>Vwv*CBlvtv@Hq#3&>de_&59j4;Q=*Dq z)i>n%7+UExXjdg}1lYi`PZf6)=FKYrIoWgFqezlGp+uIlp%D7qg}Z+4)sO2Ov(^TF zPp$CHGxrr$B^$HH~@?Nf45OI>X4~W>=_}PiQe0|CIs9S8bj>X#j# z2KbHExkevg7-Jinvt_>oY&J9%lUv;35G}q<_8QDlhNq^=k`d&Dv4I;%$2r(9h}vBl zkRK#BU}j;pO0D>O;IKsZPXl#W=M`taLfhGE9&=XiS71j zat^Ss%N)t(y%eIQ!EX>S{>lL?SYp5 zG<|R0e*7mO_9f1;1J~fTh+vu|3L}@nYK%dvFs6TS;R-4$ z=p~`1p@FsW{v^E1qU79`%3i}Wy|&JCIX5Cd#cp%noU)Cd5AQ?rR7u=$OmDF>J%tI( z%IBC%E}ZNzn!02wj0kEBY*LDOuIYh%pT?QT3zGcu-LHsOOpH(XO}`Ooj@Ef5_S5U1 zCYh)n;A`xFR^;En$VS06u#qr1gg}XjOJ}r|!?bQe0t&L9fA; zjLJ?42>YTm#)Pv$Ac+U8q!gOWWxMq}UvN%#;Vu`T9Z%#_W(h28yRY4*L0ea?>uYRO z-_F$6{J2V25?_yg)8nr#{W$~xK`DU2etTAE{CqD-p3u49R;ZGbg_QULxEHtE#~oTP zrj?!gP$VAyc!z&AHMJ~Mhdnmb+4zC~U?kt5VQ!QZgRK73x#3_H=~+SSxuaxK8=N5D9_U3=-1=H+7CmNMCLG76J5?TV2a2 zxvFl?HrI$YkEC`?D|ZXUzxd!xD&U7fu%5NP%Wugb6|gtb5%v`O)9@@t&HuxvaYG3tmo9KUM$uBtkqKaPcOPYjDiN<1FVchN?gu$%R!{ zkqMWwA9c}|vT$)C?B3aw14DIx%sdj)Wv5`Z0)-aIR2#w;;zeu@#6aa5^CDp z9>$HYxKY)`4zdniN~DyW+-zQ27Ga({?KVhhbWqE}Jn8iP0Xk0FYGF(dJWv-tK*}dT zPZ1D&XRn4VZpWCl&(-^p^`zk^-s+3JRRQLt#vrD*z8P;v3XKZ)1PI7}_W5F#e z2s;(e#)EmjC}^`@V(jMXq8vH|TSr!0xmI-x1o;o`!wy4>9~I|36wmZZHB=kxq-~Zz z&}4bbZ>RQFoM2rz7sUfw0LfRtV61HoxL%k6Yhzp)r@&(bun#}GY0L%&!#wj3HYJ>Y zU7v;667EY3E0Ev$WAJUmNs90CBG@NR{AL3AWpOEv3V@z^+#{Yizqkrd9<9xvTy}pM z&cbF3-ctjk@)b$W&nxduZ|u4r8t%~M_bJb&fUk?T=ERcSFNcT>*(vc%hRpcF9k15n z*54?LBpxb zUs&}6YYNbAlcZ*U=DAj!7!34?tc%vcbpcDq&TQ!@zpSZG*SPH}ADNT$^?4nik6*CO z_<-7fqU6O(-4+1(B|pZtIij_>+pukV=x}ZfddKLo#-bqR5j@Yp=8Nj>*X~_AbOLsF z8t{(6YK^A!KXz@n==&v~AquEnu-b}Nf-^bCas}Pc{L=&pYL~( zwOfgKLY8}jUncRB7h#d`sWSErehHR*nN+KIEAA(Zj%8_gl^SxM#>1A3%oAkx)dM`LASHFYhwXgH3o5{=N6Pqg$H=Go#T>{R=oaQvct<)$3e z?|)TsD%#lYV!F-HE%Z^)%>JnsZ|x128k1xgE88BeD}$Vdd=Uj+a!^<(mWZcCFerds z>BPT>QJX*8#od8II%QLqI!>RW?r%m?{fv2xu+Fg}6XnJzRR<_L_NnvchQ{~TApRJ5 zCXDGMp_-j5&(?#9R+ddesfPf8>0wNe~N}t2HWGfUqbofB!7K_F0q*X6B=_ z+>Kw5q0J%%Dkbkg{Bj-f+A1Zy^^LZ+LM=pvH^_g44aIK2jKS*r+X&fkg*rFgWeT+2 z%G_PifvlSGvCz%8=LNlCs803Kq?8Qu;gs3X)HUu9|+<*V>~=tX?XAb6|)V{ z+uv_#;+Hoiau4y0f4h#8=}VWvfxXJ@hF_kADhU)gp42AJth7>RQK`ak-6pA5;q;`y zX(wBI!}d+b;{7G|-Cexui1mPKz@m{EI1K_aKMnVcM3<(zMio%pfuAUj26J?Tv?>SEi=+7P6V$ z+pqShq#p5{fI!w%@d5uuj9JB8W`AM9TfuQ`f@7p`_s)Yh&7N*T-t6WAqyuQgyL zR@RPUx1opN(n6YJ~v0%IXm0*supcioj80|M(XZI zU{Qom0WWL9si2Plyt=~@_H3MyU*Y^{UXktoD1@_>+EDNRaoveRmjJ6FGqH1~)=5G- zmwv<5DF7aLgW^)fE@3vJOuRU`EF1qJ-tN1RWBG|sqb`oV_ldKJWAVR6l%DXT+0S=M zEG+PTV76hVOBF!~djeKsr?Wu(J2$Zp?~j&b%H*5lMLBwu7(j+W%<8aCq@NutEW&8I z9@*I^J#w|ry6KXX>}98|s?)BTVvA{jnD`6Rce!{H` zbYRsNF)A!I8twALud`-)zWC6?N@A_t^8$L!bVs!52}{H0@4u)$Rr>`gPfr8o4uUA> zVo$rq`eAx)iQd7wtRA;vvp3p6+M^!0>`2LWDq7JTg^nnQdO#qct70dfh@)YEJcdXX zxSu|c?I%W2XA19$rF>>3pb9*S$JSo07-&Y^H?N!dD3`M-weq|7j>B&eMw4s(jwQi{ z+p~BmFmI=^Z9!)JoNZ#=P<1`}GIOf49?S%9%evY@f!V^h*Qtce*sD9s0uaQ5W4$KV zo?p0D+i!JkySB^G+)ofp$H3ooxBuV*^S{aMYac+sgntZ({rXGv_!xZdPX|Zrcls!3 zv`S+&FaklI)NUPD#FC_%SEb@|cy7W6W6br>zZo-#jhuB#Gu(#18Ja6qex%&^-Gf9u zuz|rJfnHn@7C#LZMcVka#RkZjDxj2ltj7u@ru5D8<9o0YM9!1I z$SLpi{nyT&WqSt625-KQ$9B{-4cpavSH?9Bg*LEpz?c&Cy|uyFp{XE{6HDD4GT(O>X-Y5is2Tj6huV1aS#HENwVI=9 z_1LllpppGL=Ox&F2f#BBEw<>*Lv}*Ekb(~DrDUFMCNv#wet}uj1q&TgH2*e$VCg2` z9~S>6phfid95QI(<3QZ4Auy3xdIi~>69&Yd)7_XBNqSKYL%bc#@veGV*VAMJx9#bB zy$vfBgmqHyBnepwLkFV)4BbP2&GkXA1+v}pQ@peM+pCX3ZCG+9Bxu6^u{#js@~&m) zzX<1Alp~`~TQsQV*atqjX7B|VXGxVL>=|f2a({*s)yeiLE-b;uu#1R^ysc-V&xn*o z^%#1sb$0S{Fj%vWoW+ykfTynQ2CWDJZPeld6?w_lfQn30`83Tqvt_QGBs&{eqc&HURGoTZ{~tlvA*AKP919^4)^}qROv{x`Xg9}5&Q(Nw_7CHo?%-HZ& z4~{~auRlB4K?MS^vgB)nu3`4>(tSOf1$jGAt1j72G{>jgnua4P5Mv(YbvIHkZ$%=J zQeon1o=zL(6i#p41Bt5&12qZHKXg|A(TXA=4SM4KAxixJC(?a&$q{M}!TuWkt6G!& z4QT)QfcDs*T_FwG%ymN_9l=HrCWm{l8s~G@EO+_ZNiy@Qs5hIO)s>B?aR+5a5vR zliIDgy8aIR<8?suB*Qn^kCKL0s@ziIvjm+^Z+J@Vb7v{p9ERyVR zgan*uv{K!VpO)byn(*Y^1$j2)Il)F1>@SG=U1@+a_3#u@08`ifHa7K@<6K&uj0y@z zo$H*@rZl9Y4ITvbM8_M<%ZoI=me#V0WH@w7kYld-jl5WEOej-HyBAvS=lELX%~|GVQ_*5ysH)UQ^F+tr={;tOv>vk_+op*zoZ!fG zS#O!kunmhqFuCrv!?El1N(zEr?l*^c=@~Z7`{Fvo-OJJdb&Q+)9T&-IM%ljQxLz4y{)KP%sqwYdJ{Wgmt<@bA@2 za|#yZVke=KIABg7mM$>m?PHo;MlOy9jDbol8&^Jku=4antLo3W6B~wwi`mi}f(FrU z4+2ps9r1;)Qd8+$&qXALZ*xc5?v#G3l9Q3F@#7UlcAS~ zjt45t;5HY}lNY0`FXQe*?_u&gCQoC3(Z z4ym?dG+|8d9n7OqFrqBB-PmruG#upkVc(|uE$4i6ew3ad8N8##Fs7+3yt`|f8)$G) z@W$2@we!Ph?mckXuNXyUb;?PkdGtB|lB4wvIqG*6ZEKo*)uN#+5kA%C6|VR&i9Nbhj2>8;w^j?bE!S}xOs zo=eVYcCVY8gHHgp!3id;yPp`pj}H*sQ%fl!njA-JF1FLBWkW3?i|xuy2=);iP9sVm zcsD=xZt;!ni)~7sQ?6@IKYm&CvzULgWhWZK`N33b2YRsB@IGJ1QJ&Z%gd(k@NJXr$ z{xs1+IoHTXnZ=H8kkCqqI}+)C@YIvTmpBYAAP=>Pwy0pH0DT^sPGWk=WMZ}nJ`D1N z?|+fQiG2APnYR!$hTi=+XkM|w@@K)pJt^{SlJ}=>Y3L`5%N`vNTM_=daGvxZuU7vo zod1={%Yfs?JcDe-rohBtQSeD%zE;Msa$`~Q+6~Tr~3?$<(JGC zP=T!&4e`Xd=Zt4{zKV%4i>1o4bE*&2#;35qeZn?4@SCxr{h7EIG4;=uSm~*Y(Po)* zzaYL*l~dG(122)0Cil~vdORLP6bp1}`=@NWz{`B`ld5bRfGljCS5mslp?>fAhKgrr z*BJIDhEWJ9 z)6+aJ*6v!L!6~OgB2jS>M*ygQL)_;Q7Rv6y2apzmIuMMo8wx5t*Z+%vOBmJGMx#?Y*G!f9rSLx zcPYksBiO{n5~+vZtc<;TZyot`mGxQgUFTVQZ7V(4JyHNil7eOQigg2{2w?LU%^dIO z@%o*J6V@TdXRSCX>T^GLS7e)C=pdrv49>{;hX;x#+|JxLnOfgDn06`)Rtu~RBG?fA zHA3W)1m-Qa*0M9vvLj?S>rPxvBrq&3UwM9Wsaj)fbP=!FaBZmXM6ty_OVfQ;)2EvU z#J&Urw!aV_KuY8?0+biaHNdpNlz@iEQkqY80@Xwm@N{|h_d8iXo|n&*KW+Bzg|Zxl zk0E?tX-jZDKtl~kUxCn2@&wA44dp)z82*%|V_x4>Jg?S4lL!kVkY{ld4eVKdc8d_& zWdM6>K}Lq--+Y7xzD!q$Eaw8n^-)YMe7#@r{o28=z0rmPfdOti-djAH>peXE3u2oK zFM%_U1ma;4TuYt{|Dm0<%Tu)KD9?bB2=A5{3&@_~Aj+TBUHjN^CLD7Db?-*O zv8qbey0@xwNpiTsevXCGVa^;-HQCgn6oQT|6kKSYIc6g1_QbSq7_c(3ve z2O|QqCZnEr8^|mI9y&Om#5M`W?JW4YSn@TTJQ~aV@GaP~vs6pbPI$0RAKF_uuuzj> zJeQmP{zdtf#vRs_Yi`x+42t={q5|NUV!}Y&(2C!PCEviw0g1J3HHpq$#Rua;%$Z}i z74{-bVpddBUtJrs%8Tzkb5bu$2YS)@NSm05@Fx;Sw}AnwEF$_~?xQeoN|pFUE#Uo} zz3GQ)^Oie_?NNoZm^!?>N@9~o$y=#z-{9wuK|GM?k*9b_aEAp@aCsC-{{<<_=6Hg1 zeF`hs)?yEy<;T$ztQ!SO!p6`lV)mZR#rcK7eaP0!`MiEDeMGa zcNy$so+!Cr$Zy_KGX9Z2%4Fa3LCsesN+;i%#cgkYVFkZ#x@Hf}oW3HIPld`wYRC=X zZ9&;!VYlhQVaCU1!bq(65OIt+yTwSS#%=TAJTnhhQ(4GI7Q6^sFGCLm!(Iaa{~V^b z{*`5xxf`@wpx)5(8o3VWykMUM1_yn$zJ4&e8s|QuY1*baeOoWh@!BSdt>+ChdU6H7yqzSYg3(lU)Ks$<--7Fi6mDUP0t8XajcHL6^Azbdxy$hc2 zYMfHB)u4!=2k(}dSf)kL6UjIwOnXEJ`xj*W+Fa3=-20q3t18-%vhml-7^7p5sTl|D z?Ir3Cw|36iG|0-3!`Q`O%wFL2VL-Q!;c%E=`3rK?J@XYV3!_Lp)KIGRa!|{Fop4-J zjHQ%rEXA&A&5Bcf(@ZjqiQ{h99A5=rT4WP=#QU#Mrk}~=xId8kG>d{u^PHLLqlLF= zCD20=(bjN=$c@T6NvL`0zT`Rj^42t`h)f#zWS&zizywK&>xbzhJa3>E(BL`HIwSTC zXj&PQ&%ZUWx>bAG*4~W0nEik_^`>>YFCJ&m8FDC z%{Lu;HMXerQvUg^Rmn#_9_U9on;#r(JnKxq0l34|iXIYZS4g(g6#Ql_F_yTycs`t~ zOjoK>ZnH&;Jd6JelJw!Wt@Z4kr$~)Y`QEj!xLYP&UC+$5B}=(#J-Ys8iRy{H>NY>GWfyvPGyfIZ(Iks5Fm;EfW0X+BZUabaUVo+M+j$-o|NSehKzRMNnlfH9J&%Ef(OSfd((sI&s=E`wTKR!o-HL zcr5sK6K<%-Ia?Je_vB<4dX@W3g54hx}vk#zByw zcRzmIBp)9Tn?J2$$+PDmF#I8ppnQMCv4PlhfTgK4Z>eaX~#as75``7nEOz`WH>o#G@ z#IYGB5dJ_Nc5K&TLN@;R1p(o6D;TC7?neVQ4aV697i@cdjvT?0&lZTcaZS-4!x(e4 z5XYPh7w6PCD;bn8{In>277{4gd%-9|u2E0pxcpnyi%;cdlVJ9b0E<|F#sYgx&G^e` zPwrllfJkB<%FmqD<=+x)pRc){8-JLYBc4ck9Xr!-fLNHeB(>AFZ~1Ndw~&LqI`Rix z$Hl_AW*|lnU{o%DVZ&?F>8sTJ$E@;wSYnrTU$opx3{PwCI_gb-`Ez{b23UJy+%+8F z#OpvNh;x!j0*PHT_cVd&nBIscR@#j@=lXK^UR|x<#GwW!O4zbG3E}oU_pVw^j1Yzg zhRVUSe-lL#F+g0!3wG%nZw>#ctzB%1CQ#muM8ww@m{(UkAU!cdTnIaVYsY~n^mRvB zjW)-fgQ~FGOC`Wn02Yf&nzbqFg1>NQTwn!K>Rz|4p>a1HN=WoNl2f3Zz&AZSoD%)E z`>1Ux1kbPo{sVgao8S^k!cTmsDCHUgDYRkYTs{n8lA#hMZnm@$9XF=S(z%$hrh+ea zsL|*YZl}T1LwZ-0*IY9;_;9kf2Dq@f1TWaI&J*F09x@bfp`Qw1wcuVz|n(ct}LaL8e0E?r?e^wPHd2c49i1orOpu(ENCUw`SKK^*eR^M*JZ#@y#~tDuhMoO z)_OHqS3|2Z>C*FRM(nM_Po6sFqBW&)eA$mdi`j|d@4LIEMTUXoR;tH+QC)DfNQtqDz90m@$ixDp!cII#KORtmIXr+Gi*ztkzh?;a zIW%}mdp&XVdENfz9ToiwFM>}FxuCwT*_kn>TYFE3x?eYCLZ(KsWIBPPRfz=5hW;BYwyc(OyA8`}$!jkqIj0r#iqwNEn z=?KrcxLT1)Z`s~KS>R4ymetE%2@Z6w6Zu{!Nbn2;r$L=jyU+qW3(k!Ajc)`}o$0$- zzBFhzT$BUvf=&_ShdbgNI*D!%A1Y2c4jWY<4TBwZM-b*~#nj~Qtl-CxoUL;_)le`c zbWpKgAN8}SjUWO#98EfJC)x!PWKb1tg;&4)JU3&ny3_tKqJB2`dj0bDHU9fttrJ%Z z(tLq2Hg5+NCk5&xV;E!RiL%hAU#%}o#)dxr8ZS2!5Y*1AywbnH?5uWN_%Z32Vu3t? z{DzbVQ*J)O9H-^C!enPdNGOwb-xigzW*h1EmCUd4#L1CVy5jsKu?QCK;=e(nx^iM> zs~)%R4<)EIDSsDx{}9i}$-k)onE19c$Ly`0_=e*vo8}q3Dz@<+ECiMd#EjJqhK*@O~Um zU5x7jdP;VI&7#_(Gc_@ti1X&8*xhDMx$Xj6lyQOA%i$klSj^IoVr-9ltmA<~R|*Ov zftkcHecUJB4LkE2?Y5$bG&Y74PYrx6wuf1m`!obWB;+h@++6A!9PghNODJ+0mOqk5 z9NVf*(!OD=IH~v==fuhT4F&@Znz>f^GfVnhol!m=r+f?ODX?gl&_T(#U`f8u& zs-#Uq?sihI?Xz8t&r&}My+KtRx7D$OFV68~P1xtM*>Dhg_wuAUSRL1mi;u|@Xyg+$ zG$WRJ3+ivMd2!JB{1xuHRtEgNGd-130_>H)15nBXMPm;!U9*=`p+a@$Y3ebGB*bZ= z(e+}ds~aoJ&Jw0#6>y#ogLhrl+Z$YwS^6^m4%z^OB%`>hm~O%b?8&Ixs3jeyN%AUO zcGBM!XFSg)&g7OfF*H+)$vvvF_ClHXr+sK45YdnDOKe@aAWdtt5||1;2*k4)DodHo z!hp@=GcEW9@ovawSa`68`x>*%`lBb?zV3lug)x!i^w&%i@)G?=6nMruepxe|f(P=N zFldz)C!I=CUU-#z{Z(2?SXBkFa%IXXe&!S|;)Vug17at1YkHB?e%zoX&v+>r=m%K- zVH8`Bwz4JbB<@41@$k)%Yp4+ALRJ4lL>dOLEUJgSV9hKUCDEv9<1X4eJn2 zzAN6StMX!Hl*H@}?%@L&+LD_cJDlbT0DfUfDe+`G1Q~~+93KwI1d9}excQWRb(D6u zks(HI%&h8gtHKAfsm7Rtp*6_@Zwu3uoN@0}{0H|5;F18Ut0K$bqs5_`{8>wMB=a+= z?Nv{P*~pN2)XL~;u9pj)cKzUHC^5d_nECQXzaOD4n#b=*@Ik8wp%lxpcBS#KU~0)Z z1bM^gMbVZrS}#MjRRv*`vU$Wrp32^CHPhr?_exp)W{ zgGin1$lKl&mQWpaB}%Z_6+0_=q1hqsRdCL?OIIGg8!}i(7rUx(F9VX3gaLKKwwExW zN?16Oqb=61k3M*8coFCTPxG8d7prfD=HN3HHP|1VBQ*6@5&|BBSFKMNzYPA!6HBgq z4wR5*e<#YIsU>-TkTWZRHlA-7&RqRmPJX$;W58CfJOo4i?mZfd>h-tZwr@$z^>cyL z1G6Uou)JW{CTv?ZmU)Pjjol~%y6j~-2`YA44sveeS!&w4vPMzQJ=2F=_;vhSKv5n!S->{uU~rOzaJ(?;Tq{voe;L?>WeU&iPdV8e z4>O%PD5i1ho6BbPfFwImAV@aDwi($1R8!;@Kkt;C5JKtnf}O!A0PrZjJ1_s@=Jl<=y3NqjjQmhrU#oUzb(h zP%Ln?jRmU@3YKCW`T+QOiIX6Zh@~Nksuc6@T~LWB$MC!MCMm`r(j%g!YuSUHg#^Ug zBiw^S$u6M=OJbTwg&8gcash$qow$LGK~6|ga17UnU!cN94AP##)o^A?KTD&hJ^ifn z-Res7bqooI7{?bOhT>MaPHQf`Ao#+Lx^whM^nNgiaXzk+5aB+Fbxx4pw#jYr=@Ynh z|C1=|>_`44v64xTKfkB!O?vXY`;wR0K991m_|yPwXNdu&D1D_rr#P?ZDW_gqJ?fC%%5aSiJZCd{iLf_zi06r|CC2^u1Tas|A0!Kf_8)h|56sjfL&_1*!c|2ZA$* zZ^;fk58y+%nHAA#Y|KM|8iL|0CM?(3p*B~yA~M_Ls$nI4=-snJk_B4M3X98@HlbWc zY}=rngwFsk7;xqLH7ts4MaOtX)XCZe|2;Ha=>w||r!N-Ni9P!YA4&us^a~eR4lEB?D;uVTDGtUvg@mJfc?l&UUHJu0Kx_X8@s*=4S)#s zAFv);|M2>G1;~jMmnoK@w&Kyx0m%A`o?};H&C2fH6*f~jM9N<+-|ak>1UWa9SDW&< zTwN5h>F!V*4_mc$-mVrRTzWnBfx4Ui7kx*W6cR@IXW literal 0 HcmV?d00001 diff --git a/OCP_equation.png b/OCP_equation.png deleted file mode 100644 index 61d04e57b52a41c884dfe2139e375c76d48830d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 315439 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 hVlv5@Rtv2Zc-Y&%;8r9f)we*u%WB%H1 tuple: nlp.stochastic_variables.node_index = k s_array = v_array[offset : offset + nstochastic].reshape( (nlp.stochastic_variables.shape, -1), order="F" - ) # @pariterre "F" seems like an interpolation? + ) for key in nlp.stochastic_variables: data_stochastic_variables[p_idx][key][:, k : k + 1] = s_array[ nlp.stochastic_variables[key].index, :