U
    ‰dv,  ã                   @   s®   d dl mZ d dlmZmZmZ d dlmZmZm	Z	 d dl
mZmZ d dlmZ d dlZd dlZG dd„ deƒZd	d
„ Zdd„ Zdd„ Zdd„ Zdd„ ZG dd„ dejƒZdS )é    )Ú	workspace)ÚPlanÚto_execution_stepÚNet)ÚTaskÚ	TaskGroupÚfinal_output)ÚopsÚ
NetBuilder)ÚLocalSessionNc                   @   s   e Zd Ze ¡ ZdZdZdS )ÚPythonOpStatsr   N)Ú__name__Ú
__module__Ú__qualname__Ú	threadingÚLockÚlockÚnum_instancesÚ	num_calls© r   r   úB/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/net_builder_test.pyr      s   r   c                  C   s.   t j ¡  t  jd7  _t j ¡  dd„ } | S )Né   c                 S   s&   t j ¡  t  jd7  _t j ¡  d S )Nr   )r   r   Úacquirer   Úrelease)ÚinputsÚoutputsr   r   r   Úmy_op   s    
z python_op_builder.<locals>.my_op)r   r   r   r   r   )r   r   r   r   Úpython_op_builder   s
    

r   c               	   C   sv   t  d¡} t  d¡}t  ¡ P t  t  | t  d¡g¡¡ t  | t  d¡g| g¡ t  |t  d¡g|g¡ W 5 Q R X |S )Né   r   éÿÿÿÿr   )r	   ÚConstÚloopÚstop_ifÚEQÚAdd©ÚxÚyr   r   r   Ú
_test_loop"   s    


"r(   c                 C   s   t  t  | t  d¡g¡¡ d S )Nr   )r	   r"   ÚLTr    )r&   r   r   r   Ú_test_inner_stop,   s    r*   c               	   C   sš   t  d¡} t  ¡ }t| ƒ W 5 Q R X t  d¡}t  ¡ }t|ƒ W 5 Q R X t  ¡ }t  d¡ W 5 Q R X t  ¡ }W 5 Q R X | ¡ | ¡ | ¡ | ¡ fS )Né
   é   r   )r	   r    Z
stop_guardr*   Zhas_stopped)r&   Zg1r'   Zg2Zg4Zg3r   r   r   Ú_test_outer0   s    






   ÿr-   c              	   C   sŒ   t  d¡}t  t  | t  d¡g¡¡ t jd|d W 5 Q R X t  t  | t  d¡g¡¡* t jd|d t  ¡  t jd|d W 5 Q R X |S )Nr   é2   é   ©Zblob_outr,   é   )r	   r    ÚIfÚGTr)   Ústopr%   r   r   r   Ú_test_ifG   s    
r5   c                   @   s\   e Z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S )ÚTestNetBuilderc              	   C   sÊ   t ƒ 6}tƒ }tƒ \}}}}tt d¡ƒ}tt d¡ƒ}W 5 Q R X tdƒ}	|	 t|ƒ¡ t	j
 ¡ }
|
 |	¡ |df|df|df|df|df|df|dfg}|D ]&\}}|
jt|ƒ  ¡ }|  ||¡ qžd S )	NéK   é   Únamer   FTr/   r,   )r
   r(   r-   r5   r	   r    r   ÚAddStepr   r   ÚCÚ	WorkspaceÚrunÚblobsÚstrÚfetchÚassertEquals)ÚselfÚnbr'   ÚzÚwÚaÚbÚpÚqÚplanÚwsÚexpectedÚactualr   r   r   Útest_opsS   s(    

ù	zTestNetBuilder.test_opsc           	      C   s|   d}d}d}d}t dƒD ]V}|d }t |ƒD ]@}|| }|dkrJ||7 }n|dkr\||7 }n||7 }||7 }q,q||||fS )Nr   r+   éP   r.   )Úrange)	rB   ÚtotalÚtotal_largeÚtotal_smallÚ
total_tinyZ	loop_iterÚouterZ
inner_iterÚvalr   r   r   Ú_expected_loopj   s    

