a
    ==icv,                     @   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   o/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/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   s   t d} t d}t  Z t t | t dg t | t dg| g t |t dg|g W d    n1 s|0    Y  |S )N   r   r   )r	   Constloopstop_ifEQAddxyr   r   r   
_test_loop"   s    


6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 d    n1 s00    Y  t d}t  }t| W d    n1 sj0    Y  t  }t d W d    n1 s0    Y  t  }W d    n1 s0    Y  | | | | fS )N
      r   )r	   r    Z
stop_guardr*   Zhas_stopped)r&   g1r'   g2Zg4Zg3r   r   r   _test_outer0   s    

&

&
(
r/   c                 C   s   t d}t t | t dg t jd|d W d    n1 sH0    Y  t t | t dg4 t jd|d t   t jd|d W d    n1 s0    Y  |S )Nr   2      Zblob_outr,      )r	   r    IfGTr)   stopr%   r   r   r   _test_ifG   s    
,,r7   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  @}t }t \}}}}ttd}ttd}W d    n1 sL0    Y  td}	|	t| t	j
 }
|
|	 |df|df|df|df|df|df|dfg}|D ]&\}}|
jt|  }| || qd S )	NK      namer   FTr1   r,   )r
   r(   r/   r7   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   r0   )range)	rD   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R}t | t dg}t | }t || g}t t |t dg"}	t ||g|g W d    n1 s0    Y  |	t |t dg"}	t ||g|g W d    n1 s0    Y  |		 " t ||g|g W d    n1 s>0    Y  t ||g| W d    n1 sn0    Y  W d    n1 s0    Y  dd ||||fD S )Nr   r+   rQ   r0   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$   r4   ZGEZElifElse)
rD   rS   rT   rU   rV   r!   rW   innerrX   cr   r   r   _actual_loop|   s$    



02
2P
zTestNetBuilder._actual_loopc                 C   s   t  V}td}td}|||dg|g t| t| t|}W d    n1 sb0    Y  t *}|| | 	d|
  W d    n1 s0    Y  d S )Nr   Zmy_netr   r1   )r   r	   r    r   r$   netr   r   r?   rC   rB   )rD   taskrS   rb   resultsessionr   r   r   test_net_multi_use   s    


&
z!TestNetBuilder.test_net_multi_usec                 C   s   t  }|  }W d    n1 s$0    Y  t P}|| |  }dd |D }t||D ]\}}| || q`W d    n1 s0    Y  d S )Nc                 S   s   g | ]}|  qS r   )rB   )rZ   or   r   r   r[          z-TestNetBuilder.test_loops.<locals>.<listcomp>)r   ra   r   r?   rY   ziprC   )rD   rc   Z
out_actualre   rN   rO   erH   r   r   r   
test_loops   s    &
zTestNetBuilder.test_loopsc              	   C   s  t  }t  td}W d    n1 s20    Y  t||g}t  td}W d    n1 sr0    Y  t||g}t  t||g}W d    n1 s0    Y  t||g}t||g|g t||g}t|}	t|}
t|}W d    n1 s0    Y  t J}|| | 	|	
 d | 	|

 d | 	|
 d W d    n1 s~0    Y  d S )Nr   r,         )r   r	   	task_initr    r$   	task_exitr   r   r?   rC   rB   )rD   rc   onetwothreeaccumZseven_1sixZseven_2Zo6Zo7_1Zo7_2re   r   r   r   
test_setup   s(    

(
(
,(
zTestNetBuilder.test_setupc              	   C   s   t ddP}td& ttg i fg g  W d   n1 sB0    Y  W d   n1 s`0    Y  t B}dt_dt_|	| | 
tjd | 
tjd W d   n1 s0    Y  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   r3   Nr      )r   r	   r!   Pythonr   r   r   r   r   r?   rC   )rD   rc   re   r   r   r   test_multi_instance_python_op   s    R
z,TestNetBuilder.test_multi_instance_python_opc                 C   s  d}d}t  .}t|d  t : tg dg}tg dg}tg dg}W d    n1 sh0    Y  t  tg dg}W d    n1 s0    Y  tg dg}t|. t| t| t| W d    n1 s0    Y  t Z t	|}	tt
|	|	g t| W d    n1 sH0    Y  W d    n1 sh0    Y  t	|}
tt
|
|
g t| W d    n1 s0    Y  t : tt	|}tt	|}tt	|}W d    n1 s0    Y  W d    n1 s&0    Y  W d    n1 sF0    Y  t ^}|| | | ||  | | ||d	   | | ||d	   W d    n1 s0    Y  d S )
Nr+      rw   Zglobal_counterZglobal_counter2Zglobal_counter3task_counterlocal_counterr1   )r   r   r	   rn   ZCreateCounterZtask_instance_initr!   ZCountUpZtask_instance_exitZRetrieveCountr\   ro   r   r   r?   rC   rB   )rD   ZNUM_INSTANCESZ	NUM_ITERStgZcounter1Zcounter2Zcounter3r|   r}   Zcount2Zcount3Ztotal1Ztotal2Ztotal3re   r   r   r   test_multi_instance   s>    

,
,

(

J
*
n
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 d    n1 s0    Y  t  tjd|d W d    n1 s0    Y  td}	ttd tjd|	d W d    n1 s0    Y  t  tjd|	d W d    n1 s<0    Y  tt||g td}
ttd|
g|g t||g}t| W d    n1 s0    Y  t : t||
g|
g ttd|g|g W d    n1 s0    Y  tt|
td	g0 tjd
|d t||g|g W d    n1 s`0    Y  W d    n1 s0    Y  t  W d    n1 s0    Y  W d    n1 s0    Y  t	d}|
t| tj }|| |jt|  }|jt|	  }|jt|  }|jt|  }|jt|  }| |d | |d | |d | |d | |d | t|
|jv d S )Nr   r   r1   Tr2   Fi  d   i  rm   Zif_net_testi  e   l   )r
   r	   r    ZIfNetr^   r)   r$   r5   r#   r   r<   r   r   r=   r>   r?   r@   rA   rB   rC   
assertTrue)rD   rE   Zx0x1Zx2Zy0y1y2Z	first_resZ
second_resZ
local_blobgtrL   rM   Zfirst_res_valueZsecond_res_valueZy0_valueZy1_valueZy2_valuer   r   r   test_if_net   s\    







,
,
.
.
 
8R
@

zTestNetBuilder.test_if_netc              
   C   s2  t  }td}td}t v t < t|tdg|g t|tdg W d    n1 sp0    Y  t||g|g W d    n1 s0    Y  W d    n1 s0    Y  td}|t	| t
j }|| |jt|  }|jt|  }| |d | |d d S )Nr   r   rm   Zwhile_net_test   )r
   r	   r    ZWhileNet	Conditionr$   r)   r   r<   r   r   r=   r>   r?   r@   rA   rB   assertEqual)rD   rE   r&   r'   rL   rM   Zx_valueZy_valuer   r   r   test_while_net9  s     



2N

zTestNetBuilder.test_while_netN)r   r   r   rP   rY   ra   rf   rk   ru   rz   r   r   r   r   r   r   r   r8   R   s   
(@r8   )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/   r7   ZTestCaser8   r   r   r   r   <module>   s   
