
    g                        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j7        8                    de%g           G d d                      Z9ej7        8                    de% ee!e"eeeee           fg           G d d                      Z:ej7        8                    de% ee!e"eeeee           fg           G d  d!                      Z; G d" d#          Z<dS )$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dS )TestMusculotendonFormulationc                  T    t          d          dk    sJ t           j        dk    sJ d S )Nr   )r   RIGID_TENDON     o/var/www/html/ai-engine/env/lib/python3.11/site-packages/sympy/physics/biomechanics/tests/test_musculotendon.pytest_rigid_tendon_memberz5TestMusculotendonFormulation.test_rigid_tendon_member+   s5    '**a////'4999999r'   c                  T    t          d          dk    sJ t           j        dk    sJ d S )N   )r   FIBER_LENGTH_EXPLICITr&   r'   r(   !test_fiber_length_explicit_memberz>TestMusculotendonFormulation.test_fiber_length_explicit_member0   5    '**a////'=BBBBBBr'   c                  T    t          d          dk    sJ t           j        dk    sJ d S )N   )r   TENDON_FORCE_EXPLICITr&   r'   r(   !test_tendon_force_explicit_memberz>TestMusculotendonFormulation.test_tendon_force_explicit_member5   r.   r'   c                  T    t          d          dk    sJ t           j        dk    sJ d S )N   )r   FIBER_LENGTH_IMPLICITr&   r'   r(   !test_fiber_length_implicit_memberz>TestMusculotendonFormulation.test_fiber_length_implicit_member:   r.   r'   c                  T    t          d          dk    sJ t           j        dk    sJ d S )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#   *   s        : : \: C C \C C C \C C C \C C C \C C Cr'   r#   c                   P    e Zd Zed             Zed             Zed             ZdS )TestMusculotendonBasec                  H    t          t          t          j                  sJ d S N)
issubclassr   abcABCr&   r'   r(   test_is_abstract_base_classz1TestMusculotendonBase.test_is_abstract_base_classG   s!    +SW5555555r'   c                      t          t          t                    sJ t          t          t                    sJ t          j        dk    sJ d S )Nr   )rC   r   r   r   r;   r&   r'   r(   
test_classz TestMusculotendonBase.test_classK   sK    +];;;;;+[99999 )-@@@@@@@r'   c                      t          j        t                    5  t                      } d d d            d S # 1 swxY w Y   d S rB   )pytestraises	TypeErrorr   )_s    r(    test_cannot_instantiate_directlyz6TestMusculotendonBase.test_cannot_instantiate_directlyQ   s    ]9%% 	$ 	$!##A	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$s   6::N)r;   r<   r=   r>   rF   rH   rN   r&   r'   r(   r@   r@   E   sf        6 6 \6 A A \A
 $ $ \$ $ $r'   r@   musculotendon_concretec                   f    e Zd Z ej        d          d             Zd Zd Zd Zd Z	d Z
d	 Zd
S )TestMusculotendonRigidTendonTautousec                    d| _         t          d          | _        t          d          | _        t          d          | _        t          d          | _        | j                            | j        | j        | j        j	        z             t          | j        | j                  | _        t          | j                   | _        | j        j        | _        | j        j        | _        | j        j        | _        | j        j        | _        | j        j        | _        t.          j        | _        t5          d          | _        t5          d          | _        t5          d          | _        t5          d	          | _        t5          d
          | _        t5          d          | _          || j         | j        | j        | j        | j        | j        | 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  | _$        d S )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   s]   	$$$$Dkktt{DF468O<<<$T[$.AA:49EE++_=
_?
/3@,,i((i((i((,,6NN	..ILO#'#3 $!%!%#'<$(N&*i
 
 
 
HQNNXa^^DF-BBCDq!nnx1~~d4646DF?3K.L.LLLNA!Q!66
Bq!nnx1~~d4646DF?3K.L.LLLNN 6DF?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 d S )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33}$-":::::TVH%%
}*,,,,}':5555$-/622222$-2F;;;;;}$....}'-777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 d S 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 d S )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22}$-"99999      	 
   	  
  
    ''  ''  ''  ''  *++  *++   *++! " *++# $ *++% & *++' ( *++) * *+++ , *++- . *++/ 0 *++1 2 *++3 4 +,,5 6 +,,7 8 ''9 : ''; < ''= > ''? "
 "

F }*,,,,}&*4444$-/622222$-16:::::}$////}&,777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 d S )NMr+   r~   )r   rx   r   r   r   r   rz   
M_expecteds     r(   test_Mz#TestMusculotendonRigidTendon.test_M   st    t}c*****QC[[
}*,,,,$-/622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 d S )NFr~   )r   rx   r   ry   r   r   r   rz   
F_expecteds     r(   test_Fz#TestMusculotendonRigidTendon.test_F   sx    t}c*****T\N++
}*,,,,$-/622222}$......r'   c                 "   t          | j        d          sJ t          | j        g          }| j                                        }t          |t                    sJ |j        dk    sJ t          ||z
            t          d          k    sJ d S )Nrhsr~   r+   )	r   rx   r   ry   r   r   r   r!   r   rz   rhs_expectedr   s      r(   test_rhsz%TestMusculotendonRigidTendon.test_rhs   s    t}e,,,,,t|n--m!!#v&&&&&yF""""l*++uQxx777777r'   N)r;   r<   r=   rJ   fixturer{   r   r   r   r   r   r   r&   r'   r(   rQ   rQ   W   s         V^D!!!& & "!&P
