
    sg                        d Z ddlZddlZddlmZ ddlmZmZmZ ddl	m
Z
 ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZmZmZ ddlmZ ddlmZmZmZmZmZm Z m!Z!m"Z" ddl#m$Z$m%Z%m&Z& ddl'm(Z( ddl)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4  G d d      Z5 G d d      Z6ejn                  jq                  de%g       G d d             Z9ejn                  jq                  de% ee!e"eeeee       fg       G d d             Z:ejn                  jq                  de% ee!e"eeeee       fg       G d  d!             Z; G d" d#      Z<y)$zETests for the ``sympy.physics.biomechanics.musculotendon.py`` module.    N)UnevaluatedExpr)FloatIntegerRational)Symbol)exp)tanh)sqrt)sin)MutableDenseMatrixeyezeros) FirstOrderActivationDeGroote2016)CharacteristicCurveCollection"FiberForceLengthActiveDeGroote2016#FiberForceLengthPassiveDeGroote2016*FiberForceLengthPassiveInverseDeGroote2016FiberForceVelocityDeGroote2016%FiberForceVelocityInverseDeGroote2016TendonForceLengthDeGroote2016$TendonForceLengthInverseDeGroote2016)MusculotendonBaseMusculotendonDeGroote2016MusculotendonFormulation)_NamedMixin)ForceActuator)LinearPathway)ReferenceFrame)dynamicsymbols)Point)simplifyc                   \    e Zd Zed        Zed        Zed        Zed        Zed        Zy)TestMusculotendonFormulationc                  N    t        d      dk(  sJ t         j                  dk(  sJ y )Nr   )r   RIGID_TENDON     f/var/www/html/venv/lib/python3.12/site-packages/sympy/physics/biomechanics/tests/test_musculotendon.pytest_rigid_tendon_memberz5TestMusculotendonFormulation.test_rigid_tendon_member+   s)    '*a///'44999r'   c                  N    t        d      dk(  sJ t         j                  dk(  sJ y )N   )r   FIBER_LENGTH_EXPLICITr&   r'   r(   !test_fiber_length_explicit_memberz>TestMusculotendonFormulation.test_fiber_length_explicit_member0   )    '*a///'==BBBr'   c                  N    t        d      dk(  sJ t         j                  dk(  sJ y )N   )r   TENDON_FORCE_EXPLICITr&   r'   r(   !test_tendon_force_explicit_memberz>TestMusculotendonFormulation.test_tendon_force_explicit_member5   r.   r'   c                  N    t        d      dk(  sJ t         j                  dk(  sJ y )N   )r   FIBER_LENGTH_IMPLICITr&   r'   r(   !test_fiber_length_implicit_memberz>TestMusculotendonFormulation.test_fiber_length_implicit_member:   r.   r'   c                  N    t        d      dk(  sJ t         j                  dk(  sJ y )N   )r   TENDON_FORCE_IMPLICITr&   r'   r(   !test_tendon_force_implicit_memberz>TestMusculotendonFormulation.test_tendon_force_implicit_member?   r.   r'   N)	__name__
__module____qualname__staticmethodr)   r-   r2   r6   r:   r&   r'   r(   r#   r#   *   sl    : : C C C C C C C Cr'   r#   c                   <    e Zd Zed        Zed        Zed        Zy)TestMusculotendonBasec                  D    t        t        t        j                        sJ y N)
issubclassr   abcABCr&   r'   r(   test_is_abstract_base_classz1TestMusculotendonBase.test_is_abstract_base_classG   s    +SWW555r'   c                      t        t        t              sJ t        t        t              sJ t        j                  dk(  sJ y )Nr   )rC   r   r   r   r;   r&   r'   r(   
test_classz TestMusculotendonBase.test_classK   s9    +];;;+[999 ))-@@@@r'   c                  t    t        j                  t              5  t               } d d d        y # 1 sw Y   y xY wrB   )pytestraises	TypeErrorr   )_s    r(    test_cannot_instantiate_directlyz6TestMusculotendonBase.test_cannot_instantiate_directlyQ   s+    ]]9% 	$!#A	$ 	$ 	$s   .7N)r;   r<   r=   r>   rF   rH   rN   r&   r'   r(   r@   r@   E   s>    6 6 A A
 $ $r'   r@   musculotendon_concretec                   b    e Zd Z ej                  d      d        Zd Zd Zd Zd Z	d Z
d	 Zy
)TestMusculotendonRigidTendonTautousec                    d| _         t        d      | _        t        d      | _        t        d      | _        t        d      | _        | j                  j                  | j                  | j                  | j                  j                  z         t        | j                  | j                        | _        t        | j                         | _        | j                  j                  | _        | j                  j                  | _        | j                  j"                  | _        | j                  j&                  | _        | j                  j*                  | _        t.        j0                  | _        t5        d      | _        t5        d      | _        t5        d      | _        t5        d	      | _        t5        d
      | _        t5        d      | _          || j                   | j                  | j                  | j2                  | j6                  | j8                  | j:                  | j<                  | j>                  | j@                  
      | _!        d| j$                  tE        dd      tE        dd      | j                   z  z   z  z  tE        dd      tE        dd      tG        | j,                  | j                  | j                   z
  z        z  z   z  tE        dd      tE        dd      | j                   z  z   | j(                  z  tE        dd      tE        dd      tG        | j,                  | j                  | j                   z
  z        z  z
  z  z   | j                  | j                   z
  z  | _$        y )NnameNqpOpI	l_T_slackF_M_maxl_M_optv_M_max	alpha_optbetamusculotendon_dynamicstendon_slack_lengthpeak_isometric_forceoptimal_fiber_lengthmaximal_fiber_velocityoptimal_pennation_anglefiber_damping_coefficientr+   r0   r4   )%rU   r   rV   r   rW   r    origin	insertionset_posxr   pathwayr   
