a
    i‚jí  ã                   @   s   d Z ddlZddlZddlZddlZddlmZ ddlmZ ddlZddl	Z
dZdZdZdZejd	d
„ ƒZG dd„ dejƒZedkrŒe ¡  dS )z!Tests for MuJoCo Python bindings.é    N)Úabsltest)ÚparameterizedaQ  
<mujoco model="test">
  <compiler coordinate="local" angle="radian" eulerseq="xyz"/>
  <size nkey="2"/>
  <option timestep="0.002" gravity="0 0 -9.81"/>
  <visual>
    <global fovy="50" />
    <quality shadowsize="51" />
  </visual>
  <worldbody>
    <geom name="myplane" type="plane" size="10 10 1"/>
    <body name="mybox" pos="0 0 0.1">
      <geom name="mybox" type="box" size="0.1 0.1 0.1" mass="0.25"/>
      <freejoint name="myfree"/>
    </body>
    <body>
      <inertial pos="0 0 0" mass="1" diaginertia="1 1 1"/>
      <site pos="0 0 -1" name="mysite" type="sphere"/>
      <joint name="myhinge" type="hinge" axis="0 1 0" damping="1"/>
    </body>
    <body>
      <inertial pos="0 0 0" mass="1" diaginertia="1 1 1"/>
      <joint name="myball" type="ball"/>
    </body>
    <body mocap="true" pos="42 0 42">
      <geom type="sphere" size="0.1"/>
    </body>
  </worldbody>
  <actuator>
    <position name="myactuator" joint="myhinge"/>
  </actuator>
  <sensor>
    <jointvel name="myjointvel" joint="myhinge"/>
    <accelerometer name="myaccelerometer" site="mysite"/>
  </sensor>
</mujoco>
zë
<mujoco model="test">
  <worldbody>
    <geom name="myplane" type="plane" size="10 10 1"/>
  </worldbody>
  <sensor>
    <user objtype="geom" objname="myplane"
          datatype="real" needstage="vel" dim="1"/>
  </sensor>
</mujoco>
aö  
<mujoco>
  <option gravity="0 0 0"/>
  <extension>
    <plugin plugin="mujoco.elasticity.cable"/>
  </extension>
  <worldbody>
    <composite type="cable" curve="s" count="41 1 1" size="1" offset="0 0 1" initial="none">
      <plugin plugin="mujoco.elasticity.cable">
        <config key="twist" value="1e6"/>
        <config key="bend" value="1e9"/>
      </plugin>
      <joint kind="main" damping="2"/>
      <geom type="capsule" size=".005" density="1"/>
    </composite>
  </worldbody>
</mujoco>
ap  
<mujoco>
  <asset>
    <texture name="tex" type="2d" builtin="checker" rgb1=".2 .3 .4" rgb2=".1 0.15 0.2"
      width="512" height="512" mark="cross" markrgb=".8 .8 .8"/>
    <material name="mat" reflectance="0.3" texture="tex" texrepeat="1 1" texuniform="true"/>
  </asset>
  <worldbody>
    <geom type="plane" size="1 1 1" material="mat"/>
  </worldbody>
