a
    i‚j~t  ã                   @   sÜ   d 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mZ ddl	Z
dZdZdZd	Zd
ZdZeeeedœZG dd„ dejƒZdd„ Zejjfdd„Zejjfdd„Zdd„ Zdd„ Zejjfdd„ZedkrØe ¡  dS )ztests for rollout function.é    N)Úabsltest)Úparameterized)Úrollouta@  
<mujoco>
  <worldbody>
    <light pos="0 0 2"/>
    <geom type="plane" size="5 5 .1"/>
    <body pos="0 0 .1">
      <joint name="yaw" axis="0 0 1"/>
      <joint name="pitch" axis="0 1 0"/>
      <geom type="capsule" size=".02" fromto="0 0 0 1 0 0"/>
      <geom type="box" pos="1 0 0" size=".1 .1 .1"/>
      <site name="site" pos="1 0 0"/>
    </body>
  </worldbody>
  <actuator>
    <general joint="pitch" gainprm="100"/>
    <general joint="yaw" dyntype="filter" dynprm="1" gainprm="100"/>
  </actuator>
  <sensor>
    <accelerometer site="site"/>
  </sensor>
</mujoco>
a  
<mujoco>
  <worldbody>
    <light pos="0 0 2"/>
    <geom type="plane" size="5 5 .1"/>
    <body pos="0 0 .1">
      <joint name="yaw" axis="0 0 1"/>
      <joint name="pitch" axis="0 1 0"/>
      <geom type="capsule" size=".02" fromto="0 0 0 1 0 0"/>
      <geom type="box" pos="1 0 0" size=".1 .1 .1"/>
      <site name="site" pos="1 0 0"/>
    </body>
  </worldbody>
  <actuator>
    <general joint="pitch" gainprm="100"/>
    <general joint="yaw" dyntype="filter" dynprm="1" gainprm="100"/>
  </actuator>
</mujoco>
aµ  
<mujoco>
  <worldbody>
    <light pos="0 0 2"/>
    <geom type="plane" size="5 5 .1"/>
    <body pos="0 0 .1">
      <joint name="yaw" axis="0 0 1"/>
      <joint name="pitch" axis="0 1 0"/>
      <geom type="capsule" size=".02" fromto="0 0 0 1 0 0"/>
      <geom type="box" pos="1 0 0" size=".1 .1 .1"/>
      <site name="site" pos="1 0 0"/>
    </body>
  </worldbody>
  <sensor>
    <accelerometer site="site"/>
  </sensor>
</mujoco>
zû
<mujoco>
  <worldbody>
    <body name="1" mocap="true">
    </body>
    <body name="2" mocap="true">
    </body>
  </worldbody>
  <sensor>
    <framepos objtype="xbody" objname="1"/>
    <framequat objtype="xbody" objname="1"/>
  </sensor>
</mujoco>
z
<mujoco>
</mujoco>
aR  
<mujoco>
  <option>
    <flag gravity="disable"/>
  </option>

  <worldbody>
    <geom type="plane" size="5 5 .1"/>
    <body pos="0 0 -.3" euler="30 45 90">
      <freejoint/>
      <geom type="box" size=".1 .2 .4"/>
    </body>
  </worldbody>

  <keyframe>
    <key name="non-diverging" qpos="0 0 .5 1 0 0 0"/>
  </keyframe>