activation
excitationeaactivation_time_constanttau_adeactivation_time_constanttau_dsmoothing_ratebr   r%   formulationr   rZ   r[   r\   r]   r^   r_   instancer   r	   da_expr)selfrO   s     r(   #_musculotendon_rigid_tendon_fixturez@TestMusculotendonRigidTendon._musculotendon_rigid_tendon_fixtureZ   sh   	$$Dktt{{DFF46688O<$T[[$..A:499E++++__==
__??
//3@@,i(i(i(,6N	.IILLOO#'#3#3 $!%!%#'<<$(NN&*ii
 

HQNXa^DFF-BBCDq!nx1~d466466DFF?3K.LLLNA!Q!66

Bq!nx1~d466466DFF?3K.LLLNN 66DFF?r'   c                    t        | j                  d      sJ t        | j                  d      sJ | j                  j                  | j                  j                  k(  sJ t	        | j
                  g      }| j                  j                  |k(  sJ | j                  j                  |k(  sJ t        | j                  j                  t              sJ t        | j                  j                  t              sJ | j                  j                  j                  dk(  sJ | j                  j                  j                  dk(  sJ y )Nrk   
state_varsr+   r+   )hasattrrx   rk   r}   Matrixrp   
isinstanceshaperz   
x_expecteds     r(   test_state_varsz,TestMusculotendonRigidTendon.test_state_vars       t}}c***t}}l333}}$--":"::::TVVH%
}}*,,,}}'':555$--//6222$--22F;;;}}$$...}}''--777r'   c                    t        | j                  d      sJ t        | j                  d      sJ | j                  j                  | j                  j                  k(  sJ t	        | j
                  g      }| j                  j                  |k(  sJ | j                  j                  |k(  sJ t        | j                  j                  t              sJ t        | j                  j                  t              sJ | j                  j                  j                  dk(  sJ | j                  j                  j                  dk(  sJ y Nr
input_varsr~   r   rx   r   r   r   ro   r   r   rz   
r_expecteds     r(   test_input_varsz,TestMusculotendonRigidTendon.test_input_vars   r   r'   c                 ,   t        | j                  d      sJ t        | j                  d      sJ | j                  j                  | j                  j                  k(  sJ t	        g | j
                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  t        d      t        d      t        d      t        d      t        d      t        d      t        d	      t        d
      t        d      t        d      t        d      t        d      t        d      t        d      t        d      t        d      t        d      t        d      t        d      t        d      t        d      t        d            }| j                  j                  |k(  sJ | j                  j                  |k(  sJ t        | j                  j                  t              sJ t        | j                  j                  t              sJ | j                  j                  j                   dk(  sJ | j                  j                  j                   dk(  sJ y )Np	constantsc_0_fl_T_namec_1_fl_T_namec_2_fl_T_namec_3_fl_T_namec_0_fl_M_pas_namec_1_fl_M_pas_namec_0_fl_M_act_namec_1_fl_M_act_namec_2_fl_M_act_namec_3_fl_M_act_namec_4_fl_M_act_namec_5_fl_M_act_namec_6_fl_M_act_namec_7_fl_M_act_namec_8_fl_M_act_namec_9_fl_M_act_namec_10_fl_M_act_namec_11_fl_M_act_namec_0_fv_M_namec_1_fv_M_namec_2_fv_M_namec_3_fv_M_name)   r+   )r   rx   r   r   r   rZ   r[   r\   r]   r^   r_   rr   rt   rv   r   r   r   rz   
p_expecteds     r(   test_constantsz+TestMusculotendonRigidTendon.test_constants   s   t}}c***t}}k222}}$--"9"9999      	 
   		  

  

    '  '  '  '  *+  *+   *+! " *+# $ *+% & *+' ( *+) * *++ , *+- . *+/ 0 *+1 2 *+3 4 +,5 6 +,7 8 '9 : '; < '= > '? "