</mujoco>
c                 c   s   | |ƒ d V  | d ƒ d S ©N© )ÚsetterÚcallbackr   r   úT/home/ghrups/robot-bench/.venv/lib64/python3.9/site-packages/mujoco/bindings_test.pyÚtemporary_callbackn   s    r	   c                       s$  e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Ze	j
ejjdkdddd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Z d6d7„ Z!d8d9„ Z"d:d;„ Z#d<d=„ Z$d>d?„ Z%d@dA„ Z&dBdC„ Z'dDdE„ Z(dFdG„ Z)dHdI„ Z*dJdK„ Z+dLdM„ Z,dNdO„ Z-dPdQ„ Z.e/ 0dRe1j2dSfdTe1j3dUfdVe1j4dUfdWe1j5dXfdYe1j6dZfd[e1j7d\fd]e1j8d^fd_e1j9d`fdae1j:dbfg	¡dcdd„ ƒZ;dedf„ Z<e/ 0dRe1j2dSfdTe1j3dUfdVe1j4dUfdWe1j5dXfdYe1j6dZfd[e1j7d\fd]e1j8d^fd_e1j9d`fdae1j:dbfg	¡dgdh„ ƒZ=didj„ Z>dkdl„ Z?dmdn„ Z@dodp„ ZAdqdr„ ZBdsdt„ ZCdudv„ ZDdwdx„ ZEdydz„ ZFd{d|„ ZGd}d~„ ZHdd€„ ZIdd‚„ ZJdƒd„„ ZKd…d†„ ZLd‡dˆ„ ZMd‰dŠ„ ZNd‹dŒ„ ZOddŽ„ ZPe	j
ejjdkdddd„ ƒZQe	j
ejjdkddd‘d’„ ƒZRd“d”„ ZSd•d–„ ZTd—d˜„ ZUd™dš„ ZVd›dœ„ ZWddž„ ZXdŸd „ ZYd¡d¢„ ZZd£d¤„ Z[d¥d¦„ Z\d§d¨„ Z]d©dª„ Z^d«d¬„ Z_d­d®„ Z`d¯d°„ Zad±d²„ Zbd³d´„ Zcdµd¶„ Zdd·d¸„ Zed¹dº„ Zfd»d¼„ Zge/jhd½d½d¾d¿dÀ„ ƒZidÁdÂ„ ZjdÃdÄ„ ZkdÅdÆ„ ZldÇdÈ„ ZmdÉdÊ„ ZndËdÌ„ ZodÍdÎ„ ZpdÏdÐ„ ZqdÑdÒ„ ZrdÓdÔ„ Zs‡  ZtS )ÕÚMuJoCoBindingsTestc                    s*   t ƒ  ¡  tj t¡| _t | j¡| _d S r   )	ÚsuperÚsetUpÚmujocoÚMjModelÚfrom_xml_stringÚTEST_XMLÚmodelÚMjDataÚdata©Úself©Ú	__class__r   r   r   w   s    
zMuJoCoBindingsTest.setUpc                 C   sr   d}d}d}t j |||dœ¡}|  t  |t jjd¡d¡ |  t  |t jjd¡d¡ |  t  |t jjd	¡d
¡ d S )Nz¦
<mujoco>
  <worldbody>
    <geom name="plane" type="plane" size="1 1 1"/>
    <include file="model_.xml"/>
    <include file="model__.xml"/>
  </worldbody>
</mujoco>s;   <mujoco><geom name="box" type="box" size="1 1 1"/></mujoco>s;   <mujoco><geom name="ball" type="sphere" size="1"/></mujoco>)z
model_.xmlzmodel__.xmlZplaner   Úboxé   Zballé   )r   r   r   ÚassertEqualÚ
mj_name2idÚmjtObjÚ
mjOBJ_GEOM)r   Zxml_1Zxml_2Zxml_3r   r   r   r   Ú#test_load_xml_can_handle_name_clash|   s    
ÿÿÿÿz6MuJoCoBindingsTest.test_load_xml_can_handle_name_clashc                 C   sD   |   td¡$ tj ddddœ¡ W d   ƒ n1 s60    Y  d S )Nz
Repeated.*ú	<mujoco/>s   asset1s   asset2)z	asset.xmlzpath/asset.xml)ÚassertRaisesRegexÚ
ValueErrorr   r   r   r   r   r   r   Ú!test_load_xml_repeated_asset_name”   s    
ÿz4MuJoCoBindingsTest.test_load_xml_repeated_asset_namec              	   C   s4   t j | jjg d¢g d¢g d¢g d¢g d¢g¡ d S )N©r   r   r   )r   r   çš™™™™™¹?)ç      E@r   r&   )ÚnpÚtestingÚassert_array_equalr   Úbody_posr   r   r   r   Útest_can_read_arrayœ   s     þz&MuJoCoBindingsTest.test_can_read_arrayc                 C   s,   d| j _tj | j jdgt| j jƒ ¡ d S )Ng|ò°Pkš¿?©r   Úqposr'   r(   r)   Úlenr   r   r   r   Útest_can_set_array¢   s    ÿz%MuJoCoBindingsTest.test_can_set_arrayc                 C   s0   | j j}d| j _tj |dgt| j jƒ ¡ d S )Ngsh‘í|?é?r,   )r   Zqpos_refr   r   r   Útest_array_is_a_view¨   s    z'MuJoCoBindingsTest.test_array_is_a_viewÚpypyzrequires sys.getrefcount)Úreasonc                 C   s˜   t j t¡}|j}|j}d|d d …< ~|  |d d¡ g }t |¡d }|j	}|  t |¡| d¡ ~|  t |¡| d¡ ~|  t |¡| d¡ d S )Nr   r   é   r   )
r   r   r   r   Úqpos0Úqpos_springr   ÚsysÚgetrefcountÚbase)r   r   r4   r5   ÚdummyZbase_refcountZcapsuler   r   r   Útest_array_keeps_struct_alive¯   s    z0MuJoCoBindingsTest.test_array_keeps_struct_alivec                 C   s¼   t  | jt jjd¡}|  | j d¡| j |¡¡ |  | j d¡j| j |¡j¡ |  	| j d¡jj
d¡ | j d¡j}d| jj|< tj |dg¡ d| j d¡_tj | jj| dg¡ d S )NZ
myactuator)r   é   é   )r   r   r   r   ZmjOBJ_ACTUATORÚassertIsr   ZactuatorZctrlr   Úshaper'   r(   r)   )r   Zactuator_idZctrl_from_indexerr   r   r   Ú!test_named_indexing_actuator_ctrlÍ   s     ÿÿþz4MuJoCoBindingsTest.test_named_indexing_actuator_ctrlc                 C   s<   |   td¡ | j d¡ W d   ƒ n1 s.0    Y  d S ©Nz<Invalid name 'badgeom'\. Valid names: \['mybox', 'myplane'\]Zbadgeom)r!   ÚKeyErrorr   Úgeomr   r   r   r   Ú*test_named_indexing_invalid_names_in_modelá   s
    þz=MuJoCoBindingsTest.test_named_indexing_invalid_names_in_modelc                 C   s:   |   td¡ | j ¡  W d   ƒ n1 s,0    Y  d S ©Nz@Invalid name ''\. Valid names: \['myball', 'myfree', 'myhinge'\])r!   rA   r   Újointr   r   r   r   Ú-test_named_indexing_no_name_argument_in_modelè   s
    þz@MuJoCoBindingsTest.test_named_indexing_no_name_argument_in_modelc                 C   s<   |   td¡ | j d¡ W d   ƒ n1 s.0    Y  d S r@   )r!   rA   r   rB   r   r   r   r   Ú)test_named_indexing_invalid_names_in_dataï   s
    þz<MuJoCoBindingsTest.test_named_indexing_invalid_names_in_datac                 C   s:   |   td¡ | j ¡  W d   ƒ n1 s,0    Y  d S rD   )r!   rA   r   Zjntr   r   r   r   Ú,test_named_indexing_no_name_argument_in_dataö   s
    þz?MuJoCoBindingsTest.test_named_indexing_no_name_argument_in_datac                 C   st   |   td¡ | j d¡ W d   ƒ n1 s.0    Y  |   td¡ | j d¡ W d   ƒ n1 sf0    Y  d S ©Nz+Invalid index 3\. Valid indices from 0 to 2r3   z,Invalid index -1\. Valid indices from 0 to 2éÿÿÿÿ)r!   Ú
IndexErrorr   rB   r   r   r   r   Ú*test_named_indexing_invalid_index_in_modelý   s    ÿ*ÿz=MuJoCoBindingsTest.test_named_indexing_invalid_index_in_modelc                 C   st   |   td¡ | j d¡ W d   ƒ n1 s.0    Y  |   td¡ | j d¡ W d   ƒ n1 sf0    Y  d S rI   )r!   rK   r   rB   r   r   r   r   Ú)test_named_indexing_invalid_index_in_data  s    ÿ*ÿz<MuJoCoBindingsTest.test_named_indexing_invalid_index_in_datac                 C   sÈ   t  | jt jjd¡}|  | j d¡| j |¡¡ |  | j d¡j| j |¡j¡ |  | j d¡jj	d¡ | j d¡j}g d¢| jj
|< tj |g d¢¡ g d¢| j d¡_tj | jj
| g d¢¡ d S )NÚmybox)r3   )r<   é   é   )r;   r3   r   )r   r   r   r   r   r=   rB   Úsizer   r>   Ú	geom_sizer'   r(   r)   )r   Úbox_idZsize_from_indexerr   r   r   Útest_named_indexing_geom_size  s     z0MuJoCoBindingsTest.test_named_indexing_geom_sizec                 C   sÈ   t  | jt jjd¡}|  | j d¡| j |¡¡ |  | j d¡j| j |¡j¡ |  | j d¡jj	d¡ | j d¡j}g d¢| jj
|< tj |g d¢¡ g d¢| j d¡_tj | jj
| g d¢¡ d S )NrN   ©é   )r;   é
   é   é   )é   é	   é   r3   )r   r   r   r   r   r=   rB   Úquatr   r>   Z	geom_quatr'   r(   r)   )r   rS   Zquat_from_indexerr   r   r   Útest_named_indexing_geom_quat  s     z0MuJoCoBindingsTest.test_named_indexing_geom_quatc                 C   sä   t  | jt jjd¡}|  | j d¡| j |¡¡ |  | j d¡j| j |¡j¡ |  	| j d¡jj
d¡ | j d¡j}| jj| }g d¢| jj||d …< tj |g d¢¡ g d¢| j d¡_tj | jj||d … g d¢¡ d S )NZmyballrU   )rV   r;   r\   r<   rV   )r[   é   r<   r\   )r   r   r   r   ÚmjOBJ_JOINTr=   r   rE   r-   r   r>   Zjnt_qposadrr'   r(   r)   )r   Zballjoint_idZqpos_from_indexerZqpos_idxr   r   r   Útest_named_indexing_ragged_qpos+  s     ÿÿÿz2MuJoCoBindingsTest.test_named_indexing_ragged_qposc                 C   s   t  | jt jjd¡}|  | j d¡| j |¡¡ |  | j d¡j| j |¡j¡ |  	| j d¡jj
d¡ | j d¡j}| jj| }t tdƒd¡| jj||d …d d …f< tj |t tdƒd¡¡ d| j d¡_tj | jj||d … dgd gd ¡ d S )NÚmyfree)r\   r\   é$   r\   é*   )r   r   r   r   r`   r=   r   rE   Zcdofr   r>   Z
jnt_dofadrr'   ÚreshapeÚranger(   r)   )r   Zfreejoint_idZcdof_from_indexerZdof_idxr   r   r   Ú!test_named_indexing_ragged2d_cdof?  s$    ÿÿ(ÿ ÿz4MuJoCoBindingsTest.test_named_indexing_ragged2d_cdofc                 C   s    d}|   |t| j d¡ƒ¡ d S )Nz{<_MjDataGeomViews
  id: 1
  name: 'mybox'
  xmat: array([0., 0., 0., 0., 0., 0., 0., 0., 0.])
  xpos: array([0., 0., 0.])
