U
    ‰dÄ  ã                   @   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    ú?/tmp/pip-unpacked-wheel-ua33x9lu/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sZt	‚d S )NÚTimeObserveré   )
r   r   ÚAddObserverr   ÚRunNetÚprintÚaverage_timeZNumObserversÚRemoveObserverÚAssertionError)r   ÚobÚnumr    r    r!   ÚtestObserver   s    zTestObservers.testObserverr$   r   )Ú
num_layersÚforward_onlyiè  )Údeadlinec                 C   sì  dddg}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¡}|sz| |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   é
   r   Úseq_lengthsr   ÚtargetÚhidden_initr$   Ú	cell_initZlstm)ÚnameÚinputzhidden_init_{}zcell_init_{}T)	r   Z
input_blobr3   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>†   s      z;TestObservers.test_observer_rnn_executor.<locals>.<genexpr>N)'ÚlenÚranger   r   r   r   ÚarrayZ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TseqZ
batch_sizeZ	input_dimZ
hidden_dimZrun_cntZavg_timeÚjÚTr   Z
init_blobsÚir5   r6   ÚoutputZlast_hiddenÚ_Z
last_stater:   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RecurrentNetworkrG   r$   r   )ZProtoÚopÚtypeÚ
startswithÚargr7   rO   rL   )r   r   r   r/   Z	num_foundrS   rV   r    r    r!   rG      s    

z!TestObservers.enable_rnn_executorN)Ú__name__Ú
__module__Ú__qualname__r"   r-   r   ÚstZintegersZbooleansr   rR   rG   r    r    r    r!   r      s   
þdr   )Znumpyr   ZunittestZ
hypothesisr   r   Zhypothesis.strategiesZ
strategiesrZ   Zcaffe2.pythonr   r   r   r   Zcaffe2.python.workspacer	   Z	workspacer   ZTestCaser   r    r    r    r!   Ú<module>   s   