F }}*,,,}}&&*444$--//6222$--116:::}}$$///}}&&,,777r'   c                    t        | j                  d      sJ t        dg      }| j                  j                  |k(  sJ t	        | j                  j                  t              sJ | j                  j                  j
                  dk(  sJ y )NMr+   r~   )r   rx   r   r   r   r   rz   
M_expecteds     r(   test_Mz#TestMusculotendonRigidTendon.test_M   sk    t}}c***QC[
}}*,,,$--//6222}}$$...r'   c                 ,   t        | j                  d      sJ t        | j                  g      }| j                  j                  |k(  sJ t        | j                  j                  t              sJ | j                  j                  j                  dk(  sJ y )NFr~   )r   rx   r   ry   r   r   r   rz   
F_expecteds     r(   test_Fz#TestMusculotendonRigidTendon.test_F   sp    t}}c***T\\N+
}}*,,,$--//6222}}$$...r'   c                    t        | j                  d      sJ t        | j                  g      }| j                  j	                         }t        |t              sJ |j                  dk(  sJ t        ||z
        t        d      k(  sJ y )Nrhsr~   r+   )	r   rx   r   ry   r   r   r   r!   r   rz   rhs_expectedr   s      r(   test_rhsz%TestMusculotendonRigidTendon.test_rhs   sv    t}}e,,,t||n-mm!#v&&&yyF"""l*+uQx777r'   N)r;   r<   r=   rJ   fixturer{   r   r   r   r   r   r   r&   r'   r(   rQ   rQ   W   sA     V^^D!& "&P
8
8,8\//8r'   rQ   zmusculotendon_concrete, curve)tendon_force_lengthtendon_force_length_inversefiber_force_length_passive"fiber_force_length_passive_inversefiber_force_length_activefiber_force_velocityfiber_force_velocity_inversec                   b    e Zd Z ej                  d      d        Zd Zd Zd Zd Z	d Z
d	 Zy
)TestFiberLengthExplicitTrR   c                 |	   d| _         t        d      | _        t        d      | _        t        d      | _        t        d      | _        | j                  j                  | j                  | j                  | j                  j                  z         t        | j                  | j                        | _        t        | j                         | _        | j                  j                  | _        | j                  j                  | _        | j                  j"                  | _        | j                  j&                  | _        | j                  j*                  | _        t.        j0                  | _        t5        d      | _        t5        d      | _        t5        d      | _        t5        d	      | _        t5        d
      | _        t5        d      | _          || j                   | j                  | j                  | j2                  | j6                  | j8                  | j:                  | j<                  | j>                  | j@                  d      | _!        t        d      | _"        | j                  jF                  }| jD                  | j:                  z  }|tI        |dz  | j:                  tK        | j>                        z  dz  z
        z
  }|jL                  jO                  || j6                  z        }|jP                  jO                  | jD                        }|jR                  jO                  | jD                        }|jT                  jO                  || j8                  z  ||z
  |z  z  | j8                  z  |z
  | j                   |z  z        }	| j<                  | j:                  z  |	z  | _+        d| j$                  tY        dd      tY        dd      | j                   z  z   z  z  tY        dd      tY        dd      t[        | j,                  | j                  | j                   z
  z        z  z   z  tY        dd      tY        dd      | j                   z  z   | j(                  z  tY        dd      tY        dd      t[        | j,                  | j                  | j                   z
  z        z  z
  z  z   | j                  | j                   z
  z  | _.        y )NrU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   Tra   rb   rc   rd   re   rf   rg   with_defaultsl_M_tilde_namer0   r+   r4   )/rU   r   rV   r   rW   r    rh   ri   rj   rk   r   rl   r   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   r   r,   rw   r   rZ   r[   r\   r]   r^   r_   rx   	l_M_tildelengthr
   r   r   r   r   r   r   dl_M_tilde_exprr   r	   ry   )