>rN   )r   Úreprr   rB   )r   Úexpected_reprr   r   r   Ú test_named_indexing_repr_in_dataU  s    z3MuJoCoBindingsTest.test_named_indexing_repr_in_datac                 C   s8   t | j d¡ƒ}|  |d¡ |  d|¡ |  |d¡ d S )NrN   z<_MjDataBodyViewszxpos: array([0., 0., 0.])ú>)rh   r   ÚbodyÚassertStartsWithÚassertInÚassertEndsWith©r   Z	view_reprr   r   r   Ú%test_named_indexing_body_repr_in_data^  s    z8MuJoCoBindingsTest.test_named_indexing_body_repr_in_datac                 C   s8   t | j d¡ƒ}|  |d¡ |  d|¡ |  |d¡ d S )NrN   z<_MjModelGeomViewszsize: array([0.1, 0.1, 0.1])rk   )rh   r   rB   rm   rn   ro   rp   r   r   r   Ú!test_named_indexing_repr_in_modeld  s    z4MuJoCoBindingsTest.test_named_indexing_repr_in_modelc                 C   sv   t j t¡}t  |¡}|  | jjd¡ |  | jjd¡ |  |jd¡ |  |jd¡ |  	| jj| jj|j|jhd¡ d S )Nr   rV   )
r   r   r   r   r   ÚassertGreaterr   Ú_addressr   Ú	assertLen©r   Úmodel2Údata2r   r   r   Ú%test_addresses_differ_between_structsj  s    
üùz8MuJoCoBindingsTest.test_addresses_differ_between_structsc                 C   s   |   | jjjd¡ tj | jjjg d¢¡ | jj}d| jj_|   |jd¡ |j}d| jjjd< tj |g d¢¡ d| jj_tj |g d¢¡ d S )	Nçü©ñÒMb`?©r   r   ç…ëQ¸ž#Àçü©ñÒMbP?r%   r   )r   r%   r|   çš™™™™™É?)r~   r~   r~   )r   r   ÚoptÚtimestepr'   r(   r)   Úgravity)r   r   r   r   r   r   Ú#test_mjmodel_can_read_and_write_opt|  s    

z6MuJoCoBindingsTest.test_mjmodel_can_read_and_write_optc                 C   s6   |   | jjjd¡ | jj}d| jj_|  |jd¡ d S )Nr   g333333ó?)ÚassertNotEqualr   ÚstatZmeanmassr   )r   r„   r   r   r   Ú$test_mjmodel_can_read_and_write_statŠ  s    
z7MuJoCoBindingsTest.test_mjmodel_can_read_and_write_statc                 C   s8   |   | jjjjd¡ d| jjj_|   | jjjjd¡ d S )Né3   éd   )r   r   ÚvisZqualityZ
shadowsizer   r   r   r   Ú#test_mjmodel_can_read_and_write_vis‘  s    z6MuJoCoBindingsTest.test_mjmodel_can_read_and_write_visc                 C   sn   t | jjd| jj d¡… dƒ}|  |d¡ | jjd }| jj d|¡}t | jj||… dƒ}|  |d¡ d S )Nr   ó    zutf-8ÚtestÚmyplane)Ústrr   ÚnamesÚfindr   Zname_geomadr)r   Z
model_nameÚstart_indexZ	end_indexZ	geom_namer   r   r   Ú&test_mjmodel_can_access_names_directly—  s    ÿz9MuJoCoBindingsTest.test_mjmodel_can_access_names_directlyc                 C   s   | j j}|  || j j¡ d S r   )r   rŽ   r=   )r   rŽ   r   r   r   Útest_mjmodel_names_doesnt_copy¤  s    z1MuJoCoBindingsTest.test_mjmodel_names_doesnt_copyc                 C   s8   |   | jjjjd¡ d| jjj_|   | jjjjd¡ d S )Né2   r‡   )r   r   rˆ   Zglobal_Zfovyr   r   r   r   Ú"test_vis_global_exposed_as_global_¨  s    z5MuJoCoBindingsTest.test_vis_global_exposed_as_global_c                 C   s.   t  ¡ }|  |jd¡ tj |jg d¢¡ d S )Nrz   r{   )r   ÚMjOptionr   r€   r'   r(   r)   r   )r   r   r   r   r   Útest_mjoption_can_make_default­  s    z1MuJoCoBindingsTest.test_mjoption_can_make_defaultc                 C   sr   t  ¡ }d|_d|_t |¡}|  |jd¡ tj |jg d¢¡ d|_d|_|  |jd¡ tj |jg d¢¡ d S )Nr}   r   )r   r   r   g{®Gázt?r;   )	r   r•   r€   r   Úcopyr   r'   r(   r)   )r   Zopt1Zopt2r   r   r   Útest_mjoption_can_copy²  s    
z)MuJoCoBindingsTest.test_mjoption_can_copyc                 C   sœ   t   | j¡}|  t |tjjd¡d¡ |  t |tjjd¡d¡ |  t |tjjd¡d¡ d| jjd< t	j
 | jjd g d¢¡ t	j
 |jd g d¢¡ d S )	Nr   rb   rŒ   r   rN   ç      à?)r™   r™   r™   )r%   r%   r%   )r—   r   r   r   Z
mj_id2namer   r`   r   rR   r'   r(   r)   )r   Z
model_copyr   r   r   Útest_mjmodel_can_copyÁ  s    ÿÿÿz(MuJoCoBindingsTest.test_mjmodel_can_copyc                 C   s  dddt  d¡ d t  t jd ¡t  t jd ¡dddddddg| j_t | j	| j¡ t
 
| j¡}|  |jd¡ |  |jd j| jjd j¡ t | j	| j¡ t | j	| j¡ t | j	|¡ |  | jjd¡ |  |jd¡ t | j	|¡ t | j	|¡ |  |jd¡ d S )Nr   r%   r   r}   r_   r   rV   )r'   ÚsqrtÚcosÚpiÚsinr   r-   r   Ú
mj_forwardr   r—   r   ÚnconÚcontactÚdistÚmj_resetData)r   Z	data_copyr   r   r   Útest_mjdata_can_copyÔ  s     "þz'MuJoCoBindingsTest.test_mjdata_can_copyc                 C   sR   | j j}|  |tjj¡ tdƒ| j jd< t | j	| j ¡ |  
|tjj jd¡ d S )NÚNaNr   r   )r   Úwarningru   r   Z
mjtWarningZ
mjNWARNINGÚfloatr-   Zmj_checkPosr   r   ZmjWARN_BADQPOSÚnumber)r   Úwarningsr   r   r   Ú"test_mjdata_can_read_warning_arrayë  s
    z5MuJoCoBindingsTest.test_mjdata_can_read_warning_arrayc                 C   s  t  | j| j¡ g }tdƒD ]}| t | jj| ¡¡ qt|dd„ d}t	j
 |d jd d… ddg¡ t	j
 |d jd d… d	dg¡ t	j
 |d jd d… d	d	g¡ t	j
 |d
 jd d… dd	g¡ tdƒD ]}d| jj| jd d…< qÒt	j
 | jjd jd d… ddg¡ t	j
 | jjd jd d… ddg¡ t	j
 | jjd jd d… ddg¡ t	j
 | jjd
 jd d… ddg¡ t	j
 |d jd d… ddg¡ t	j
 |d jd d… d	dg¡ t	j
 |d jd d… d	d	g¡ t	j
 |d
 jd d… dd	g¡ d S )NrV   c                 S   s   t  | jd | jd ¡S ©Nr   r   ©r'   Zarctan2Úpos©Úxr   r   r   Ú<lambda>ú  ó    z<MuJoCoBindingsTest.test_mjcontact_can_copy.<locals>.<lambda>©Úkeyr   r   çš™™™™™¹¿r   r%   r3   é7   )r   rŸ   r   r   rf   Úappendr—   r¡   Úsortedr'   r(   Úassert_allcloser­   )r   Zcontact_copyÚir   r   r   Útest_mjcontact_can_copyò  s*    ÿ    $$$$   z*MuJoCoBindingsTest.test_mjcontact_can_copyc                 C   sø  d}| j jd  |7  < t | j| j ¡ | jjjd  }t d| | ¡}| j j	}d| jj_
