a
    ==icÄ  ã                   @   sl   d dl Zd dlZd dlmZmZ d dlmZ d dl	m
Z
mZmZmZ d dlm  mZ G dd„ dejƒZdS )é    N)ÚgivenÚsettings)ÚbrewÚcoreÚmodel_helperÚrnn_cellc                   @   sN   e Zd Zdd„ Zdd„ Zee dd¡e ¡ de	dd	d
d„ ƒƒZ
dd„ ZdS )ÚTestObserversc                 C   sˆ   t  ddg¡ t ¡  t ¡ | _tj| jdddddt	dd	fdt	d
d	fdd t 
dtjdgdd¡ t | jj¡ t | jj¡ d S )NÚpythonZcaffe2ÚdataÚyé   é   ZConstantFillg      ð?)Úvalueg        r   )Údim_inÚdim_outZweight_initZ	bias_initZaxisÚfloat32©Zdtype)r   Z
GlobalInitÚwsÚResetWorkspacer   ÚModelHelperÚmodelr   ZfcÚdictÚFeedBlobÚnpÚzerosÚ
RunNetOnceÚparam_init_netÚ	CreateNetÚnet)Úself© r    úl/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/caffe2/python/observer_test.pyÚsetUp   s    
üzTestObservers.setUpc                 C   s^   | j j d¡}t | j j¡ t| ¡ ƒ | j j ¡ }| j j |¡ | j j ¡ d |ksZJ ‚d S )NÚTimeObserveré   )	r   r   ÚAddObserverr   ÚRunNetÚprintÚaverage_timeZNumObserversÚRemoveObserver)r   ÚobÚnumr    r    r!   ÚtestObserver   s    zTestObservers.testObserverr$   r   )Ú
num_layersÚforward_onlyiè  )Údeadlinec                 C   sê  g d¢}d}d}d}dgt |ƒ }dgt |ƒ }tt |ƒƒD ]J}	||	 }
t ¡  t dtj|
g| tjd¡ t dtj 	|
||¡ 
tj¡¡ t dtjd	||gtjd¡ t d
tjd	||gtjd¡ tjdd}|j dg¡ g }t|ƒD ]0}|j d |¡d |¡¡\}}| ||g¡ qòtj|dd|||g| d|dd	\}}}}| | |dgd¡d¡}|sx| |g¡ |D ]$}t |tjd	||gtjd¡ q|t |j¡ |  |jd	|¡ tj d¡ |
||g}t dtjj	|Ž  
tj¡¡ t dtj 	|
||¡ 
tj¡¡ tj|jdd |j d¡}|j d¡}t |j¡ | ¡ ||	< t d !dd„ | "¡ D ƒ¡ƒ||	< |j #|¡ |j #|¡ q<t$|ƒ t$|ƒ |  %|d	 |d ko¾|d |d	 k¡ |  &|d	 |d  |d |d	  ¡ dS )z’
        Test that the RNN executor produces same results as
        the non-executor (i.e running step nets as sequence of simple nets).
        )r   é   r   é
   r0   r   Úseq_lengthsr   ÚtargetÚhidden_initr$   Ú	cell_initZlstm)ÚnameÚinputzhidden_init_{}zcell_init_{}T)	r   Z
input_blobr2   Zinitial_statesr   r   Zdrop_statesr.   Zreturn_last_layer_onlyÚdistÚlossiì˜ )Ú	overwriter#   ZRunCountObserverÚ c                 s   s   | ]}|  ¡ r|V  qd S )N)Úisdigit)Ú.0Úxr    r    r!   Ú	<genexpr>†   ó    z;TestObservers.test_observer_rnn_executor.<locals>.<genexpr>r   N)'ÚlenÚranger   r   r   r   ÚarrayÚint32ÚrandomZrandZastyper   r   r   r   r   ZAddExternalInputsÚformatÚextendr   ZLSTMZAveragedLossZSquaredL2DistanceZAddGradientOperatorsr   r   Úenable_rnn_executorÚseedr   r%   r&   r(   ÚintÚjoinZ
debug_infor)   r'   Ú
assertTrueÚassertEqual)r   r-   r.   ZTseqÚ
batch_sizeZ	input_dimZ
hidden_dimZrun_cntZavg_timeÚjÚTr   Z
init_blobsÚir4   r5   ÚoutputZlast_hiddenÚ_Z
last_stater9   Z	init_blobZinput_shapeZtime_obZ
run_cnt_obr    r    r!   Útest_observer_rnn_executor&   s¨    þÿÿ
ÿ
ÿþ÷þ
ÿ
þýüþ (z(TestObservers.test_observer_rnn_executorc                 C   s\   d}|  ¡ jD ]4}|j d¡r|jD ]}|jdkr$||_|d7 }q$q|  |rPdnd|¡ d S )Nr   ZRecurrentNetworkrH   r$   r   )ZProtoÚopÚtypeÚ
startswithÚargr6   rQ   rM   )r   r   r   r.   Z	num_foundrU   rX   r    r    r!   rH      s    

z!TestObservers.enable_rnn_executorN)Ú__name__Ú
__module__Ú__qualname__r"   r,   r   ÚstZintegersZbooleansr   rT   rH   r    r    r    r!   r      s   
þdr   )Únumpyr   ZunittestZ
hypothesisr   r   Zhypothesis.strategiesÚ
strategiesr\   Zcaffe2.pythonr   r   r   r   Zcaffe2.python.workspacer	   Z	workspacer   ZTestCaser   r    r    r    r!   Ú<module>   s   