</mujoco>
)ÚTEST_XMLÚTEST_XML_NO_SENSORSÚTEST_XML_NO_ACTUATORSÚTEST_XML_EMPTYc                       s’  e Zd Z‡ fdd„Ze e ¡ ¡dd„ ƒZe e ¡ ¡dd„ ƒZ	e e ¡ ¡dd„ ƒZ
e e ¡ ¡d	d
„ ƒZe e ¡ ¡dd„ ƒZe e ¡ ¡dd„ ƒZe e ¡ ¡dd„ ƒZe e ¡ ¡dd„ ƒZe e ¡ ¡dd„ ƒZe e ¡ ¡dd„ ƒZe e ¡ ¡dd„ ƒZe e ¡ ¡dd„ ƒZe e ¡ ¡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/d0„ Zd1d2„ Z‡  Z S )3ÚMuJoCoRolloutTestc                    s   t ƒ  ¡  tj d¡ d S )Né*   )ÚsuperÚsetUpÚnpÚrandomÚseed)Úself©Ú	__class__© úS/home/ghrups/robot-bench/.venv/lib64/python3.9/site-packages/mujoco/rollout_test.pyr   Ž   s    
zMuJoCoRolloutTest.setUpc                 C   s–   t j t| ¡}t  |t jj¡}t  |¡}tj	 
|¡}tj	 
|j¡}t ||||¡\}}t  ||¡ t||||ƒ\}	}
tj ||	¡ tj ||
¡ d S ©N©ÚmujocoÚMjModelÚfrom_xml_stringÚ
ALL_MODELSÚmj_stateSizeÚmjtStateÚmjSTATE_FULLPHYSICSÚMjDatar   r   ÚrandnÚnur   Úmj_resetDataÚ
py_rolloutÚtestingÚassert_array_equal)r   Ú
model_nameÚmodelÚnstateÚdataÚinitial_stateÚcontrolÚstateÚ
sensordataÚpy_stateÚpy_sensordatar   r   r   Útest_single_step”   s    
z"MuJoCoRolloutTest.test_single_stepc                 C   s   d}t j t| ¡}t  |t jj¡}t  |¡}tj	 
|¡}tj	 
||j¡}t ||||¡\}}	t||||ƒ\}
}tj ||
¡ tj |	|¡ d S )Né   ©r   r   r   r   r   r   r   r   r   r   r   r    r   r"   r#   r$   )r   r%   Únstepr&   r'   r(   r)   r*   r+   r,   r-   r.   r   r   r   Útest_one_rollout£   s    
z"MuJoCoRolloutTest.test_one_rolloutc                 C   s¤   t j t| ¡}t  |t jj¡}t  |¡}d}d}tj	 
||¡}tj	 
|||j¡}t ||||¡\}	}
t  ||¡ t||||ƒ\}}tj |	|¡ tj |
|¡ d S ©Né   é   r   ©r   r%   r&   r'   r(   Únrollr2   r)   r*   r+   r,   r-   r.   r   r   r   Útest_multi_step³   s    
z!MuJoCoRolloutTest.test_multi_stepc                 C   s´   t j t| ¡}t  |t jj¡}t  |¡}d}d}tj	 
||¡}tj	 
||j¡}t ||||¡\}	}
t  ||¡ t ||ddf¡}t||||ƒ\}}tj |	|¡ tj |
|¡ d S r4   ©r   r   r   r   r   r   r   r   r   r   r   r    r   r!   Útiler"   r#   r$   r7   r   r   r   Útest_infer_nroll_initial_stateÅ   s    
z0MuJoCoRolloutTest.test_infer_nroll_initial_statec                 C   s²   t j t| ¡}t  |t jj¡}t  |¡}d}d}tj	 
|¡}tj	 
|||j¡}t ||||¡\}	}
t  ||¡ t ||df¡}t||||ƒ\}}tj |	|¡ tj |
|¡ d S r4   r:   r7   r   r   r   Útest_infer_nroll_controlØ   s    
z*MuJoCoRolloutTest.test_infer_nroll_controlc                 C   sÜ   t j t| ¡}t  |t jj¡}t  |¡}d}d}tj	 
|¡}tj	 
||j¡}t |j ¡ |df¡}	tj|||||	d\}
}t  ||¡ t ||df¡}t ||ddf¡}t||||ƒ\}}tj |
|¡ tj ||¡ d S )Nr5   r6   ©Úinitial_warmstart)r   r   r   r   r   r   r   r   r   r   r   r    r;   Úqacc_warmstartÚcopyr   r!   r"   r#   r$   )r   r%   r&   r'   r(   r8   r2   r)   r*   r?   r+   r,   r-   r.   r   r   r   Útest_infer_nroll_warmstartë   s"    