|  | j jd¡ | j j|k rÞ|  | j jd¡ |  | j j¡ |  | j jjd ¡ | j j}t | j| j ¡ |  | j j|| jjj
 ¡ qlt | j| j ¡ |  | j jd¡ |  | j jd¡ |  | j jjd ¡ t|dd	„ d
}tj |d jd d… ddg¡ tj |d jd d… ddg¡ tj |d jd d… ddg¡ tj |d jd d… ddg¡ t | j| j ¡ |  | j jd¡ |  | j j¡ |  | j jjd ¡ d S )Ng      Ð?r   ç      `?r   ZOWNDATArV   é   c                 S   s   t  | jd | jd ¡S r«   r¬   r®   r   r   r   r°   *  r±   z1MuJoCoBindingsTest.test_mj_step.<locals>.<lambda>r²   r´   r   r%   r3   )r   r-   r   rŸ   r   r   r   r'   r›   r¡   r€   r   Útimer    ÚassertEmptyZefc_typeZ
assertTrueÚflagsÚmj_stepru   ZassertFalser·   r(   r¸   r­   r£   )r   Zdisplacementr   Zexpected_contact_timer¡   Ú	prev_timeZsorted_contactr   r   r   Útest_mj_step  s<    
ÿ    zMuJoCoBindingsTest.test_mj_stepc                 C   sv   d| j j_|  | jjd¡ tdƒD ]>}| jj}tj| j | jdd |  | jj|d| j jj  ¡ q"|  	dtjj
¡ d S )Nr»   r   rW   r<   )ZnstepzOptionally, repeat nstep times.)r   r   r€   r   r   r½   rf   r   rÀ   rn   Ú__doc__)r   Ú_rÁ   r   r   r   Útest_mj_step_multiple6  s    
 z(MuJoCoBindingsTest.test_mj_step_multiplec                 C   sœ  |   | jj¡ d}t | j| j¡ |  | jj|¡ tj 	| jjj
ddggd ¡ g }| jjD ]"}| tjjdd¡ |d |_q\|  ||¡ tj 	| jjj|¡ g }| jjD ]"}| tjjdd¡ |d |_q¬|  ||¡ tj 	| jjj|¡ g }| jjD ]"}| tjjdd¡ |d |_qü|  ||¡ tj 	| jjj|¡ g }t| jjƒD ]&\}}| ||d g¡ |d |_
qP|  ||¡ tj 	| jjj
|¡ d S )	NrV   r   r   r3   )rQ   rJ   r;   rc   )r¾   r   r¡   r   rŸ   r   ru   r'   r(   r)   rB   r¶   ÚrandomÚuniformr­   ZfrictionÚHÚ	enumerate)r   Zexpected_nconZexpected_posr¡   Zexpected_frictionZ
expected_HZexpected_geomr¹   r   r   r   Útest_mj_contact_list?  s:    z'MuJoCoBindingsTest.test_mj_contact_listc                 C   sâ   |   | jj¡ d}d}tj | j||¡ d}d}tjj| j||d |  | jj|¡ |  | jjj	|f¡ |  | jj
j	|df¡ d}|  tj|¡" tj | jdd¡ W d   ƒ n1 s¸0    Y  |   | jj¡ |   | jj¡ d S )	Nr[   rO   rP   é   )r    ÚnefcrV   z#insufficient arena memory availablei áõ)r¾   r   r¡   r   Z
_functionsZ_realloc_con_efcru   r   Zefc_idr>   Zefc_KBIPÚassertRaisesWithLiteralMatchÚ
FatalError)r   r    rÌ   Zexpected_errorr   r   r   Útest_realloc_con_efcc  s    0z'MuJoCoBindingsTest.test_realloc_con_efcc                 C   s$  t j t¡}t  |¡}t  | j| j¡ |  | jj	d¡ t  ||¡ |  |j	d¡ |  |j
| jj
¡ t tjd ¡t tjd ¡ddg| jjdd…< | jjd  t d¡d d d	 9  < t  | j| j¡ |  | jj	d¡ |  |j
| jj
¡ |  |j
| jj
¡ |  | jj
| jj¡ |  | jj
d
¡ d S )NrV   r_   r   r3   r<   r   r   r%   çíµ ÷Æ°>r;   )r   r   r   r   r   rŸ   r   r   r   r    r¡   r'   rœ   r   rž   r-   r›   rƒ   r¦   rv   r   r   r   Útest_mj_struct_list_equalityx  s    
0&z/MuJoCoBindingsTest.test_mj_struct_list_equalityr•   Z	toleranceÚMjWarningStatr¨   ÚMjTimerStatÚMjSolverStatZnevalÚ	MjContactr¢   ÚMjStatisticZextentÚMjLROptZmaxforceÚ
MjvPerturbÚselectÚ	MjvCameraÚ
fixedcamidc                 C   sˆ   |ƒ }|ƒ }t ||dƒ |  ||¡ t ||dƒ |  ||¡ |  |d¡ |  |¡ |  t¡ t|ƒ W d   ƒ n1 sz0    Y  d S ©Nr   r3   )Úsetattrrƒ   r   ZassertIsNotNoneÚassertRaisesÚ	TypeErrorÚhash)r   ÚclsÚattrÚstructZstruct2r   r   r   Útest_mj_struct_equality  s    
z*MuJoCoBindingsTest.test_mj_struct_equalityc                 C   s@   t  ¡ }t  ¡ }d|jd< |  ||¡ d|jd< |  ||¡ d S rÜ   )r   rÕ   rÈ   rƒ   r   )r   Zcontact1Zcontact2r   r   r   Útest_mj_struct_equality_array©  s    

z0MuJoCoBindingsTest.test_mj_struct_equality_arrayc                 C   sX   |ƒ }t ||dƒ t|ƒ}|  |d|j› ¡ |  |› d|¡ |  t|ƒt|ƒ¡ d S )Nr   ú<z: 1)rÝ   rh   rm   Ú__name__rn   r   r   )r   rá   râ   rã   Zrepresentationr   r   r   Útest_mj_struct_repr±  s    z&MuJoCoBindingsTest.test_mj_struct_reprc                 C   s,   G dd„ dt jƒ}d}|  t|ƒ ƒ|¡ d S )Nc                   @   s   e Zd Zedd„ ƒZdS )zRMuJoCoBindingsTest.test_mj_struct_repr_for_subclass.<locals>.MjWarningStatSubclassc                 S   s   | S r   r   r   r   r   r   ÚptrÉ  s    zVMuJoCoBindingsTest.test_mj_struct_repr_for_subclass.<locals>.MjWarningStatSubclass.ptrN)rç   Ú
__module__Ú__qualname__Úpropertyré   r   r   r   r   ÚMjWarningStatSubclassÅ  s   rí   z2<MjWarningStatSubclass
  lastinfo: 0
  number: 0
>)r   rÒ   r   rh   )r   rí   ri   r   r   r   Ú test_mj_struct_repr_for_subclassÄ  s    	z3MuJoCoBindingsTest.test_mj_struct_repr_for_subclassc                 C   sœ  g d¢}t  t jd ¡ddt  t jd ¡g}t  g d¢¡t  d¡ }t  dt j¡}|  t	 
|||¡¡ t j ||¡ t	j
|||d t j ||¡ |  t¡( t	 
t  dt j¡||¡ W d   ƒ n1 sÊ0    Y  |  t¡" t	 
|g d	¢|¡ W d   ƒ n1 s0    Y  |  t¡" t	 
||g d
¢¡ W d   ƒ n1 sF0    Y  |  t¡, t  dt j¡}t	 
|||¡ W d   ƒ n1 sŽ0    Y  d S )N©r   r   r   r_   r   )r   r   r   r   r3   )Úvecr]   ÚresrV   )r   r   r3   rV   ©r   r   r3   )r'   rœ   r   rž   Úarrayr›   ÚemptyÚfloat64ÚassertIsNoner   Zmju_rotVecQuatr(   r¸   rÞ   rß   ÚzerosÚint32)r   rð   r]   Úexpectedrñ   r   r   r   Útest_mju_rotVecQuatÕ  s"    $622z&MuJoCoBindingsTest.test_mju_rotVecQuatc           	      C   s~  t  | j| j¡ dt jjj }d|› d}|  t j|¡ t  	| j|¡ W d   ƒ n1 s\0    Y  t jj
}t  	| j|¡}t |d tj¡}d}|  t|¡$ t  | j| j||¡ W d   ƒ n1 sÈ0    Y  t |tj¡}t  | j| j||¡ t  | j| j¡ t |tj¡}t  | j| j||¡ t  | j| j||¡ t  | j| j¡ t |tj¡}t  | j| j||¡ tj ||¡ d S )Nr   z!mj_stateSize: invalid state spec z >= 2^mjNSTATEr   z-state size should equal mj_stateSize(m, spec))r   rÀ   r   r   ZmjtStateZmjNSTATEÚvaluerÍ   rÎ   Zmj_stateSizeZmjSTATE_INTEGRATIONr'   rô   rõ   rß   Zmj_getStateZmj_setStater(   r)   )	r   Zinvalid_specÚexpected_messageÚspecrQ   Zstate_bad_sizeZstate0Zstate1aZstate1br   r   r   Útest_getsetstateø  s,    
ÿ,2z#MuJoCoBindingsTest.test_getsetstatec                 C   s  t  | j| j¡ d}d|› d}|  t j|¡" t  | j| j|¡ W d   ƒ n1 sV0    Y  d}| jj}| jj 	¡ }| jj
 	¡ }| jj 	¡ }t  | j| j|¡ t  | j| j¡ |  || jj¡ t  | j| j|¡ |  || jj¡ tj || jj¡ tj || jj
¡ tj || jj¡ d S )Nr   z+mj_setKeyframe: index must be smaller than z (keyframes allocated in model)r   )r   rÀ   r   r   rÍ   rÎ   Zmj_setKeyframer½   r-   r—   ÚqvelÚactrƒ   Zmj_resetDataKeyframer   r'   r(   r)   )r   Zinvalid_keyrü   Z	valid_keyr½   r-   rÿ   r   r   r   r   Útest_mj_setKeyframe  s&    
ÿ0z&MuJoCoBindingsTest.test_mj_setKeyframec                 C   s‚   t  | jjt j¡| j_t | j| j¡ t 	| j| j¡ t  
dt j¡}t | j| j|d¡ t j || jj | jjdd d …f ¡ d S )N©r3   rW   r   )r'   Úonesr   Únvrõ   r   rÿ   r   rŸ   Zmj_subtreeVelrô   Zmj_angmomMatr(   Úassert_almost_equalZsubtree_angmom)r   Úmatr   r   r   Útest_mj_angmomMat;  s    ÿz$MuJoCoBindingsTest.test_mj_angmomMatc              
   C   s>  t  | j| j¡ t  | jt jjd¡}t dtj	¡}t  
| j| j|d |¡ t g d¢g d¢g d¢g¡}tj ||¡ t dtj	¡}t  
| j| jd ||¡ t g d¢g d¢g d¢g¡}tj ||¡ d|d d …< d|d d …< t  
| j| j|||¡ tj ||¡ tj ||¡ |  t¡0 t  
| j| jt d|j¡d |¡ W d   ƒ n1 sL0    Y  |  t¡0 t  
| j| jd t d|j¡|¡ W d   ƒ n1 s˜0    Y  |  t¡0 t  
| j| jt |jt¡d |¡ W d   ƒ n1 sä0    Y  |  t¡0 t  
| j| jd t |jt¡|¡ W d   ƒ n1 s00    Y  d S )	NZmysiter  )
r   r   r   r   r   r   rJ   r   r   r   )
r   r   r   r   r   r   r   r   r   r   )
r   r   r   r   r   r   r   r   r   r   r   )r3   r\   )rV   r<   )r   rŸ   r   r   r   r   Z
mjOBJ_SITEr'   rô   rõ   Z
mj_jacSiteró   r(   r)   rÞ   rß   Zdtyper÷   r>   Úint)r   Zsite_idZjacpZexpected_jacpZjacrZexpected_jacrr   r   r   Útest_mj_jacSiteF  sN    ýýÿ$ÿ$	ÿ$ÿz"MuJoCoBindingsTest.test_mj_jacSitec                 C   s$   |   tjjd¡ |   tjjd¡ d S )Nz]mj_versionString() -> str

Return the current version of MuJoCo as a null-terminated string.
zvmj_Euler(m: mujoco._structs.MjModel, d: mujoco._structs.MjData) -> None

Euler integrator, semi-implicit in velocity.
)r   r   Zmj_versionStringrÃ   Zmj_Eulerr   r   r   r   Útest_docstringsƒ  s    þþz"MuJoCoBindingsTest.test_docstringsc                 C   s    |   tjd¡ |   tjd¡ d S )Ng    _ BgVçž¯Ò<)r   r   ÚmjMAXVALZmjMINVALr   r   r   r   Útest_float_constant“  s    z&MuJoCoBindingsTest.test_float_constantc                 C   sª   |   tjtjj¡ |   tjtjj¡ |   tjtj	j
¡ |   tjtjj¡ |   tjtjj¡ |   tjtjj¡ |   tjtjj¡ |  tjd d¡ |  tjtjj d¡ d S )NrO   ZRefsafe)ZInertiaÚ0ÚI)ru   r   ZmjDISABLESTRINGÚmjtDisableBitZ
mjNDISABLEZmjENABLESTRINGÚmjtEnableBitÚ	mjNENABLEZmjTIMERSTRINGZmjtTimerZmjNTIMERZmjLABELSTRINGZmjtLabelZmjNLABELZmjFRAMESTRINGÚmjtFrameZmjNFRAMEZmjVISSTRINGZ
mjtVisFlagZ
mjNVISFLAGZmjRNDSTRINGZ
mjtRndFlagZ
mjNRNDFLAGr   ZmjVIS_INERTIAr   r   r   r   Útest_string_constants—  s    þz(MuJoCoBindingsTest.test_string_constantsc                 C   s  |   tjjd¡ |   tjjd¡ |   tjjd¡ |   tjjd¡ |   tjjd¡ |   tjj	d¡ |   tjj
d¡ |   tjjd¡ |   tjjd¡ |   tjjd¡ |   tjjd¡ |   tjjd¡ |   tjjd¡ |   tjjd	¡ |   tjjd
¡ |   tjjd¡ d S )Nr   r   r   r3   rV   r<   r‡   ée   éf   él   ié  )r   r   ÚmjtJointÚ
mjJNT_FREEZ
mjJNT_BALLZmjJNT_SLIDEZmjJNT_HINGEr  ZmjENBL_OVERRIDEZmjENBL_ENERGYZmjENBL_FWDINVr  ÚmjtGeomZmjGEOM_PLANEZmjGEOM_HFIELDZmjGEOM_SPHEREÚmjGEOM_ARROWZmjGEOM_ARROW1ZmjGEOM_ARROW2ZmjGEOM_TRIANGLEZmjGEOM_NONEr   r   r   r   Útest_enum_values¥  s     z#MuJoCoBindingsTest.test_enum_valuesc                 C   sš   |   tjjt d¡¡ |   tjjtjdd¡ |  t¡ t d¡ W d   ƒ n1 sX0    Y  |  t¡ t d¡ W d   ƒ n1 sŒ0    Y  d S )Nr   r‡   )rû   iè  rJ   )r   r   r  r  r  r  rÞ   r"   r   r   r   r   Útest_enum_from_int·  s    (z%MuJoCoBindingsTest.test_enum_from_intc                 C   s@   g d¢}|   |tjj d¡ |   |tjjtjj… ddg¡ d S )N)ÚaÚbÚcÚdÚeÚfÚgÚhr¹   ÚjÚkr$  r  r   )r   r   r  ÚmjFRAME_WORLDZmjFRAME_GEOMZmjFRAME_CAMERA)r   r¯   r   r   r   Útest_enum_as_index¿  s    þz%MuJoCoBindingsTest.test_enum_as_indexc                 C   sÈ  |   tjjd¡ |   tjjd¡ |   dtjj¡ |   dtjj¡ |   tjjtjj¡ |  tjjtjj¡ |   tjj d¡ |  tjj t¡ |   tjjd d¡ |  tjjd t¡ |   dtjj d¡ |  dtjj t¡ |   tjjd d	¡ |   d
tjj d¡ |   tjjd d¡ |  tjjd t¡ |   dtjj d¡ |  dtjj t¡ |   tjjd d¡ |   dtjj d¡ |   tjjd d¡ |  tjjd t¡ |   dtjj d¡ |  dtjj t¡ |   tjjd d¡ |   dtjj d¡ |   tjjd d¡ |   dtjj d¡ |   tjjd d¡ |  tjjd t¡ |   tjj d d¡ |  tjj d t¡ |   dtjj d¡ |  dtjj t¡ |   dtjj d¡ |  dtjj t¡ |   tjjd d¡ |  tjjd t¡ |   tjj d d¡ |  tjj d t¡ |   dtjj d¡ |  dtjj t¡ |   dtjj d¡ |  dtjj t¡ |   tjjd d¡ |  tjjd t¡ |   tjj d d¡ |  tjj d t¡ |   tjj d d¡ |  tjj d t¡ |   tjjd d¡ |  tjjd t¡ |   dtjj d¡ |  dtjj t¡ |   d tjj  d!¡ |  d tjj  t¡ |   d tjj d¡ |  d tjj t¡ |   dtjj  d"¡ |  dtjj  t¡ |  	t
¡ tjjd# }W d   ƒ n1 sâ0    Y  |  	t
¡ dtjj }W d   ƒ n1 s0    Y  |  	t
¡ tjjd# }W d   ƒ n1 sR0    Y  |  	t
¡ dtjj }W d   ƒ n1 sŠ0    Y  |  	t
¡ tjjd# }W d   ƒ n1 sÂ0    Y  |  	t
¡ dtjj }W d   ƒ n1 sú0    Y  |   tjjtjjB d$¡ |   tjjd%B d%¡ |   tjjd%@ d&¡ |   tjjd%A d¡ |   d%tjjB d%¡ |   d%tjj@ d&¡ |   d%tjjA d¡ |   tjjd> tjj¡ |   tjjd? tjj¡ d S )'Nr<   ç      @iùÿÿÿr   r_   r   r[   g      ü?g     €!@g      @g     €#@r;   g      @g      @g     € @g      ô?r3   é   g      @g     €8@g     €1@g      @éüÿÿÿrY   iìÿÿÿéýÿÿÿç       @g      4@g      4ÀrV   rJ   i÷ÿÿÿéþÿÿÿéûÿÿÿr   éH   é!   é    )r   r   r  r'  rƒ   ZmjFRAME_NONEÚassertIsInstancer  r§   rÞ   ÚZeroDivisionErrorr  ZmjDSBL_GRAVITYZmjDSBL_LIMITZmjDSBL_PASSIVEZmjDSBL_CLAMPCTRLZmjDSBL_WARMSTARTZmjDSBL_CONTACT)r   rÄ   r   r   r   Útest_enum_opsÇ  s¼    ÿÿ,,,,,,þ
þ
þz MuJoCoBindingsTest.test_enum_opsc                 C   sN   | j j| j _|  tjd¡  t | j| j ¡ W d   ƒ n1 s@0    Y  d S )Nz.\Amj_stackAlloc: out of memory, stack overflow)r   ZnarenaZpstackr!   r   rÎ   rŸ   r   r   r   r   r   Útest_can_raise_error1  s
    ÿz'MuJoCoBindingsTest.test_can_raise_errorc                 C   sŽ   G dd„ dƒ}|ƒ }t tj|ƒL |  t ¡ |¡ |  |jd¡ t | j| j	¡ |  
|jd¡ W d   ƒ n1 sr0    Y  |  t ¡ ¡ d S )Nc                   @   s   e Zd Zdd„ Zdd„ ZdS )z6MuJoCoBindingsTest.test_mjcb_time.<locals>.CallCounterc                 S   s
   d| _ d S ©Nr   ©Úcountr   r   r   r   Ú__init__<  s    z?MuJoCoBindingsTest.test_mjcb_time.<locals>.CallCounter.__init__c                 S   s   |  j d7  _ | j d S )Nr   r8  r   r   r   r   Ú__call__?  s    z?MuJoCoBindingsTest.test_mjcb_time.<locals>.CallCounter.__call__N©rç   rê   rë   r:  r;  r   r   r   r   ÚCallCounter:  s   r=  r   )r	   r   Úset_mjcb_timer=   Zget_mjcb_timer   r9  rŸ   r   r   rs   rö   )r   r=  Zcall_counterr   r   r   Útest_mjcb_time8  s    	,z!MuJoCoBindingsTest.test_mjcb_timec              	      s²   G dd„ dt ƒ‰ ‡ fdd„}ttj|ƒf |  ˆ ¡ }t | j| j¡ W d   ƒ n1 sZ0    Y  |  |j	j
ddddd	œf¡ W d   ƒ n1 s”0    Y  t | j| j¡ d S )
Nc                   @   s   e Zd ZdS )z>MuJoCoBindingsTest.test_mjcb_time_exception.<locals>.TestErrorN)rç   rê   rë   r   r   r   r   Ú	TestErrorQ  s   r@  c                      s   ˆ dddddœƒ‚d S )NÚstringrò   r   r   ©r  r  r   r   ©r@  r   r   Úraises_exceptionT  s    zEMuJoCoBindingsTest.test_mjcb_time_exception.<locals>.raises_exceptionrA  rò   r   r   rB  )ÚRuntimeErrorr	   r   r>  rÞ   rŸ   r   r   r   Ú	exceptionÚargs)r   rD  r!  r   rC  r   Útest_mjcb_time_exceptionO  s    .ÿ"z+MuJoCoBindingsTest.test_mjcb_time_exceptionc              	   C   sp   t tjdd„ ƒL |  td¡  t | j| j¡ W d   ƒ n1 sD0    Y  W d   ƒ n1 sb0    Y  d S )Nc                   S   s   dS )NrA  r   r   r   r   r   r°   b  r±   zEMuJoCoBindingsTest.test_mjcb_time_wrong_return_type.<locals>.<lambda>z*mjcb_time callback did not return a number)r	   r   r>  rÍ   rß   rŸ   r   r   r   r   r   r   Ú test_mjcb_time_wrong_return_typea  s
    ÿz3MuJoCoBindingsTest.test_mjcb_time_wrong_return_typec                 C   s:   |   td¡ t d¡ W d   ƒ n1 s,0    Y  d S )Nz%callback is not an Optional[Callable]r   )rÍ   rß   r   r>  r   r   r   r   Útest_mjcb_time_not_callableh  s    ÿz.MuJoCoBindingsTest.test_mjcb_time_not_callablec                 C   sš   G dd„ dƒ}t j t¡}t  |¡}|| ||ƒ}|  |jd¡ tt j|ƒ t  	||¡ W d   ƒ n1 sl0    Y  |  |jd¡ |  |j
d d¡ d S )Nc                   @   s   e Zd Zdd„ Zdd„ ZdS )z;MuJoCoBindingsTest.test_mjcb_sensor.<locals>.SensorCallbackc                 S   s   || _ || _|| _d| _d S r7  )r‹   Úexpected_modelÚexpected_datar9  )r   r‹   rK  rL  r   r   r   r:  r  s    zDMuJoCoBindingsTest.test_mjcb_sensor.<locals>.SensorCallback.__init__c                 S   sN   | j  || j¡ | j  || j¡ | j  |tjj¡ d|jd< |  j	d7  _	d S )NrË   r   r   )
r‹   r=   rK  rL  r   r   ZmjtStageZmjSTAGE_VELÚ
sensordatar9  )r   Úmr   Zstager   r   r   r;  x  s
    
zDMuJoCoBindingsTest.test_mjcb_sensor.<locals>.SensorCallback.__call__Nr<  r   r   r   r   ÚSensorCallbackp  s   rO  r   r   rË   )r   r   r   ÚTEST_XML_SENSORr   r   r9  r	   Zset_mjcb_sensorrŸ   rM  )r   rO  Zmodel_with_sensorZdata_with_sensorZsensor_callbackr   r   r   Útest_mjcb_sensorn  s    
*z#MuJoCoBindingsTest.test_mjcb_sensorc                 C   s¸   g }g }t dƒD ]V}t d ¡ | tj d¡¡ | t |d ¡¡ t dd„ ¡ t |d |d ¡ qt d ¡ |r”| ¡ }|  	t
 |¡d¡ ~qr|r´| ¡ }|  	t
 |¡d¡ q”d S )NrW   r    rJ   c                 S   s   d S r   r   )rN  r   r   r   r   r°   –  r±   zFMuJoCoBindingsTest.test_mjcb_control_not_leak_memory.<locals>.<lambda>r   )rf   r   Zset_mjcb_controlr¶   r   r   r   rÀ   Úpopr   r6   r7   )r   Zmodel_instancesZdata_instancesrÄ   r   rN  r   r   r   Ú!test_mjcb_control_not_leak_memoryŒ  s     

z4MuJoCoBindingsTest.test_mjcb_control_not_leak_memoryc                 C   sD   t  t j d¡¡}|j}|  t |j¡d¡ ~|  t |¡d¡ d S )Nr    r3   r   )r   r   r   r   r   r   r6   r7   )r   r   r   r   r   r   Útest_mjdata_holds_ref_to_model£  s
    z1MuJoCoBindingsTest.test_mjdata_holds_ref_to_modelc                 C   s¬   |   t ¡ tj¡ |   t ¡ tj¡ |   t ¡ tj¡ |   t ¡ tj¡ |   t ¡ tj¡ |   t ¡ tj¡ |   t ¡ tj¡ |   t | jd¡tj¡ |   t 	¡ tj	¡ d S )Nr‡   )
r3  r   ÚMjvScenerÚ   ZMjvGLCameraZMjvGeomZMjvLightÚ	MjvOptionr   Z	MjvFigurer   r   r   r   Útest_can_initialize_mjv_structs¯  s    z2MuJoCoBindingsTest.test_can_initialize_mjv_structsc                 C   sZ   t  ¡ }t jj|_d|_|  |jd¡ |  t¡ d|_W d   ƒ n1 sL0    Y  d S )Niÿÿÿr™   )	r   rÚ   Z	mjtCameraZmjCAMERA_TRACKINGÚtyperÛ   r   rÞ   rß   )r   Úcamerar   r   r   Útest_mjv_cameraº  s    
z"MuJoCoBindingsTest.test_mjv_camerac              	   C   s„   t j| jdd}|  |jd¡ |  |jd¡ |  |j|j¡ t  | j| j	¡ t  
| j| j	t  ¡ d t  ¡ t jj|¡ |  |jd¡ d S )Nr‡   )r   Úmaxgeomr   )r   rU  r   r   Zngeomr[  ru   ZgeomsrŸ   r   Zmjv_updateScenerV  rÚ   Z	mjtCatBitZ	mjCAT_ALLrs   ©r   Zscener   r   r   Útest_mjv_sceneÃ  s    ù	z!MuJoCoBindingsTest.test_mjv_scenec                 C   s(   t  ¡ }|  |jd¡ |  |jd¡ d S )Nç      ð?r   )r   rU  r   Úscaler[  r\  r   r   r   Útest_mjv_scene_without_model×  s    z/MuJoCoBindingsTest.test_mjv_scene_without_modelc              
   C   s”   t  dt j¡}t | j| j¡ t | j| jg d¢g d¢d dd|¡ t | j| jg d¢g d¢g d¢dd|¡ tj| j| jg d¢g d¢d dd|d d S )Nr   r$   ©r   r   r   r   )r   r   r   r   r   r   )rN  r   Úpntrð   Ú	geomgroupÚ
flg_staticÚbodyexcludeÚgeomid)r'   r÷   rø   r   rŸ   r   r   Úmj_ray)r   rf  r   r   r   Útest_mj_rayÜ  s2    ÿøøzMuJoCoBindingsTest.test_mj_rayc           
      C   s*  d}t  dt j¡}t  g d¢¡}t  g d¢g d¢g d¢gt j¡}t  g d¢¡}t  g d¢¡}t  |t j¡}t  |t j¡}t | j| j¡ tj	| j| j|| 
¡ d dd	|||tjd
 tddƒD ]h}	|  ||	 t | j| j|||	 d dd	|¡¡ |  ||	 |¡ |  ||	 ||	 ¡ |  ||	 ||	 ¡ q¼d S )Nr3   r   )g333333Ó¿r   r%   rï   ra  )r   r   rJ   )r~   rJ   r%   )r   rJ   r   rJ   )rN  r   rb  rð   rc  rd  re  rf  r¢   ÚnrayÚcutoffr   )r'   r÷   rø   ró   rõ   r   rŸ   r   r   Zmj_multiRayÚflattenr  rf   r   rg  ZassertAlmostEqual)
r   ri  Zgeom1rb  rð   Zdist_exZgeom_exrf  r¢   r¹   r   r   r   Útest_mj_multi_rayù  s<     õþz$MuJoCoBindingsTest.test_mj_multi_rayc                 C   s.   d}d}t  | j| j||d d d d d d d ¡ d S ©NrÐ   r   )r   Úmjd_inverseFDr   r   )r   ÚepsÚflg_centeredr   r   r   Útest_inverse_fd_none  s    õz'MuJoCoBindingsTest.test_inverse_fd_nonec                 C   sZ   t  | j| j¡ t dtj¡}t  | j| jddd|¡}|  |d¡ tj	 
|t d¡¡ d S )Nr\   r   r   éÈ   ç33333óD@)r&   ç        rt  r&   rt  rs  )r   rŸ   r   r   r'   rô   rõ   Zmj_geomDistancer   r(   r)   ró   )r   Zfromtor¢   r   r   r   Útest_geom_distance,  s    
ÿz%MuJoCoBindingsTest.test_geom_distancec           
      C   s@  d}d}t  | jj| jjf¡}t  | jj| jjf¡}t  | jj| jjf¡}t  | jj| jjf¡}t  | jj| jjf¡}t  | jj| jjf¡}t  | jj| jjf¡}	t | j| j|||||||||	¡ |  	t j
 |¡|¡ |  	t j
 |¡|¡ |  	t j
 |¡|¡ |  	t j
 |¡|¡ |  	t j
 |¡|¡ |  	t j
 |¡|¡ d S rm  )r'   r÷   r   r  ZnsensordataZnMr   rn  r   rs   ÚlinalgZnorm)
r   ro  rp  Zdf_dqZdf_dvZdf_daZds_dqZds_dvZds_daZdm_dqr   r   r   Útest_inverse_fd5  s8    õz"MuJoCoBindingsTest.test_inverse_fdc                 C   s¤   t  d¡}t  d¡}t  dt j¡}t  dt j¡}t ||||¡ t  dt j¡}t  dt j¡}t ||d |¡ t |||d ¡ t j || ¡ ¡ t j || ¡ ¡ d S )N)r~   ç333333Ó?rx  çš™™™™™Ù?)r%   r~   ry  r™   r[   )r3   r3   )	r'   ró   rô   rõ   r   Zmjd_subQuatr(   r)   rk  )r   Zquat1Zquat2Zd1Zd2Zd3Zd4r   r   r   Útest_mjd_sub_quatS  s    

z$MuJoCoBindingsTest.test_mjd_sub_quatc                 C   sN   d}t  d¡}t  dt j¡}t  dt j¡}t  dt j¡}t |||||¡ d S )Nr%   )r~   rx  rx  r[   r3   )r'   ró   rô   rõ   r   Zmjd_quatIntegrate)r   r_  ZvelZd_quatZd_velZd_hr   r   r   Útest_mjd_quat_intergrate`  s    
z+MuJoCoBindingsTest.test_mjd_quat_intergratec              
   C   s^  d}d}d}t  g d¢g d¢g d¢g d¢g¡}t  |||  ||  ¡}t |||||¡ tdƒD ](}t ||||¡}|  || |d ¡ qbt  ||f¡}d}	t ||||||	¡ t j	 