8 
8 
8
8 
8 
8,8 ,8 ,8\/ / // / /8 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                   f    e Zd Z ej        d          d             Zd Zd Zd Zd Z	d Z
d	 Zd
S )TestFiberLengthExplicitTrR   c                 (   d| _         t          d          | _        t          d          | _        t          d          | _        t          d          | _        | j                            | j        | j        | j        j	        z             t          | j        | j                  | _        t          | j                   | _        | j        j        | _        | j        j        | _        | j        j        | _        | j        j        | _        | j        j        | _        t.          j        | _        t5          d          | _        t5          d          | _        t5          d          | _        t5          d	          | _        t5          d
          | _        t5          d          | _          || j         | j        | j        | j        | j        | j        | j        | j        | j        | j         d          | _!        t          d          | _"        | j        j#        }| j"        | j        z  }|tI          |dz  | j        tK          | j                  z  dz  z
            z
  }|j&        '                    || j        z            }|j(        '                    | j"                  }|j)        '                    | j"                  }|j*        '                    || j        z  ||z
  |z  z  | j        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  | _.        d S )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   sj    	$$$$Dkktt{DF468O<<<$T[$.AA:49EE++_=
_?
/3I,,i((i((i((,,6NN	..ILO#'#3 $!%!%#'<$(N&*i
 
 
 ((899|"nT\)T#q&DLT^1D1D$Dq#HHIII(66s4>7IJJ3AA$.QQ2@@PP6DDT\!TCZ$45t|CxOfXo
 
	 !%T\ 99D
HQNNXa^^DF-BBCDq!nnx1~~d4646DF?3K.L.LLLNA!Q!66
Bq!nnx1~~d4646DF?3K.L.LLLNN 6DF?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 d S 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33}$-":::::T^TV455
}*,,,,}':5555$-/622222$-2F;;;;;}$....}'-777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 d S r   r   r   s     r(   r   z'TestFiberLengthExplicit.test_input_vars9  r   r'   c                 L   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 d S 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  &   t}c*****t}k22222}$-"99999	



 

 }*,,,,}&*4444$-/622222$-16:::::}$....}&,666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 d S Nr   r0   )r0   r0   r   rx   r   r   r   r   r   r   s     r(   r   zTestFiberLengthExplicit.test_M]  r    t}c*****VV
}*,,,,$-/622222}$......r'   c                     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 d S Nr   r   )r   rx   r   r   ry   r   r   r   r   s     r(   r   zTestFiberLengthExplicit.test_Fd  ~    t}c*****T14<@AA
}*,,,,$-/622222}$......r'   c                 0   t          | j        d          sJ t          | j        | j        g          }| j                                        }t          |t                    sJ |j        dk    sJ t          ||z
            t          dd          k    sJ d S 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3T\BCCm!!#v&&&&&yF""""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 "!7r