ÿ
z,MuJoCoRolloutTest.test_infer_nroll_warmstartc                 C   sÖ   t j t| ¡}t  |t jj¡}t  |¡}d}d}tj	 
|¡}tj	 
||j¡}t |||f¡}	tj|||||	d\}	}
t  ||¡ t ||df¡}t ||ddf¡}t||||ƒ\}}tj |	|¡ tj |
|¡ d S )Nr5   r6   ©r+   )r   r   r   r   r   r   r   r   r   r   r   r    Úemptyr   r!   r;   r"   r#   r$   r7   r   r   r   Útest_infer_nroll_state  s"    

ÿ
z(MuJoCoRolloutTest.test_infer_nroll_statec                 C   sØ   t j t| ¡}t  |t jj¡}t  |¡}d}d}tj	 
|¡}tj	 
||j¡}t |||jf¡}	tj|||||	d\}
}	t  ||¡ t ||df¡}t ||ddf¡}t||||ƒ\}}tj |
|¡ tj |	|¡ d S )Nr5   r6   )r,   )r   r   r   r   r   r   r   r   r   r   r   r    rD   Únsensordatar   r!   r;   r"   r#   r$   )r   r%   r&   r'   r(   r8   r2   r)   r*   r,   r+   r-   r.   r   r   r   Útest_infer_nroll_sensordata  s"    

ÿ
z-MuJoCoRolloutTest.test_infer_nroll_sensordatac                 C   sÆ   t j t| ¡}t  |t jj¡}t  |¡}d}d}tj	 
|¡}tj	 
|j¡}t |||f¡}	t |||jf¡}
tj|||||	|
d t ||df¡}t||||ƒ\}}tj |	|¡ tj |
|¡ d S )Nr6   r0   )r+   r,   )r   r   r   r   r   r   r   r   r   r   r   r    rD   rF   r   r;   r"   r#   r$   r7   r   r   r   Útest_one_rollout_fixed_ctrl0  s     
ÿz-MuJoCoRolloutTest.test_one_rollout_fixed_ctrlc                 C   s˜   t j t| ¡}t  |t jj¡}t  |¡}d}d}tj	 
||¡}tj	 
|||j¡}t ||||¡\}	}
t||||ƒ\}}tj |	|¡ tj |
|¡ d S )Né   r0   r1   r7   r   r   r   Útest_multi_rolloutF  s    
z$MuJoCoRolloutTest.test_multi_rolloutc                    s  d}d}t j t| ¡‰ tˆ jƒdkrlg }t|ƒD ]6}ˆ jd }|jdksNJ ‚|j| |_| 	ˆ  
¡ ¡ q2n‡ fdd„t|ƒD ƒ}t  |d t jj¡}t  |d ¡}tj ||¡}	tj |||d j¡}
t |||	|
¡\}}t|||	|
ƒ\}}tj ||¡ tj ||¡ d S )Nr0   r6   Zworldc                    s   g | ]}ˆ   ¡ ‘qS r   )Úcompile©Ú.0Ú_©Úspecr   r   Ú
<listcomp>f  ó    z6MuJoCoRolloutTest.test_multi_model.<locals>.<listcomp>r   )r   ZMjSpecZfrom_stringr   ÚlenZbodiesÚrangeÚnameÚposÚappendrK   r   r   r   r   r   r   r   r    r   r"   r#   r$   )r   r%   r8   r2   r&   ÚiÚbodyr'   r(   r)   r*   r+   r,   r-   r.   r   rO   r   Útest_multi_modelW  s&    
z"MuJoCoRolloutTest.test_multi_modelc                 C   s¼   t j t| ¡}t  |t jj¡}t  |¡}d}d}tj	 
||¡}tj	 
|d|j¡}t |||f¡}	tj|||||	d\}	}
tj||dd}t||||ƒ\}}tj |	|¡ tj |
|¡ d S )NrI   r0   r6   rC   ©Zaxis)r   r   r   r   r   r   r   r   r   r   r   r    rD   r   Úrepeatr"   r#   r$   r7   r   r   r   Ú/test_multi_rollout_fixed_ctrl_infer_from_outputs  s    