||¡ t  dgdgdgd	gg¡}
t  |
¡}d}t |||
|||||	¡ t j	 
|||
 ¡ d
}d
}t ||||||¡ t |||
|||¡ t j	 |t j ||
¡¡ d S )NrV   r   )r^  r   r   r%   )r   r-  r   r~   )r   r   ç      @rx  )r%   r~   rx  ç      @r-  r|  r}  r   )r'   ró   r÷   r   Zmju_dense2Bandrf   Zmju_bandDiagr   Zmju_band2Denser(   r)   Z
zeros_likeZmju_bandMulMatVecZmju_cholFactorBandZmju_cholSolveBandr  rv  Zsolve)r   Zn_totalZn_bandZn_denseZdenseZbandr¹   ÚindexZdense2Zflg_symrð   rñ   Zn_vecZdiag_addZdiag_mulr   r   r   Útest_bandedh  s@    ü
ÿÿzMuJoCoBindingsTest.test_bandedc           
   	   C   s„   d}t  |¡}t  ||d f¡}t  |t j¡}t  |¡}t  |f¡}t  |f¡ }t  |f¡}t |||||||¡}	|  |	d¡ d S )Nr;   r<   rJ   )r'   r÷   rø   Úeyer  r   Z	mju_boxQPrs   )