rz   rO   curvel_MTl_Ml_Tfl_Tfl_M_pasfl_M_act	v_M_tildes
             r(   ,_musculotendon_fiber_length_explicit_fixturezDTestFiberLengthExplicit._musculotendon_fiber_length_explicit_fixture   s    	$$Dktt{{DFF46688O<$T[[$..A:499E++++__==
__??
//3II,i(i(i(,6N	.IILLOO#'#3#3 $!%!%#'<<$(NN&*ii
 ((89||""nnT\\)T#q&DLLT^^1D$Dq#HHII((66s4>>7IJ33AA$..Q22@@P66DDT\\!TCZ$45t||CxOffXo
	 !%T\\ 99D

HQNXa^DFF-BBCDq!nx1~d466466DFF?3K.LLLNA!Q!66

Bq!nx1~d466466DFF?3K.LLLNN 66DFF?r'   c                    t        | j                  d      sJ t        | j                  d      sJ | j                  j                  | j                  j                  k(  sJ t	        | j
                  | j                  g      }| j                  j                  |k(  sJ | j                  j                  |k(  sJ t        | j                  j                  t              sJ t        | j                  j                  t              sJ | j                  j                  j                  dk(  sJ | j                  j                  j                  dk(  sJ y Nrk   r}   r0   r+   )	r   rx   rk   r}   r   r   rp   r   r   r   s     r(   r   z'TestFiberLengthExplicit.test_state_vars-      t}}c***t}}l333}}$--":"::::T^^TVV45
}}*,,,}}'':555$--//6222$--22F;;;}}$$...}}''--777r'   c                    t        | j                  d      sJ t        | j                  d      sJ | j                  j                  | j                  j                  k(  sJ t	        | j
                  g      }| j                  j                  |k(  sJ | j                  j                  |k(  sJ t        | j                  j                  t              sJ t        | j                  j                  t              sJ | j                  j                  j                  dk(  sJ | j                  j                  j                  dk(  sJ y r   r   r   s     r(   r   z'TestFiberLengthExplicit.test_input_vars9  r   r'   c                 6   t        | j                  d      sJ t        | j                  d      sJ | j                  j                  | j                  j                  k(  sJ t	        | j
                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  g	      }| j                  j                  |k(  sJ | j                  j                  |k(  sJ t        | j                  j                  t              sJ t        | j                  j                  t              sJ | j                  j                  j                  dk(  sJ | j                  j                  j                  dk(  sJ y Nr   r   )	   r+   r   rx   r   r   r   rZ   r[   r\   r]   r^   r_   rr   rt   rv   r   r   r   s     r(   r   z&TestFiberLengthExplicit.test_constantsE  4   t}}c***t}}k222}}$--"9"9999		






 }}*,,,}}&&*444$--//6222$--116:::}}$$...}}&&,,666r'   c                    t        | j                  d      sJ t        d      }| j                  j                  |k(  sJ t	        | j                  j                  t
              sJ | j                  j                  j                  dk(  sJ y Nr   r0   )r0   r0   r   rx   r   r   r   r   r   r   s     r(   r   zTestFiberLengthExplicit.test_M]  i    t}}c***V
}}*,,,$--//6222}}$$...r'   c                 B   t        | j                  d      sJ t        | j                  | j                  g      }| j                  j
                  |k(  sJ t        | j                  j
                  t              sJ | j                  j
                  j                  dk(  sJ y Nr   r   )r   rx   r   r   ry   r   r   r   r   s     r(   r   zTestFiberLengthExplicit.test_Fd  y    t}}c***T114<<@A
}}*,,,$--//6222}}$$...r'   c                 *   t        | j                  d      sJ t        | j                  | j                  g      }| j                  j                         }t        |t              sJ |j                  dk(  sJ t        ||z
        t        dd      k(  sJ y Nr   r   r0   r+   )