ÿ
zAMuJoCoRolloutTest.test_multi_rollout_fixed_ctrl_infer_from_outputc                 C   sÂ   t j t| ¡}t  |t jj¡}t  |¡}d}d}tj	 
||¡}t jjt jjB t jjB }t  ||¡}	tj	 
|||	¡}
tj||||
|d\}}t||||
|d\}}tj ||¡ tj ||¡ d S )Né   r0   ©Úcontrol_spec)r   r   r   r   r   r   r   r   r   r   r   ÚmjSTATE_CTRLZmjSTATE_QFRC_APPLIEDZmjSTATE_XFRC_APPLIEDr   r"   r#   r$   )r   r%   r&   r'   r(   r8   r2   r)   r`   Zncontrolr*   r+   r,   r-   r.   r   r   r   Ú#test_py_rollout_generalized_controlˆ  s,    
ÿþÿ
ÿ

ÿ
z5MuJoCoRolloutTest.test_py_rollout_generalized_controlc                 C   sf  t j t¡}t  |t jj¡}t  |¡}d}t 	||f¡}t  
|||d t jj¡ t  
|||d t jj¡ t  ||d¡ t  
|||d t jj¡ t  
|||d t jj¡ d}tj |||¡}tj||||d |d d d |d d	 d ksðJ ‚|d d d |d d	 d ksJ ‚|d d d |d d	 d ks<J ‚|d d d |d d	 d ksbJ ‚d S )
Nr^   r   rI   r6   r0   i'  rC   éÿÿÿÿéþÿÿÿ)r   r   r   ÚTEST_XML_DIVERGEr   r   r   r   r   rD   Úmj_getStateZmj_resetDataKeyframer   r   r   )r   r&   r'   r(   r8   r)   r2   r+   r   r   r   Útest_detect_divergence¥  s2    
ÿÿÿÿ$&&z(MuJoCoRolloutTest.test_detect_divergencec              
      s  t j t¡‰ t  ˆ t jj¡}d}d}d‰tj 	||¡}t 
|ˆ|f¡}t 
|ˆˆ jf¡}tj 	|ˆˆ j¡}t ¡ ‰‡ ‡fdd„}ˆ g| ‰‡‡‡fdd„}	|| }
g }t|d ƒD ]f}| |||
 |d |
 … |||
 |d |
 … |||
 |d |
 … |||
 |d |
 … f¡ q²| ||d |
 d … ||d |
 d … ||d |
 d … ||d |
 d … f¡ tjj||d	T}g }|D ]}| |j|	g|¢R Ž ¡ q†tj |¡D ]}| ¡  q²W d   ƒ n1 sØ0    Y  t  ˆ ¡}tˆ |||ƒ\}}tj ||¡ tj ||¡ d S )
Né    éd   r5   c                      s   t  ˆ ¡ˆ_d S r   )r   r   r(   r   )r&   Úthread_localr   r   Úthread_initializerÙ  s    z<MuJoCoRolloutTest.test_threading.<locals>.thread_initializerc              
      s"   t j ˆ ˆjg| |dˆ||d d S )NT)Zskip_checksr2   r+   r,   )r   r(   )r)   r*   r+   r,   )Ú