r   Únrñ   Úrr~  r$  r#  ÚlowerÚupperZrankr   r   r   Útest_mju_box_qpŠ  s    

z"MuJoCoBindingsTest.test_mju_box_qpc                 C   s4   t  dt j¡}t |d¡ t j |t  dd¡¡ d S )Nr3   ç      ø?)r'   rô   rõ   r   Zmju_fillr(   r)   Úfull)r   rñ   r   r   r   Útest_mju_fill–  s    z MuJoCoBindingsTest.test_mju_fillc                 C   s0   t  dt j¡}t |¡ t j |t  d¡¡ d S )N©rV   rV   rV   )r'   rô   rõ   r   Zmju_eyer(   r)   r€  )r   Zeye4r   r   r   Útest_mju_eye›  s    
zMuJoCoBindingsTest.test_mju_eyec                 C   sL   t  ddd¡ dd¡}t  dt j¡}t ||¡ t j |d||j	  ¡ d S )Nr   r   r¼   rV   r‰  r™   )
r'   Zlinspacere   rô   rõ   r   Zmju_symmetrizer(   r)   ÚT)r   r  rñ   r   r   r   Útest_mju_symmetrize   s    z&MuJoCoBindingsTest.test_mju_symmetrizec                 C   sF   |   t ddd¡d¡ |   t ddd¡d¡ |   t ddd¡d¡ d S )Nr†  r^  r-  r|  rt  )r   r   Zmju_clipr   r   r   r   Útest_mju_clip¦  s    z MuJoCoBindingsTest.test_mju_clipc                 C   sR   t  g d¢¡}t  g d¢¡}t  g d¢g d¢g d¢g¡}|  t |||¡d¡ d S )N©r^  r-  r|  )r|  r-  r^  )r}  g      @g      @)r)  g       @g      "@g     €i@)r'   ró   r   r   Zmju_mulVecMatVec)r   Zvec1Zvec2r  r   r   r   Útest_mju_mul_vec_mat_vec«  s    z+MuJoCoBindingsTest.test_mju_mul_vec_mat_vecc                 C   sÞ   t  g d¢g d¢g¡}t  g d¢¡}t  ddg¡}t  ddg¡}t  g d¢¡}t  d¡}t  dt j¡}t  dt j¡}t  dt j¡}	t |||||	¡}
t j |
d¡ t j ||¡ t j ||¡ t j ||¡ t j |	|¡ d S )	N©rt  r^  rt  ©r-  rt  r|  rŽ  r   r   r   ©r   r   r   r3   )	r'   ró   r÷   rø   r   Zmju_dense2sparser(   Zassert_equalr)   )r   r  Zexpected_valsZexpected_rownnzZexpected_rowadrZexpected_colindÚvalsZrow_nnzZrow_adrZcol_indÚstatusr   r   r   Útest_mju_dense_to_sparse±  s    
z+MuJoCoBindingsTest.test_mju_dense_to_sparsec                 C   sx   t  g d¢g d¢g¡}t  d¡}t  ddg¡}t  ddg¡}t  g d¢¡}t  d¡}t |||||¡ t j ||¡ d S )	Nr  r‘  rŽ  r   r   r   r’  )r   r3   )r'   ró   r÷   r   Zmju_sparse2denser(   r)   )r   rù   r  ZrownnzZrowadrZcolindrñ   r   r   r   Útest_mju_sparse_to_denseÂ  s    