8 
8 
8
8 
8 
87 7 70/ / // / /; ; ; ; ;r'   r   c                   f    e Zd Z ej        d          d             Zd Zd Zd Zd Z	d Z
d	 Zd
S )TestTendonForceExplicitTrR   c                  	   d| _         t          d          | _        t          d          | _        t          d          | _        t          d          | _        | j                            | j        | j        | j        j	        z             t          | j        | j                  | _        t          | j                   | _        | j        j        | _        | j        j        | _        | j        j        | _        | j        j        | _        | j        j        | _        t.          j        | _        t5          d          | _        t5          d          | _        t5          d          | _        t5          d	          | _        t5          d
          | _        t5          d          | _          || j         | j        | j        | j        | j        | j        | j        | j        | j        | j         d          | _!        t          d          | _"        |j#        $                    | j"                  }| j        j%        }| j        j&        }|| j        z  }tO          ||z
  dz  | j        tQ          | j                  z  dz  z             }|| j        z  }||z
  |z  }	| j"        | j        z  }
|
|	z  }|| j        z  }|j)        $                    |          }|j*        $                    |          }||z
  | j        |z  z  }|j+        $                    |          }|| j        z  }|||	z  z
  }|| j        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        d S )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    	$$$$Dkktt{DF468O<<<$T[$.AA:49EE++_=
_?
/3I,,i((i((i((,,6NN	..ILO#'#3 $!%!%#'<$(N&*i
 
 
 ((8995CCDNSS	|"|.&D3J?dl3t~3F3F&F%JJKK$	CZ$	nT\))m$	3AA)LL2@@KKH$tvh76DDTJJ	$S]"&	%LL2333C)**?9uW~~;U+V+VV5 5  	 
HQNNXa^^DF-BBCDq!nnx1~~d4646DF?3K.L.LLLNA!Q!66
Bq!nnx1~~d4646DF?3K.L.LLLNN 6DF?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 d S 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 d S r   r   r   s     r(   r   z'TestTendonForceExplicit.test_input_vars  r   r'   c                 L   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 d S 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 d S r   r   r   s     r(   r   zTestTendonForceExplicit.test_M  r   r'   c                     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 d S r   )r   rx   r   r   ry   r   r   r   r   s     r(   r   zTestTendonForceExplicit.test_F  r   r'   c                 0   t          | j        d          sJ t          | j        | j        g          }| j                                        }t          |t                    sJ |j        dk    sJ t          ||z
            t          dd          k    sJ d S 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  s        & V^D!!!B B "!BH
8 
8 
8
8 
8 
87 7 70/ / // / /; ; ; ; ;r'   r   c                      e Zd Zed             Zed             Z ej        d          d             Zd Z	e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
                            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
                            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
                            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
                            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
                            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dS ).TestMusculotendonDeGroote2016c                      t          t          t                    sJ t          t          t                    sJ t          j        dk    sJ d S )Nr   )rC   r   r   r   r;   r&   r'   r(   rH   z(TestMusculotendonDeGroote2016.test_class  sK    3]CCCCC3[AAAAA(15PPPPPPPr'   c                     t          d          } t          d          }|                    | 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 d S )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$KK	&."5"5nS6I6I6K"KLLL	225f==
;''	######;''	f~~,#;#H )!(!(#*$-&*
 
 
 ($=>>>>>>>r'   TrR   c                 x   d| _         t          d          | _        t          d          | _        t          d          | _        t          d          | _        | j                            | j        | j        | j        j	        z             t          | j        | j                  | _        t          | j                   | _        t          d          | _        t          d          | _        t          d          | _        t          d	          | _        t          d
          | _        t          d          | _        d S )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    	$$$$Dkktt{DF468O<<<$T[$.AA:49EE,,i((i((i((,,6NN			r'   c           	         t          d          }t          d          }|                    |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 d S )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  sY   t$KK	&."5"5nS6I6I6K"KLLL	225f==
;''	####--%LL	U||,:#;#H )!(!(
 
 
 +y8888,7777,7777.'9999/9<<<<1T999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 d S 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  sy     -ILO#;#H )!%!%#'<$(N&*i
 
 
 !X----+x777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 d S 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|  sy     -ILO#;#H $!(!%#'<$(N&*i
 
 
 8++++,88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 d S 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  sy     -ILO#;#H $!%!(#'<$(N&*i
 
 
 8++++,88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 d S 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  sy     -ILO#;#H $!%!%#*$(N&*i
 
 
 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 d S 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  sy     -ILO#;#H $!%!%#'<$-&*i
 
 
 !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 d S 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  sx     -ILO#;#H $!%!%#'<$(N&*
 
 
 }((((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 d S )Nro   rn   e_name)r   rU   rl   rm   r   r   ro   rn   )rz   rx   
e_expecteds      r(   test_excitationz-TestMusculotendonDeGroote2016.test_excitation  s    ,ILO
 

 x%%%%%x.....#H--
zZ''''"j0000zX0000000r'   c                 (   t          | j        | j        | j                  }t	          j        t                    5  d |_        d d d            n# 1 swxY w Y   t	          j        t                    5  d |_        d d d            d S # 1 swxY w Y   d S rB   )	r   rU   rl   rm   rJ   rK   AttributeErrorro   rn   rz   rx   s     r(   test_excitation_is_immutablez:TestMusculotendonDeGroote2016.test_excitation_is_immutable  
   ,ILO
 

 ]>** 	 	HJ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	]>** 	' 	'"&H	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	'#   AAA2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 d S )Nrp   rm   a_name)r   rU   rl   rm   r   r   rp   )rz   rx   
a_expecteds      r(   test_activationz-TestMusculotendonDeGroote2016.test_activation  s    ,ILO
 

 x%%%%%x.....#H--
zZ''''"j000000r'   c                 (   t          | j        | j        | j                  }t	          j        t                    5  d |_        d d d            n# 1 swxY w Y   t	          j        t                    5  d |_        d d d            d S # 1 swxY w Y   d S 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 d S )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    ,ILO#;#H $!%!%#'<$(N&*i
 
 
. 	 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    sv       Q Q \Q
 ? ? \?4 V^D!!!# # "!# : : :8 [66*++,VK  &&"5"56Xa^^XXa^^,U5\\55<<(		
 8 8 8  [66.))*VIy 1 12WT]]GGDMM*U8__eeHoo.		
 9 9 9  [66.))*VIy 1 12Xa^^XXa^^,U5\\55<<(		
 9 9 9  [66.))*VIy 1 12WR[[''"++&U6]]EE&MM*		
 ; ; ;  [66*++,VK  &&"5"56WQZZ$U5\\55<<(		
 < < <  [66+&&'VF^^VVF^^,WQZZ$Xa__hhq"oo.U5\\55<<(	
	 	> >	 	> 1 1 1	' 	' 	'
1 
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     s   K K 



  + + + + + + 7 7 7 7 7 7 7 7 7 7 $ $ $ $ $ $ 6 6 6 6 6 6 6 6 6 6 6 6 9 9 9 9 9 9 8 8 8 8 8 8 I I I I I I I I I I     	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	         
 : 9 9 9 9 9 : : : : : : 9 9 9 9 9 9 5 5 5 5 5 5 9 9 9 9 9 9 , , , , , , , , , , , ,C C C C C C C C6$ $ $ $ $ $ $ $$ 14M3NOOE8 E8 E8 E8 E8 E8 E8 POE8P # &))$A,P+N3]*L%C-R  	
 "@; @; @; @; @; @; @;# "@;F # &))$A,P+N3]*L%C-R  	
 "K; K; K; K; K; K; K;# "K;\r* r* r* r* r* r* r* r* r* r*r'   