model_listr2   rj   r   r   Úcall_rolloutÞ  s    øz6MuJoCoRolloutTest.test_threading.<locals>.call_rolloutr6   )Úmax_workersZinitializer)r   r   r   r   r   r   r   r   r   r   rD   rF   r    Ú	threadingÚlocalrT   rW   Ú
concurrentÚfuturesZThreadPoolExecutorZsubmitZas_completedÚresultr   r"   r#   r$   )r   r'   Únum_workersr8   r)   r+   r,   r*   rk   rm   ÚnÚchunksrX   Úexecutorrr   ÚchunkÚfuturer(   r-   r.   r   )r&   rl   r2   rj   r   Útest_threadingÌ  sR    
üüÿ,
z MuJoCoRolloutTest.test_threadingc              	      sÞ   t j t¡‰ t  ˆ t jj¡}d}d}d}tj 	||¡}t 
|||f¡}t 
||ˆ jf¡}tj 	||ˆ j¡}ˆ g| }	‡ fdd„t|ƒD ƒ}
tj|	|
|||||d t  ˆ ¡}tˆ |||ƒ\}}tj ||¡ tj ||¡ d S )Nrh   ri   r5   c                    s   g | ]}t  ˆ ¡‘qS r   ©r   r   rL   ©r&   r   r   rQ     rR   z;MuJoCoRolloutTest.test_threading_native.<locals>.<listcomp>©r2   r+   r,   )r   r   r   r   r   r   r   r   r   r   rD   rF   r    rT   r   r   r"   r#   r$   )r   r'   rt   r8   r2   r)   r+   r,   r*   rl   Ú	data_listr(   r-   r.   r   r|   r   Útest_threading_native
  s0    
ù

z'MuJoCoRolloutTest.test_threading_nativec                    sŽ  t j t¡‰ t  ˆ t jj¡}d}d}d}tj 	||¡}t 
|||f¡}t 
||ˆ jf¡}tj 	||ˆ j¡}ˆ g| }	‡ fdd„t|ƒD ƒ}
tj|dn}tdƒD ]}|j|	|
|||||d q t  ˆ ¡}tˆ |||ƒ\}}tj ||¡ tj ||¡ W d   ƒ n1 s0    Y  tj|d}tdƒD ]V}|j|	|
|||||d t  ˆ ¡}tˆ |||ƒ\}}tj ||¡ tj ||¡ q*| ¡  d S )	Nrh   ri   r5   c                    s   g | ]}t  ˆ ¡‘qS r   r{   rL   r|   r   r   rQ   3  rR   zMMuJoCoRolloutTest.test_threading_native_persistent_object.<locals>.<listcomp>)ZnthreadrI   r}   )r   r   r   r   r   r   r   r   r   r   rD   rF   r    rT   r   ZRolloutr   r"   r#   r$   Úclose)r   r'   rt   r8   r2   r)   r+   r,   r*   rl   r~   Zrollout_rN   r(   r-   r.   r   r|   r   Ú'test_threading_native_persistent_object'  sT    
ù

.ù

z9MuJoCoRolloutTest.test_threading_native_persistent_objectc                    sö   t j t¡‰ t  ˆ t jj¡}d}d}d}tj 	||¡}t 
|||f¡}t 
||ˆ jf¡}tj 	||ˆ j¡}ˆ g| }	‡ fdd„t|ƒD ƒ}
tdƒD ]V}tj|	|
|||||dd t  ˆ ¡}tˆ |||ƒ\}}tj ||¡ tj ||¡ q’t ¡  d S )	Nrh   ri   r5   c                    s   g | ]}t  ˆ ¡‘qS r   r{   rL   r|   r   r   rQ   d  rR   zOMuJoCoRolloutTest.test_threading_native_persistent_function.<locals>.<listcomp>rI   T)r2   r+   r,   Zpersistent_pool)r   r   r   r   r   r   r   r   r   r   rD   rF   r    rT   r   r   r"   r#   r$   Zshutdown_persistent_pool)r   r'   rt   r8   r2   r)   r+   r,   r*   rl   r~   rN   r(   r-   r.   r   r|   r   Ú)test_threading_native_persistent_functionX  s6    
ø
z;MuJoCoRolloutTest.test_threading_native_persistent_functionc                 C   sÐ   t j t¡}t  |t jj¡}t  |¡}t 	|¡}t 	|j
¡}t||||ƒ\}}|j ¡ }t|||d |ƒ\}	}t |||d |¡\}
}tj ttjj|
|	¡ tj|||||d\}
}tj |
tj|	dd¡ d S )Nr   r>   r[   )r   r   r   r   r   r   r   r   r   Úzerosr    Ústepr@   rA   r   r#   Zassert_raisesÚAssertionErrorr$   Zexpand_dims)r   r&   r'   r(   Zstate0r*   Zstate1rN   r?   Ústate2r+   r   r   r   Útest_warmstartz  s     