z+MuJoCoBindingsTest.test_mju_sparse_to_densec                 C   s   t  d¡}t  dt jd dg¡}d}t |||¡ t  t  d¡dt  d¡dg¡}t j ||¡ d}|  	tj
|¡ t ||d¡ W d   ƒ n1 s”0    Y  |  	tj
|¡ t ||d	¡ W d   ƒ n1 sÐ0    Y  d
}|  	tj
|¡ t ||d¡ W d   ƒ n1 s0    Y  d S )NrV   r   r   Zxyzr™   rt  z5mju_euler2Quat: seq must contain exactly 3 charactersZxyZxyzyz@mju_euler2Quat: seq[2] is 'p', should be one of x, y, z, X, Y, ZZxYp)r'   r÷   ró   r   r   Zmju_euler2Quatr›   r(   r  rÍ   rÎ   )r   r]   ZeulerÚseqZexpected_quatÚerrorr   r   r   Útest_mju_euler_to_quatÌ  s    
,,z)MuJoCoBindingsTest.test_mju_euler_to_quat)FT)Úflg_htmlÚflg_padc                 C   s   |   dt ||¡¡ d S )Nr   )rn   r   Zmj_printSchema)r   rš  r›  r   r   r   Útest_mj_printSchemaÝ  s    z&MuJoCoBindingsTest.test_mj_printSchemac                 C   s*   t  t  | j¡¡}d}|  || j|¡ d S )N)r½   r-   rÿ   Ú	mocap_pos)ÚpickleÚloadsÚdumpsr   Ú_assert_attributes_equal)r   rx   Úattr_to_comparer   r   r   Útest_pickle_mjdata_cleanã  s    z+MuJoCoBindingsTest.test_pickle_mjdata_cleanc                 C   sv   t  | j| j¡ t t | j¡¡}d}|  || j|¡ tdƒD ]"}t  | j| j¡ t  | j|¡ q>|  || j|¡ d S ©N)
r½   r-   rÿ   ZqaccÚxposr  r¦   Zenergyr¡   Zefc_JrW   )	r   rÀ   r   r   rž  rŸ  r   r¡  rf   ©r   rx   r¢  rÄ   r   r   r   Útest_pickle_mjdataè  s    z%MuJoCoBindingsTest.test_pickle_mjdatac                 C   s„   t jj| jj_t  | j| j¡ t 	t 
| j¡¡}d}|  || j|¡ tdƒD ]"}t  | j| j¡ t  | j|¡ qL|  || j|¡ d S r¤  )r   ZmjtJacobianZmjJAC_SPARSEr   r   ZjacobianrÀ   r   rž  rŸ  r   r¡  rf   r¦  r   r   r   Útest_pickle_mjdata_sparseý  s    z,MuJoCoBindingsTest.test_pickle_mjdata_sparsec                 C   s*   t  t  | j¡¡}d}|  || j|¡ d S )N)ZnqZnmatr*   rŽ   )rž  rŸ  r   r   r¡  )r   rw   r¢  r   r   r   Útest_pickle_mjmodel  s    z&MuJoCoBindingsTest.test_pickle_mjmodelc                 C   s2  d}t j |¡}|  | d¡jd¡ |  | d¡jd¡ |  | d¡jd¡ |  | d¡jd¡ |  | d¡jd¡ |  | d¡jd¡ |  | d	¡jd¡ |  | d¡jd d¡ |  | d¡jd d¡ |  | d¡jd d¡ |  | d¡jd d	¡ |  | d	¡jd d
¡ t  |¡}t  	||¡ |  | d¡jd¡ |  | d¡jd¡ |  | d¡jd¡ |  | d¡jd¡ |  | d¡jd¡ |  | d¡jd¡ |  | d	¡jd¡ |  | d¡j
d d¡ |  | d¡j
d d¡ |  | d¡j
d d¡ |  | d¡j
d d	¡ |  | d	¡j
d d
¡ d S )Nz÷
<mujoco>
  <worldbody>
    <geom name="mygeom" size="1" pos="0 0 1"/>
    <geom size="2" pos="0 0 2"/>
    <geom size="3" pos="0 0 3"/>
    <geom name="myothergeom" size="4" pos="0 0 4"/>
    <geom size="5" pos="0 0 5"/>
  </worldbody>