r   rx   r   r   ry   r   r   r   r!   r   r   s      r(   r   z TestFiberLengthExplicit.test_rhsk      t}}e,,,t33T\\BCmm!#v&&&yyF"""l*+uQ{:::r'   N)r;   r<   r=   rJ   r   r   r   r   r   r   r   r   r&   r'   r(   r   r      s@    & V^^D!7 "7r
8
870//;r'   r   c                   b    e Zd Z ej                  d      d        Zd Zd Zd Zd Z	d Z
d	 Zy
)TestTendonForceExplicitTrR   c                 N
   d| _         t        d      | _        t        d      | _        t        d      | _        t        d      | _        | j                  j                  | j                  | j                  | j                  j                  z         t        | j                  | j                        | _        t        | j                         | _        | j                  j                  | _        | j                  j                  | _        | j                  j"                  | _        | j                  j&                  | _        | j                  j*                  | _        t.        j0                  | _        t5        d      | _        t5        d      | _        t5        d      | _        t5        d	      | _        t5        d
      | _        t5        d      | _          || j                   | j                  | j                  | j2                  | j6                  | j8                  | j:                  | j<                  | j>                  | j@                  d      | _!        t        d      | _"        |jF                  jI                  | jD                        }| j                  jJ                  }| j                  jL                  }|| j6                  z  }tO        ||z
  dz  | j:                  tQ        | j>                        z  dz  z         }|| j:                  z  }||z
  |z  }	| jD                  | j8                  z  }