ÿ
ÿ
z MuJoCoRolloutTest.test_warmstartc                 C   sò   t j t¡}t  |t jj¡}t  |¡}t 	|¡}t jj
t jjB }t d¡}t d¡}|tj |¡ }t d¡}t d¡}	|	tj |	¡ }	t ||||	f¡}
tj||||
|d\}}tj |d d d d… |¡ tj |d d dd … |¡ d S )N)ç      ð?ç       @ç      @)rˆ   r‰   rŠ   ç      @)r‰   rŠ   r‹   )r‰   rŠ   r‹   g      @r_   r   r0   )r   r   r   ÚTEST_XML_MOCAPr   r   r   r   r   rƒ   ZmjSTATE_MOCAP_POSZmjSTATE_MOCAP_QUATÚarrayZlinalgZnormZhstackr   r#   Zassert_array_almost_equal)r   r&   r'   r(   r)   r`   Zpos1Zquat1Úpos2Zquat2r*   rN   r,   r   r   r   Ú
test_mocapš  s$    

ÿ




ÿ
zMuJoCoRolloutTest.test_mocapc                 C   s˜   t j t¡}t  |t jj¡}t  |¡}d}d}t 	||f¡}t 	|||j
f¡}d|j_|  t jd¡  t ||||¡ W d   ƒ n1 sŠ0    Y  d S )Nr6   r0   é
   z(mj_fwdConstraint: unknown solver type 10)r   r   r   r   r   r   r   r   r   rƒ   r    ÚoptZsolverÚassertRaisesWithLiteralMatchZ
FatalErrorr   )r   r&   r'   r(   r8   r2   r)   Úctrlr   r   r   Útest_intercept_mj_errors¶  s    
ÿz*MuJoCoRolloutTest.test_intercept_mj_errorsc                 C   sÂ   t j t¡}t  |t jj¡}t  |¡}d}t 	||f¡}d}|  
td¡  t ||||¡ W d   ƒ n1 sn0    Y  t 	d¡}|  
td¡  t ||||¡ W d   ƒ n1 s´0    Y  d S )Nr6   Ústringz&control must be a numpy array or float)rI   r0   r^   r5   z%control can have at most 3 dimensions)r   r   r   r   r   r   r   r   r   rƒ   r’   Ú
ValueErrorr   )r   r&   r'   r(   r8   r)   r*   r   r   r   Útest_invalidÇ  s    
ÿ.
ÿzMuJoCoRolloutTest.test_invalidc           
      C   s°  t j t¡}t  |t jj¡}t  |¡}d}d}tj	 