zTestNetBuilder._expected_loopc           
      C   s>  t  d¡}t  d¡}t  d¡}t  d¡}t  d¡ð}t  | ¡ t  d¡g¡}t  | ¡ ¡¾}t  || ¡ g¡}t  t  |t  d¡g¡¡}	t  ||g|g¡ W 5 Q R X |	 t  |t  d¡g¡¡}	t  ||g|g¡ W 5 Q R X |	 	¡  t  ||g|g¡ W 5 Q R X t  ||g|¡ W 5 Q R X W 5 Q R X dd„ ||||fD ƒS )Nr   r+   rO   r.   c                 S   s   g | ]}t |ƒ‘qS r   )r   )Ú.0r&   r   r   r   Ú
<listcomp>Œ   s   ÿz/TestNetBuilder._actual_loop.<locals>.<listcomp>)
r	   r    r!   ÚMulÚiterr$   r2   ZGEZElifÚElse)
rB   rQ   rR   rS   rT   r!   rU   ÚinnerrV   Úcr   r   r   Ú_actual_loop|   s$    




$
þzTestNetBuilder._actual_loopc              	   C   sˆ   t ƒ L}t d¡}tdƒ}| || d¡g|g¡ t |¡ t |¡ t|ƒ}W 5 Q R X tƒ  }| |¡ |  	d| 
¡ ¡ W 5 Q R X d S )Nr   Zmy_netr   r/   )r   r	   r    r   r$   Únetr   r   r=   rA   r@   )rB   ÚtaskrQ   r`   ÚresultÚsessionr   r   r   Útest_net_multi_use‘   s    



z!TestNetBuilder.test_net_multi_usec              	   C   sp   t ƒ }|  ¡ }W 5 Q R X tƒ F}| |¡ |  ¡ }dd„ |D ƒ}t||ƒD ]\}}|  ||¡ qLW 5 Q R X d S )Nc                 S   s   g | ]}|  ¡ ‘qS r   )r@   )rX   Úor   r   r   rY   £   s     z-TestNetBuilder.test_loops.<locals>.<listcomp>)r   r_   r   r=   rW   ÚziprA   )rB   ra   Z
out_actualrc   rL   rM   ÚerF   r   r   r   Ú
test_loops   s    
zTestNetBuilder.test_loopsc              
   C   s"  t ƒ Æ}t ¡  t d¡}W 5 Q R X t ||g¡}t ¡  t d¡}W 5 Q R X t ||g¡}t ¡  t ||g¡}W 5 Q R X t ||g¡}t ||g|g¡ t ||g¡}t|ƒ}	t|ƒ}
t|ƒ}W 5 Q R X tƒ @}| |¡ |  	|	 
¡ d¡ |  	|
 
¡ d¡ |  	| 
¡ d¡ W 5 Q R X d S )Nr   r,   é   é   )r   r	   Ú	task_initr    r$   Ú	task_exitr   r   r=   rA   r@   )rB   ra   ZoneZtwoZthreeÚaccumZseven_1ÚsixZseven_2Zo6Zo7_1Zo7_2rc   r   r   r   Ú
test_setup§   s(    



zTestNetBuilder.test_setupc              
   C   sŠ   t dd2}t d¡ t tg i f¡g g ƒ W 5 Q R X W 5 Q R X tƒ 8}dt_dt_| 	|¡ |  
tjd¡ |  
tjd¡ W 5 Q R X dS )aa  
        When task instances are created at runtime, C++ concurrently creates
        multiple instances of operators in C++, and concurrently destroys them
        once the task is finished. This means that the destructor of PythonOp
        will be called concurrently, so the GIL must be acquired. This
        test exercises this condition.
        é@   ©r   r1   r   é   N)r   r	   r!   ÚPythonr   r   r   r   r   r=   rA   )rB   ra   rc   r   r   r   Útest_multi_instance_python_op¿   s    *
z,TestNetBuilder.test_multi_instance_python_opc                 C   sô  d}d}t ƒ z}t|db t ¡ 0 t g dg¡}t g dg¡}t g dg¡}W 5 Q R X t ¡  t g dg¡}W 5 Q R X t g dg¡}t |¡$ t |¡ t |¡ t |¡ W 5 Q R X t ¡ : t 	|¡}	t t 
|	|	g¡¡ t |¡ W 5 Q R X W 5 Q R X t 	|¡}
t t 
|
|
g¡¡ t |¡ W 5 Q R X t ¡ 0 tt 	|¡ƒ}tt 	|¡ƒ}tt 	|¡ƒ}W 5 Q R X W 5 Q R X W 5 Q R X tƒ T}| |¡ |  | ¡ || ¡ |  | ¡ ||d	  ¡ |  | ¡ ||d	  ¡ W 5 Q R X d S )
Nr+   é   rq   Zglobal_counterZglobal_counter2Zglobal_counter3Útask_counterÚlocal_counterr/   )r   r   r	   rk   ZCreateCounterZtask_instance_initr!   ZCountUpZtask_instance_exitZRetrieveCountrZ   rl   r   r   r=   rA   r@   )rB   ZNUM_INSTANCESZ	NUM_ITERSÚtgZcounter1Zcounter2Zcounter3rv   rw   Zcount2Zcount3Ztotal1Ztotal2Ztotal3rc   r   r   r   Útest_multi_instanceÑ   s>    








,
z"TestNetBuilder.test_multi_instancec                 C   sÒ  t ƒ ì}t d¡}t d¡}t d¡}t d¡}t d¡}t d¡}t d¡}t t d¡¡ tjd|d W 5 Q R X t ¡  tjd|d W 5 Q R X t d¡}	t t d¡¡ tjd|	d W 5 Q R X t ¡  tjd|	d W 5 Q R X t t ||g¡¡Ð t d¡}
t t d¡|
g|g¡ t ||g¡}t |¡ W 5 Q R X t ¡ 0 t ||
g|
g¡ t t d¡|g|g¡ W 5 Q R X t t |
t d	¡g¡¡& tjd
|d t ||g|g¡ W 5 Q R X W 5 Q R X t ¡  W 5 Q R X W 5 Q R X t	dƒ}| 
t|ƒ¡ tj ¡ }| |¡ |jt|ƒ  ¡ }|jt|	ƒ  ¡ }|jt|ƒ  ¡ }|jt|ƒ  ¡ }|jt|ƒ  ¡ }|  |d¡ |  |d¡ |  |d¡ |  |d¡ |  |d¡ |  t|
ƒ|jk¡ d S )Nr   r   r/   Tr0   Fi„  éd   i…  rj   Zif_net_testiè  ée   él   )r
   r	   r    ZIfNetr\   r)   r$   r3   r#   r   r:   r   r   r;   r<   r=   r>   r?   r@   rA   Ú
assertTrue)rB   rC   Zx0Úx1Zx2Zy0Úy1Úy2Z	first_resZ
second_resZ
local_blobÚgtrJ   rK   Zfirst_res_valueZsecond_res_valueZy0_valueZy1_valueZy2_valuer   r   r   Útest_if_netù   s\    













"&


zTestNetBuilder.test_if_netc                 C   sö   t ƒ €}t d¡}t d¡}t ¡ X t ¡ 2 t |t d¡g|g¡ t |t d¡g¡ W 5 Q R X t ||g|g¡ W 5 Q R X W 5 Q R X tdƒ}| t	|ƒ¡ t
j ¡ }| |¡ |jt|ƒ  ¡ }|jt|ƒ  ¡ }|  |d¡ |  |d¡ d S )Nr   r   rj   Zwhile_net_testé   )r
   r	   r    ZWhileNetÚ	Conditionr$   r)   r   r:   r   r   r;   r<   r=   r>   r?   r@   ÚassertEqual)rB   rC   r&   r'   rJ   rK   Zx_valueZy_valuer   r   r   Útest_while_net9  s     



&

zTestNetBuilder.test_while_netN)r   r   r   rN   rW   r_   rd   rh   ro   rt   ry   r‚   r†   r   r   r   r   r6   R   s   
(@r6   )Zcaffe2.pythonr   Zcaffe2.python.corer   r   r   Zcaffe2.python.taskr   r   r   Zcaffe2.python.net_builderr	   r
   Zcaffe2.python.sessionr   Zunittestr   Úobjectr   r   r(   r*   r-   r5   ZTestCaser6   r   r   r   r   Ú<module>   s   