</mujoco>
Zmygeomr   Zmyothergeomr3   r   Ú r   rV   r;   )r   r   r   r   rB   ÚidÚnamerQ   r   rŸ   r¥  )r   Úxmlr   r   r   r   r   Útest_indexer_name_id  s8    
z'MuJoCoBindingsTest.test_indexer_name_idc                 C   s&   t j t¡}t  |¡}t  ||¡ d S r   )r   r   r   ÚTEST_XML_PLUGINr   rŸ   )r   r   r   r   r   r   Útest_load_pluginG  s    
z#MuJoCoBindingsTest.test_load_pluginc                 C   sx   t j t¡}t  |¡}|  |j|¡ t  ||¡ t |¡}t  ||¡ t  ||¡ t	j
 |j|j¡ |  |j|j¡ d S r   )r   r   r   r¯  r   r=   r   rÀ   r—   r'   r(   r)   r-   ©r   r   Zdata1rx   r   r   r   Útest_copy_mjdata_with_pluginL  s    

z/MuJoCoBindingsTest.test_copy_mjdata_with_pluginc                 C   sŒ   t j t¡}t  |¡}|  |j|¡ t  ||¡ t 	|¡}t  ||¡ t  ||¡ t
j |j|j¡ |  |j|j¡ |  |jj|jj¡ d S r   )r   r   r   r¯  r   r=   r   rÀ   r—   Údeepcopyr'   r(   r)   r-   ZassertIsNotrƒ   rt   r±  r   r   r   Ú test_deepcopy_mjdata_with_pluginW  s    

z3MuJoCoBindingsTest.test_deepcopy_mjdata_with_pluginc                 C   s&   t j t¡}|  | d¡jjd¡ d S )NÚtex)é   r¶  r3   )r   r   r   ÚTEST_XML_TEXTUREr   rµ  r   r>   )r   r   r   r   r   Útest_texture_sizec  s    z$MuJoCoBindingsTest.test_texture_sizec                 C   sŠ   |D ]€}t ||ƒ}t ||ƒ}z,t|tjƒr:tj ||¡ n|  ||¡ W q ty‚ } z"|  d 	|t
|ƒ¡¡ W Y d }~qd }~0 0 qd S )Nz.Attribute '{}' differs from expected value: {})ÚgetattrÚ
isinstancer'   Zndarrayr(   r)   r   ÚAssertionErrorZfailÚformatr   )r   Z
actual_objZexpected_objr¢  r¬  Zactual_valueZexpected_valuer!  r   r   r   r¡  g  s    

ÿÿz+MuJoCoBindingsTest._assert_attributes_equal)urç   rê   rë   r   r   r#   r+   r/   r0   r   ZskipIfr6   Úimplementationr¬  r:   r?   rC   rF   rG   rH   rL   rM   rT   r^   ra   rg   rj   rq   rr   ry   r‚   r…   r‰   r‘   r’   r”   r–   r˜   rš   r¤   rª   rº   rÂ   rÅ   rÊ   rÏ   rÑ   r   Znamed_parametersr   r•   rÒ   rÓ   rÔ   rÕ   rÖ   r×   rØ   rÚ   rä   rå   rè   rî   rú   rþ   r  r  r	  r
  r  r  r  r  r(  r5  r6  r?  rH  rI  rJ  rQ  rS  rT  rW  rZ  r]  r`  rh  rl  rq  ru  rw  rz  r{  r  r…  rˆ  rŠ  rŒ  r  r  r•  r–  r™  Úproductrœ  r£  r§  r¨  r©  r®  r°  r²  r´  r¸  r¡  Ú__classcell__r   r   r   r   r
   u   sþ   ÿ


	)	$








÷









÷
#%=jÿ
ÿ
		"	"


*r
   Ú__main__)rÃ   Ú
contextlibr—   rž  r6   Zabsl.testingr   r   r   Únumpyr'   r   rP  r¯  r·  Úcontextmanagerr	   ZTestCaser
   rç   Úmainr   r   r   r   Ú<module>   s:   &
            