|
|	z  }|| j8                  z  }|jR                  jI                  |      }|jT                  jI                  |      }||z
  | j                   |z  z  }|jV                  jI                  |      }|| j<                  z  }|||	z  z
  }|| j6                  z  }tY        d      tY        d      z  t[        tY        d      t]        |tY        d      z
        z        z  |z  | _/        d| j$                  ta        dd      ta        dd      | j                   z  z   z  z  ta        dd      ta        dd      tc        | j,                  | j                  | j                   z
  z        z  z   z  ta        dd      ta        dd      | j                   z  z   | j(                  z  ta        dd      ta        dd      tc        | j,                  | j                  | j                   z
  z        z  z
  z  z   | j                  | j                   z
  z  | _2        y )NrU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   Tr   F_T_tilde_namer0   z0.2z33.93669377311689z0.995r+   r4   )3rU   r   rV   r   rW   r    rh   ri   rj   rk   r   rl   r   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   r   r1   rw   r   rZ   r[   r\   r]   r^   r_   rx   	F_T_tilder   r   r   extension_velocityr
   r   r   r   r   r   r   r   dF_T_tilde_exprr   r	   ry   )rz   rO   r   	l_T_tilder   v_MTr   r   r   	cos_alphaF_TF_M	F_M_tilder   r   fv_Mr   v_Mv_T	v_T_tildes                       r(   ,_musculotendon_tendon_force_explicit_fixturezDTestTendonForceExplicit._musculotendon_tendon_force_explicit_fixture  s    	$$Dktt{{DFF46688O<$T[[$..A:499E++++__==
__??
//3II,i(i(i(,6N	.IILLOO#'#3#3 $!%!%#'<<$(NN&*ii
 ((8955CCDNNS	||""||..&D3J?dll3t~~3F&F%JJK$	CZ$	nnT\\))m$	33AA)L22@@KH$tvvh766DDTJ	$S]"&	%L233C)*?9uW~;U+VV5  	 

HQNXa^DFF-BBCDq!nx1~d466466DFF?3K.LLLNA!Q!66

Bq!nx1~d466466DFF?3K.LLLNN 66DFF?r'   c                    t        | j                  d      sJ t        | j                  d      sJ | j                  j                  | j                  j                  k(  sJ t	        | j
                  | j                  g      }| j                  j                  |k(  sJ | j                  j                  |k(  sJ t        | j                  j                  t              sJ t        | j                  j                  t              sJ | j                  j                  j                  dk(  sJ | j                  j                  j                  dk(  sJ y r   )	r   rx   rk   r}   r   r   rp   r   r   r   s     r(   r   z'TestTendonForceExplicit.test_state_vars  r   r'   c                    t        | j                  d      sJ t        | j                  d      sJ | j                  j                  | j                  j                  k(  sJ t	        | j
                  g      }| j                  j                  |k(  sJ | j                  j                  |k(  sJ t        | j                  j                  t              sJ t        | j                  j                  t              sJ | j                  j                  j                  dk(  sJ | j                  j                  j                  dk(  sJ y r   r   r   s     r(   r   z'TestTendonForceExplicit.test_input_vars  r   r'   c                 6   t        | j                  d      sJ t        | j                  d      sJ | j                  j                  | j                  j                  k(  sJ t	        | j
                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  g	      }| j                  j                  |k(  sJ | j                  j                  |k(  sJ t        | j                  j                  t              sJ t        | j                  j                  t              sJ | j                  j                  j                  dk(  sJ | j                  j                  j                  dk(  sJ y r   r   r   s     r(   r   z&TestTendonForceExplicit.test_constants  r   r'   c                    t        | j                  d      sJ t        d      }| j                  j                  |k(  sJ t	        | j                  j                  t
              sJ | j                  j                  j                  dk(  sJ y r   r   r   s     r(   r   zTestTendonForceExplicit.test_M  r   r'   c                 B   t        | j                  d      sJ t        | j                  | j                  g      }| j                  j
                  |k(  sJ t        | j                  j
                  t              sJ | j                  j
                  j                  dk(  sJ y r   )r   rx   r   r   ry   r   r   r   r   s     r(   r   zTestTendonForceExplicit.test_F  r   r'   c                 *   t        | j                  d      sJ t        | j                  | j                  g      }| j                  j                         }t        |t              sJ |j                  dk(  sJ t        ||z
        t        dd      k(  sJ y r   )
r   rx   r   r   ry   r   r   r   r!   r   r   s      r(   r   z TestTendonForceExplicit.test_rhs
  r   r'   N)r;   r<   r=   rJ   r   r   r   r   r   r   r   r   r&   r'   r(   r   r   t  sB    & V^^D!B "BH
8
870//;r'   r   c                      e Zd Zed        Zed        Z ej                  d      d        Zd Z	ej                  j                  dd ed	      f ed
       ed
      f edd       edd      f ed       ed      fg      d        Zej                  j                  dd ed      f ed       ed      f ed       ed      f ed       ed      fg      d        Zej                  j                  dd ed      f ed       ed      f edd       edd      f ed       ed      fg      d        Zej                  j                  dd ed      f ed       ed      f ed       ed      f ed       ed      fg      d        Zej                  j                  dd ed       f ed!       ed!      f ed"       ed"      f ed#       ed#      fg      d$        Zej                  j                  d%d ed&      f ed'       ed'      f ed"       ed"      f edd       edd      f ed#       ed#      fg      d(        Zd) Zd* Zd+ Zd, Zd- Zy).TestMusculotendonDeGroote2016c                      t        t        t              sJ t        t        t              sJ t        j                  dk(  sJ y )Nr   )rC   r   r   r   r;   r&   r'   r(   rH   z(TestMusculotendonDeGroote2016.test_class  s9    3]CCC3[AAA(115PPPPr'   c                     t        d      } t        d      }|j                  | t        d      t        d      j                  z         t        | |      }t        d      }t        d      }t        d      }t        d      }t        d	      }t        d
      }t        d      }	t        d||t        j                  ||||||	
      }
t        |
t              sJ y )NrX   rY   rW   rV   rU   rZ   r[   r\   r]   r^   r_   r`   )r    rj   r   r   rk   r   r   r   r   r   r%   r   )rh   ri   rl   rm   rZ   r[   r\   r]   r^   r_   rx   s              r(   test_instancez+TestMusculotendonDeGroote2016.test_instance  s    t$K	&."5nS6I6K6K"KL	25f=
;'	###;'	f~,#;#H#H )!(!(#*$-&*
 ($=>>>r'   TrR   c                 ^   d| _         t        d      | _        t        d      | _        t        d      | _        t        d      | _        | j                  j                  | j                  | j                  | j                  j                  z         t        | j                  | j                        | _        t        | j                         | _        t        d      | _        t        d      | _        t        d      | _        t        d	      | _        t        d
      | _        t        d      | _        y )NrU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   )rU   r   rV   r   rW   r    rh   ri   rj   rk   r   rl   r   rm   r   rZ   r[   r\   r]   r^   r_   )rz   s    r(   _musculotendon_fixturez4TestMusculotendonDeGroote2016._musculotendon_fixture6  s    	$$Dktt{{DFF46688O<$T[[$..A:499E,i(i(i(,6N	r'   c           	      d   t        d      }t        d      }|j                  |t        d      t        d      j                  z         t        ||      }t        d      }t        d      }t        d      }t        d      }t        d	      }t        d
      }	t        d      }
t        j                  d||t        j                  |||      }|j                  |k(  sJ |j                  |k(  sJ |j                  |k(  sJ |j                   |k(  sJ |j"                  |	k(  sJ |j$                  |
k(  sJ y )NrX   rY   rW   rV   rU   rZ   r[   r\   10.0z0.00.1)ra   rb   rc   rd   )r    rj   r   r   rk   r   r   r   r   r   r   r   r%   rb   rc   rd   re   rf   rg   )rz   rh   ri   rl   rm   rZ   r[   r\   r]   r^   r_   rx   s               r(   test_with_defaultsz0TestMusculotendonDeGroote2016.test_with_defaultsG  s-   t$K	&."5nS6I6K6K"KL	25f=
;'	##-%L	U|,::#;#H#H )!(!(
 ++y888,,777,,777..'999//9<<<11T999r'   zl_T_slack, expectedNl_T_slack_namerZ   r+   r0   z0.5c                 .   t        | j                  | j                  | j                  t        j
                  || j                  | j                  | j                  | j                  | j                  
      }|j                  |k(  sJ |j                  |k(  sJ y Nr`   )r   rU   rl   rm   r   r%   r[   r\   r]   r^   r_   rZ   rb   )rz   rZ   expectedrx   s       r(   test_tendon_slack_lengthz6TestMusculotendonDeGroote2016.test_tendon_slack_lengthc  s|     -IILLOO#;#H#H )!%!%#'<<$(NN&*ii
 !!X---++x777r'   zF_M_max, expectedF_M_max_namer[   i  z1000.0c                 .   t        | j                  | j                  | j                  t        j
                  | j                  || j                  | j                  | j                  | j                  
      }|j                  |k(  sJ |j                  |k(  sJ y r  )r   rU   rl   rm   r   r%   rZ   r\   r]   r^   r_   r[   rc   )rz   r[   r  rx   s       r(   test_peak_isometric_forcez7TestMusculotendonDeGroote2016.test_peak_isometric_force|  s|     -IILLOO#;#H#H $!(!%#'<<$(NN&*ii
 8+++,,888r'   zl_M_opt, expectedl_M_opt_namer\   c                 .   t        | j                  | j                  | j                  t        j
                  | j                  | j                  || j                  | j                  | j                  
      }|j                  |k(  sJ |j                  |k(  sJ y r  )r   rU   rl   rm   r   r%   rZ   r[   r]   r^   r_   r\   rd   )rz   r\   r  rx   s       r(   test_optimal_fiber_lengthz7TestMusculotendonDeGroote2016.test_optimal_fiber_length  s|     -IILLOO#;#H#H $!%!(#'<<$(NN&*ii
 8+++,,888r'   zv_M_max, expectedv_M_max_namer]   
   r	  c                 .   t        | j                  | j                  | j                  t        j
                  | j                  | j                  | j                  || j                  | j                  
      }|j                  |k(  sJ |j                  |k(  sJ y r  )r   rU   rl   rm   r   r%   rZ   r[   r\   r^   r_   r]   re   )rz   r]   r  rx   s       r(   test_maximal_fiber_velocityz9TestMusculotendonDeGroote2016.test_maximal_fiber_velocity  s|     -IILLOO#;#H#H $!%!%#*$(NN&*ii
 8+++..(:::r'   zalpha_opt, expectedalpha_opt_namer^   r   r
  c                 .   t        | j                  | j                  | j                  t        j
                  | j                  | j                  | j                  | j                  || j                  
      }|j                  |k(  sJ |j                  |k(  sJ y r  )r   rU   rl   rm   r   r%   rZ   r[   r\   r]   r_   r^   rf   )rz   r^   r  rx   s       r(   test_optimal_pennation_anglez:TestMusculotendonDeGroote2016.test_optimal_pennation_angle  s|     -IILLOO#;#H#H $!%!%#'<<$-&*ii
 !!X---//8;;;r'   zbeta, expected	beta_namer_   c                 .   t        | j                  | j                  | j                  t        j
                  | j                  | j                  | j                  | j                  | j                  |
      }|j                  |k(  sJ |j                  |k(  sJ y r  )r   rU   rl   rm   r   r%   rZ   r[   r\   r]   r^   r_   rg   )rz   r_   r  rx   s       r(   test_fiber_damping_coefficientz<TestMusculotendonDeGroote2016.test_fiber_damping_coefficient  sz     -IILLOO#;#H#H $!%!%#'<<$(NN&*
 }}(((11X===r'   c                     t        | j                  | j                  | j                        }t	        |d      sJ t	        |d      sJ t        d      }|j                  |k(  sJ |j                  |k(  sJ |j                  |j                  u sJ y )Nro   rn   e_name)r   rU   rl   rm   r   r   ro   rn   )rz   rx   
e_expecteds      r(   test_excitationz-TestMusculotendonDeGroote2016.test_excitation  s    ,IILLOO

 x%%%x...#H-
zzZ'''""j000zzX00000r'   c                 .   t        | j                  | j                  | j                        }t	        j
                  t              5  d |_        d d d        t	        j
                  t              5  d |_        d d d        y # 1 sw Y   3xY w# 1 sw Y   y xY wrB   )	r   rU   rl   rm   rJ   rK   AttributeErrorro   rn   rz   rx   s     r(   test_excitation_is_immutablez:TestMusculotendonDeGroote2016.test_excitation_is_immutable  y    ,IILLOO

 ]]>* 	HJ	]]>* 	'"&H	' 	'	 		' 	'   A?.B?BBc                     t        | j                  | j                  | j                        }t	        |d      sJ t	        |d      sJ t        d      }|j                  |k(  sJ |j                  |k(  sJ y )Nrp   rm   a_name)r   rU   rl   rm   r   r   rp   )rz   rx   
a_expecteds      r(   test_activationz-TestMusculotendonDeGroote2016.test_activation  ss    ,IILLOO

 x%%%x...#H-
zzZ'''""j000r'   c                 .   t        | j                  | j                  | j                        }t	        j
                  t              5  d |_        d d d        t	        j
                  t              5  d |_        d d d        y # 1 sw Y   3xY w# 1 sw Y   y xY wrB   )r   rU   rl   rm   rJ   rK   r&  rp   r'  s     r(   test_activation_is_immutablez:TestMusculotendonDeGroote2016.test_activation_is_immutable  r)  r*  c                 "   t        | j                  | j                  | j                  t        j
                  | j                  | j                  | j                  | j                  | j                  | j                  
      }d}t        |      |k(  sJ y )Nr`   a  MusculotendonDeGroote2016('name', pathway=LinearPathway(pO, pI), activation_dynamics=FirstOrderActivationDeGroote2016('name', activation_time_constant=tau_a_name, deactivation_time_constant=tau_d_name, smoothing_rate=b_name), musculotendon_dynamics=0, tendon_slack_length=l_T_slack, peak_isometric_force=F_M_max, optimal_fiber_length=l_M_opt, maximal_fiber_velocity=v_M_max, optimal_pennation_angle=alpha_opt, fiber_damping_coefficient=beta))r   rU   rl   rm   r   r%   rZ   r[   r\   r]   r^   r_   repr)rz   rx   r  s      r(   	test_reprz'TestMusculotendonDeGroote2016.test_repr)  sr    ,IILLOO#;#H#H $!%!%#'<<$(NN&*ii
. 	 H~)))r'   )r;   r<   r=   r>   rH   r  rJ   r   r  r  markparametrizer   r   r   r  r   r  r  r  r  r   r$  r(  r.  r0  r3  r&   r'   r(   r  r    s   Q Q
 ? ?4 V^^D!# "# :8 [[6*+,K &"56a^Xa^,5\5<(		
88  [[6.)*Iy 12T]GDM*8_eHo.		
99  [[6.)*Iy 12a^Xa^,5\5<(		
99  [[6.)*Iy 12R['"+&6]E&M*		
;;  [[6*+,K &"56QZ$5\5<(		
<<  [[6+&'F^VF^,QZ$a_hq"o.5\5<(	
	>	> 1	'
1	'*r'   r  )=__doc__rD   rJ   sympy.core.exprr   sympy.core.numbersr   r   r   sympy.core.symbolr   &sympy.functions.elementary.exponentialr   %sympy.functions.elementary.hyperbolicr	   (sympy.functions.elementary.miscellaneousr
   (sympy.functions.elementary.trigonometricr   sympy.matrices.denser   r   r   r   %sympy.physics.biomechanics.activationr    sympy.physics.biomechanics.curver   r   r   r   r   r   r   r   (sympy.physics.biomechanics.musculotendonr   r   r   !sympy.physics.biomechanics._mixinr    sympy.physics.mechanics.actuatorr   sympy.physics.mechanics.pathwayr   sympy.physics.vector.framer   sympy.physics.vector.functionsr   sympy.physics.vector.pointr    sympy.simplify.simplifyr!   r#   r@   r4  r5  rQ   r   r   r  r&   r'   r(   <module>rI     sm   K 
  + 7 7 $ 6 6 9 8 I I	 	 	 
 : : 9 5 9 , ,C C6$ $$ 14M3NOE8 E8 PE8P # &)$A,P+N3]*L%C-R	
"@; @;#"@;F # &)$A,P+N3]*L%C-R	
"K; K;#"K;\r* r*r'   