@@ -80,8 +80,8 @@ def stochastic_forward_dynamics(
8080 motor_noise = 0
8181 sensory_noise = 0
8282 if with_noise :
83- motor_noise = nlp .model . motor_noise_sym_mx
84- sensory_noise = nlp .model . sensory_noise_sym_mx
83+ motor_noise = nlp .parameters [ "motor_noise" ]. mx
84+ sensory_noise = nlp .parameters [ "sensory_noise" ]. mx
8585
8686 mus_excitations_fb = mus_excitations
8787 noise_torque = np .zeros (nlp .model .motor_noise_magnitude .shape )
@@ -156,20 +156,20 @@ def configure_stochastic_optimal_control_problem(ocp: OptimalControlProgram, nlp
156156 dyn_func = lambda time , states , controls , parameters , algebraic_states , nlp : nlp .dynamics_type .dynamic_function (
157157 time , states , controls , parameters , algebraic_states , nlp , with_noise = True
158158 ),
159- allow_free_variables = True ,
160159 )
161160
162161
163162def minimize_uncertainty (controllers : list [PenaltyController ], key : str ) -> cas .MX :
164163 """
165164 Minimize the uncertainty (covariance matrix) of the states.
166165 """
167- dt = controllers [0 ].dt
166+ dt = controllers [0 ].dt . cx
168167 out = 0
169168 for i , ctrl in enumerate (controllers ):
170169 cov_matrix = StochasticBioModel .reshape_to_matrix (ctrl .integrated_values ["cov" ].cx , ctrl .model .matrix_shape_cov )
171170 p_partial = cov_matrix [ctrl .states [key ].index , ctrl .states [key ].index ]
172171 out += cas .trace (p_partial ) * dt
172+
173173 return out
174174
175175
@@ -184,68 +184,48 @@ def get_cov_mat(nlp, node_index):
184184 m_matrix = StochasticBioModel .reshape_to_matrix (nlp .algebraic_states ["m" ].cx , nlp .model .matrix_shape_m )
185185
186186 CX_eye = cas .SX_eye if nlp .cx == cas .SX else cas .MX_eye
187- sigma_w = cas .vertcat (nlp .model .sensory_noise_sym , nlp .model .motor_noise_sym ) * CX_eye (6 )
187+ sensory_noise = nlp .parameters ["sensory_noise" ].cx
188+ motor_noise = nlp .parameters ["motor_noise" ].cx
189+ sigma_w = cas .vertcat (sensory_noise , motor_noise ) * CX_eye (6 )
188190 cov_sym = cas .MX .sym ("cov" , nlp .integrated_values .cx .shape [0 ])
189191 cov_matrix = StochasticBioModel .reshape_to_matrix (cov_sym , nlp .model .matrix_shape_cov )
190192
191193 dx = stochastic_forward_dynamics (
192194 nlp .states .mx ,
193195 nlp .controls .mx ,
194- nlp .parameters ,
196+ nlp .parameters . mx ,
195197 nlp .algebraic_states .mx ,
196198 nlp ,
197199 force_field_magnitude = nlp .model .force_field_magnitude ,
198200 with_noise = True ,
199201 )
200202
201203 dx .dxdt = cas .Function (
202- "tp" ,
203- [
204- nlp .states .mx ,
205- nlp .controls .mx ,
206- nlp .parameters ,
207- nlp .algebraic_states .mx ,
208- nlp .model .sensory_noise_sym_mx ,
209- nlp .model .motor_noise_sym_mx ,
210- ],
211- [dx .dxdt ],
212- )(
213- nlp .states .cx ,
214- nlp .controls .cx ,
215- nlp .parameters ,
216- nlp .algebraic_states .cx ,
217- nlp .model .sensory_noise_sym ,
218- nlp .model .motor_noise_sym ,
219- )
204+ "tp" , [nlp .states .mx , nlp .controls .mx , nlp .parameters .mx , nlp .algebraic_states .mx ], [dx .dxdt ]
205+ )(nlp .states .cx , nlp .controls .cx , nlp .parameters .cx , nlp .algebraic_states .cx )
220206
221- ddx_dwm = cas .jacobian (dx .dxdt , cas .vertcat (nlp . model . sensory_noise_sym , nlp . model . motor_noise_sym ))
207+ ddx_dwm = cas .jacobian (dx .dxdt , cas .vertcat (sensory_noise , motor_noise ))
222208 dg_dw = - ddx_dwm * dt
223209 ddx_dx = cas .jacobian (dx .dxdt , nlp .states .cx )
224210 dg_dx = - (ddx_dx * dt / 2 + CX_eye (ddx_dx .shape [0 ]))
225211
226212 p_next = m_matrix @ (dg_dx @ cov_matrix @ dg_dx .T + dg_dw @ sigma_w @ dg_dw .T ) @ m_matrix .T
213+
214+ parameters = nlp .parameters .cx
215+ parameters [nlp .parameters ["sensory_noise" ].index ] = nlp .model .sensory_noise_magnitude
216+ parameters [nlp .parameters ["motor_noise" ].index ] = nlp .model .motor_noise_magnitude
217+
227218 func_eval = cas .Function (
228219 "p_next" ,
229- [
230- dt ,
231- nlp .states .cx ,
232- nlp .controls .cx ,
233- nlp .parameters ,
234- nlp .algebraic_states .cx ,
235- cov_sym ,
236- nlp .model .motor_noise_sym ,
237- nlp .model .sensory_noise_sym ,
238- ],
220+ [dt , nlp .states .cx , nlp .controls .cx , nlp .parameters .cx , nlp .algebraic_states .cx , cov_sym ],
239221 [p_next ],
240222 )(
241223 nlp .dt ,
242224 nlp .states .cx ,
243225 nlp .controls .cx ,
244- nlp . parameters ,
226+ parameters ,
245227 nlp .algebraic_states .cx ,
246228 nlp .integrated_values ["cov" ].cx ,
247- nlp .model .motor_noise_magnitude ,
248- nlp .model .sensory_noise_magnitude ,
249229 )
250230 p_vector = StochasticBioModel .reshape_to_vector (func_eval )
251231 return p_vector
@@ -404,7 +384,6 @@ def prepare_socp(
404384 sensory_noise_magnitude = sensory_noise_magnitude ,
405385 motor_noise_magnitude = motor_noise_magnitude ,
406386 sensory_reference = sensory_reference ,
407- use_sx = use_sx ,
408387 )
409388 bio_model .force_field_magnitude = force_field_magnitude
410389
@@ -587,7 +566,7 @@ def prepare_socp(
587566 max_bound = stochastic_max [curent_index : curent_index + n_states * n_states , :],
588567 )
589568
590- integrated_value_functions = {"cov" : lambda nlp , node_index : get_cov_mat ( nlp , node_index ) }
569+ integrated_value_functions = {"cov" : get_cov_mat }
591570
592571 return StochasticOptimalControlProgram (
593572 bio_model ,
@@ -722,8 +701,6 @@ def main():
722701 parameters = socp .nlp [0 ].parameters .cx
723702 algebraic_states = socp .nlp [0 ].algebraic_states .cx
724703 nlp = socp .nlp [0 ]
725- motor_noise_sym = cas .MX .sym ("motor_noise" , 2 , 1 )
726- sensory_noise_sym = cas .MX .sym ("sensory_noise" , 4 , 1 )
727704 out = stochastic_forward_dynamics (
728705 states ,
729706 controls ,
@@ -733,11 +710,7 @@ def main():
733710 force_field_magnitude = force_field_magnitude ,
734711 with_noise = True ,
735712 )
736- dyn_fun = cas .Function (
737- "dyn_fun" ,
738- [states , controls , parameters , algebraic_states , motor_noise_sym , sensory_noise_sym ],
739- [out .dxdt ],
740- )
713+ dyn_fun = cas .Function ("dyn_fun" , [states , controls , parameters , algebraic_states ], [out .dxdt ])
741714
742715 fig , axs = plt .subplots (3 , 2 )
743716 n_simulations = 30
0 commit comments