||d ¡}|  td¡ t |||¡ W d   ƒ n1 sp0    Y  tj	 
||¡}tj	 
d||jd ¡}|  td¡  t ||||¡ W d   ƒ n1 sÐ0    Y  tj	 
|||j¡}tj	 
||d |¡}|  td¡$ tj|||||d W d   ƒ n1 s80    Y  tj	 
||¡}tj	 
|||j¡}t jj}	|  td¡$ tj|||||	d W d   ƒ n1 s¢0    Y  d S )	Nr6   r0   z4trailing dimension of initial_state must be 6, got 7z.trailing dimension of control must be 2, got 3z)dimension 1 inferred as 3 but state has 4rC   z2control_spec can only contain bits in mjSTATE_USERr_   )r   r   r   r   r   r   r   r   r   r   r   r’   r–   r   r    ZmjSTATE_ACT)
r   r&   r'   r(   r8   r2   r)   r*   r+   Zbad_specr   r   r   Útest_bad_sizesÜ  s>    
ÿ,ÿ.ÿ4ÿ
ÿz MuJoCoRolloutTest.test_bad_sizesc                 C   s²   t j t¡}t  |t jj¡}t  |¡}tj	 
|¡}tj	 
dd|j¡}t ||||¡\}}dD ] }t||tj	j
t||ƒjŽ ƒ q\t ||||¡\}	}
tj ||	¡ tj ||
¡ d S )Nr0   )r“   Zqfrc_appliedZxfrc_appliedZ	mocap_posZ
mocap_quat)r   r   r   r   r   r   r   r   r   r   r   r    r   ÚsetattrÚgetattrÚshaper#   r$   )r   r&   r'   r(   r)   r*   r+   r,   Úattrr†   Zsensordata2r   r   r   Útest_stateless  s    
z MuJoCoRolloutTest.test_stateless)!Ú__name__Ú
__module__Ú__qualname__r   r   Ú
parametersr   Úkeysr/   r3   r9   r<   r=   rB   rE   rG   rH   rJ   rZ   r]   rb   rg   rz   r   r   r‚   r‡   r   r”   r—   r˜   r   Ú__classcell__r   r   r   r   r	   Œ   sL   












'>1" &r	   c                 C   s<   t  | t jj¡}t |¡}t  | ||t jj¡ | d|f¡S )Nr6   )r   r   r   r   r   rD   rf   Zreshape)r&   r(   r'   r+   r   r   r   Ú	get_state!  s    
r¤   c                 C   sH   |d urt  | ||t jj¡ t  | |||¡ t  | |¡ t| |ƒ|jfS r   )r   Zmj_setStater   r   Zmj_stepr¤   r,   )r&   r(   r+   r*   r`   r   r   r   r„   (  s
    r„   c           
      C   s†   |j d }t | tjj¡}t ||f¡}t || jf¡}t | |¡ t	|ƒD ]0}	t
| ||	dkrb|nd ||	 |ƒ\||	< ||	< qL||fS )Nr   )r›   r   r   r   r   r   rD   rF   r!   rT   r„   )
r&   r(   r)   r*   r`   r2   r'   r+   r,   Útr   r   r   Úone_rollout2  s    
ÿr¦   c                 C   s&   | d u rd S t jt  | ¡t jdS d S )N©Zdtype)r   ÚascontiguousarrayZ
atleast_2dÚfloat64©Úargr   r   r   Ú	ensure_2dF  s    r¬   c                 C   sx   | d u rd S | j dkr.| tjtjtjdf } n6| j dkrL| tjtjdf } n| j dkrd| tjdf } tj| tjdS d S )Nr   .r6   rI   r§   )Úndimr   Znewaxisr¨   r©   rª   r   r   r   Ú	ensure_3dM  s    


r®   c                 C   sº   t |ƒ}t|ƒ}|jd }|jd }t| tjƒr:| g| } t | d tjj¡}t	 
|||f¡}t	 
||| d jf¡}	t|ƒD ]4}
t| |
 |||
 ||
 |ƒ\}}|||
< ||	|
< q|||	fS )Nr   r6   )r¬   r®   r›   Ú
isinstancer   r   r   r   r   r   rD   rF   rT   r¦   )r&   r(   r)   r*   r`   r8   r2   r'   r+   r,   ÚrZstate_rZsensordata_rr   r   r   r"   [  s     


ÿ
r"   Ú__main__)Ú__doc__Úconcurrent.futuresrq   ro   Zabsl.testingr   r   r   r   Únumpyr   r   r   r   rŒ   r   re   r   ZTestCaser	   r¤   r   ra   r„   r¦   r¬   r®   r"   rž   Úmainr   r   r   r   Ú<module>   sF   ü
     ÿ
û
û
