U
    ‰d.  ã                   @   s¨   d dl Zd dlmZmZmZmZmZ d dlm	Z	 d dl
m  mZ d dlmZ d dlmZ d dlmZmZ d dlZdd„ Zdd	„ ZG d
d„ dejƒZedkr¤e ¡  dS )é    N)Ú	workspaceÚmemongerÚcoreÚmodel_helperÚbrew)Ú
caffe2_pb2)Ú
viewvalues)ÚgivenÚsettingsc                 C   sH   | j D ]<}|jD ]}||kr  dS q|jD ]}||kr,  dS q,qdS )NTF)ÚopÚinputÚoutput)ÚprotoÚneedler   ÚinpÚoutp© r   ú?/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/memonger_test.pyÚhas_blob   s    



r   c                 C   s6   t ƒ }| jD ] }| t |jƒ¡ t |jƒ¡}qt|ƒS )N)Úsetr   Úunionr   r   Úlen)r   Zblobsr   r   r   r   Úcount_blobs   s    
r   c                   @   sò  e Zd Zeejdddejdddejddde ej¡e e	j
¡deddddd	„ ƒƒZeejdddejdddejddde ej¡d
eddddd„ ƒƒZdd„ Zeejdddejdddejdddddd„ ƒZe ej d¡dd„ ƒZeejdddejdddejddddedddd„ ƒƒZeejdddejdddejddddedddd„ ƒƒZeejdddejdddejddddedddd„ ƒƒZedd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!d3d4„ Z"eejdddejdddejddddd5d6„ ƒZ#eejdddejdddejddddd7d8„ ƒZ$eejdddejdddejddddd9d:„ ƒZ%eejdddejdddejddddd;d<„ ƒZ&d=d>„ Z'dS )?ÚMemongerTesté   é
   )Z	min_valueZ	max_value)Ú	input_dimÚ
output_dimÚ
batch_sizeÚdoÚalgoé   N)Zmax_examplesÚdeadlinec                 C   sD  t  ¡ }tj|dd||d}tj||d||d}tj||d||d}	|	 g |	¡ g d¡ dgdg¡ g d	¡ | d	g¡}
|j	 
¡ j |¡ |j 
¡ j |¡ d
d„ |j 
¡ jD ƒddd	|
d g }tj| 
¡ ||d}tj ||¡ tj¡}tjjd||fd tj¡}t |j¡ tjd||d tjd||d t |j	¡ t d	¡}t t|
d ƒ¡}t |j	¡ t d	¡}t t|
d ƒ¡}tj ||¡ tj ||¡ t |j ¡}|  !|j"|j#¡ t $| 
¡ ¡}tj| 
¡ |||d}t |j	¡ t d	¡}t t|
d ƒ¡}tj ||¡ tj ||¡ t |j ¡}|  %|j"|j#¡ d S )NÚdataÚfc1©Údim_inÚdim_outÚfc2Úfc3ÚpredÚlabelÚxentÚlossc                 S   s   g | ]}|j D ]}|‘qqS r   ©r   ©Ú.0r   Úor   r   r   Ú
<listcomp>3   s       z5MemongerTest.test_simple_memonger.<locals>.<listcomp>Úfc1_w)r    r   ©ÚlowÚhighÚsize©Údevice_option)Ú
blob_sizesr    )&r   ÚModelHelperr   ÚfcÚReluÚSoftmaxÚLabelCrossEntropyÚAveragedLossÚAddGradientOperatorsÚnetÚProtor9   ÚCopyFromÚparam_init_netr   r   Zoptimize_interferenceÚnpÚrandomÚrandnÚastypeÚfloat32ÚrandintÚint32r   Ú
RunNetOnceÚFeedBlobÚ	FetchBlobÚstrÚtestingÚassert_almost_equalZcompute_statisticsZassignmentsÚ
assertLessZoptimized_nbytesZbaseline_nbytesZcollect_blob_sizesÚassertLessEqual)Úselfr   r   r   r   r    Úmr$   r(   r)   Úinput_to_gradÚstatic_blobsÚoptimizationr#   r+   r-   ÚgradÚoptimized_lossÚoptimized_gradÚstatsr:   Zoptimization1r   r   r   Útest_simple_memonger   sz     ÿ þ ýÿÿ  ÿ  ÿÿ

   ÿ
z!MemongerTest.test_simple_memonger)r   r   r   r   c                 C   s¶  t  ¡ }tj|dd||d}tj||d||d}tj||d||d}| g |¡ g d¡ dgdg¡ g d	¡ | d	g¡}	|j	 
¡ j |¡ |j 
¡ j |¡ d
d„ |j 
¡ jD ƒddd	|	d g }
t | 
¡ |
¡}tj ||¡ tj¡}tjjd||fd tj¡}t |j¡ tjd||d tjd||d t |j	¡ t d	¡}t t|	d ƒ¡}t |¡ t d	¡}t t|	d ƒ¡}tj ||¡ tj ||¡ |  t |ƒt | 
¡ ƒ¡ d S )Nr#   r$   r%   r(   r)   r*   r+   r,   r-   c                 S   s   g | ]}|j D ]}|‘qqS r   r.   r/   r   r   r   r2   h   s       z3MemongerTest.test_fast_memonger.<locals>.<listcomp>r3   r   r4   r8   )!r   r;   r   r<   r=   r>   r?   r@   rA   rB   rC   r9   rD   rE   r   r   Úoptimize_inference_fastrF   rG   rH   rI   rJ   rK   rL   r   rM   rN   rO   rP   rQ   rR   rS   r   )rU   r   r   r   r   rV   r$   r(   r)   rW   rX   Úoptimized_netr#   r+   r-   rZ   r[   r\   r   r   r   Útest_fast_memongerU   sZ     ÿ þ ýÿÿ ÿ  ÿÿ


zMemongerTest.test_fast_memongerc              	   C   s  t  ¡ }g }tdƒD ].}tj|d |¡d |¡ddd}| |¡ qg }|D ]&}|D ]}| t |||gd¡¡ qTqLt ||d¡}t 	||d¡ dd	„ |j
 ¡ jD ƒdg d
d	„ tt|ƒƒD ƒ }	t | ¡ |	¡}
|
jD ]&}|  t|jƒtt|jƒƒt|ƒ¡ qØd S )Né   údata{}r<   r%   r   ÚconcatedÚmergedc                 S   s   g | ]}|j D ]}|‘qqS r   r.   r/   r   r   r   r2   Ž   s       zBMemongerTest.test_fast_memonger_unique_outputs.<locals>.<listcomp>c                 S   s   g | ]}d   |¡‘qS )rc   )Úformat)r0   Úir   r   r   r2      s     )r   r;   Úranger   r<   rf   ÚappendÚsumÚconcatZrelurE   rC   r   r   r   r_   ÚassertEqualr   r   rP   )rU   rV   r<   rg   ÚzÚrÚxÚyrd   rX   r`   r   r   r   r   Ú!test_fast_memonger_unique_outputs~   s:        ÿÿÿÿ ÿ
z.MemongerTest.test_fast_memonger_unique_outputsé   )r   r   r   c              
   C   s„  t  ¡ }t d¡’ tj|dd||d}tj||d||d}tj||d||d}tj||d||d}tj||d||d}	|	 g |	¡ g d	¡ d
gdg¡ 	g d¡ W 5 Q R X | 
dg¡}
t|j ¡ ƒ}tj|jdgtt|jƒƒddd}t|ƒ}|  ||¡ tj|jdgtt|jƒƒddtt|
d ƒgƒd}t|ƒ}|  ||¡ |  t|dƒ¡ |  t|dƒd¡ tj ||¡ tj¡}tjjd||fd tj¡}t  |j!¡ t "d|¡ t "d|¡ t  |j¡ t #d¡}t #t|
d ƒ¡}t  |¡ t #d¡}t #t|
d ƒ¡}tj$ %||¡ tj$ %||¡ t "t|
d ƒt &dg¡¡ t  |¡ t #d¡}t #t|
d ƒ¡}tj$ %||¡ tj$ %||¡ d S )NÚname_xr#   r$   r%   r(   r)   Úfc4Úfc5r*   r+   r,   r-   zname_x/lossúname_x/F)Úshare_activationsTúname_x/fc1_w©rw   Zdont_share_blobsú
name_x/fc5zDont remap final activationr   r4   úname_x/dataúname_x/labelç        )'r   r;   r   Ú	NameScoper   r<   r=   r>   r?   r@   rA   r   rB   rC   r   Úshare_grad_blobsr   r   Úparam_to_gradrS   rP   rT   Ú
assertTruer   rF   rG   rH   rI   rJ   rK   rL   r   rM   rE   rN   rO   rQ   rR   Úarray)rU   r   r   r   rV   r$   r(   r)   rt   ru   rW   Úblobs_beforeÚoptim_protoÚblobs_afterZoptim_proto_wactsZblobs_wact_optimr#   r+   r-   rZ   r[   r\   r   r   r   Útest_gradient_optim–   sˆ     ÿ þ ýûúþ  ÿÿ




z MemongerTest.test_gradient_optimzNo gpu support.c              	   C   sæ  t  ¡ }t t tjd¡¡d tj|ddddd}tj||dddd}tj||dddd}tj||dddd}|j	 
|d	¡}W 5 Q R X t t tjd¡¡j tj||d
ddd}tj||dddd}tj||dddd}	|	 g |	¡ g d¡ dgdg¡ g d¡ W 5 Q R X | dg¡ t|j	 ¡ ƒ}
tj|j	dgtt|jƒƒddtƒ d}t|ƒ}|  ||
¡ tjtƒ tjtƒ i}|jD ]D}|jdkrx|jj}t|jƒt|j ƒ D ]}||  !|¡ q¤qx|tj  "|tj ¡}|  #|tƒ ¡ dS )zP
        Check that memonger does not make blobs cross CPU/GPU boundary
        r   r#   r$   rb   r%   r(   r)   rt   Úfc4_cpuÚfc5_cpuÚfc6_cpuÚfc7_cpur*   r+   r,   r-   Ú Try   )ZCopyCPUToGPUÚCopyGPUToCPUN)$r   r;   r   ZDeviceScopeZDeviceOptionr   ZGpuDeviceTyper   r<   rB   rŒ   r   ZCPUr=   r>   r?   r@   rA   r   rC   r   r   r   r   r€   rS   r   Útyper9   Zdevice_typeÚlistr   r   ÚaddÚintersectionZassertEquals)rU   rV   r$   r(   r)   rt   r‡   rˆ   r‰   rŠ   rƒ   r„   r…   Zdevice_blobsr   ÚdevÚbZdevice_crossersr   r   r   Útest_memonger_mix_cpu_gpuÝ   sV     ÿ þ ýú

ÿz&MemongerTest.test_memonger_mix_cpu_gpuiè  )r"   c                 C   s`  t  ¡ }t d¡Î tj|dd||d}tj||d||d}tj||d||d}tj||d||d}tj||d||d}	|	 g |	¡ g d	¡ d
gdg¡ 	g d¡ tj||	d||d}
|
 g |
¡ g d¡ d
gdg¡ 	g d¡ W 5 Q R X | 
ddg¡}t|j ¡ ƒ}tj|jddgtt|jƒƒddtddt|d ƒgƒd}t|ƒ}|  ||¡ |  t|dƒ¡ tj ||¡ tj¡}tjjd||fd tj¡}t |j ¡ t !d|¡ t !d|¡ t |j¡ t "d¡}t "d¡}t "t|d ƒ¡}t !t|d ƒt #dg¡¡ t |¡ t "d¡}t "d¡}t "t|d ƒ¡}tj$ %||¡ tj$ %||¡ tj$ %||¡ d S )Nrs   r#   r$   r%   r(   r)   rt   ru   Úpred1r+   Úxent1Úloss1Úfc6Úpred2Úxent2Úloss2úname_x/loss1úname_x/loss2Tz
name_x/fc6rz   rx   ry   r   r4   r{   r|   r}   )&r   r;   r   r~   r   r<   r=   r>   r?   r@   rA   r   rB   rC   r   r   r   r   r€   rP   rS   r   r   rF   rG   rH   rI   rJ   rK   rL   r   rM   rE   rN   rO   r‚   rQ   rR   )rU   r   r   r   rV   r$   r(   r)   rt   ru   r—   rW   rƒ   r„   r…   r#   r+   r–   rš   rZ   Úoptimized_loss1Úoptimized_loss2r\   r   r   r   Útest_gradient_optim_tree  s„     ÿ þ ý ÿ þ ý
ÿú	  ÿÿ




z%MemongerTest.test_gradient_optim_treec              	   C   s2  t  ¡ }d| ¡ _d| ¡ _t d¡ tj|dd||d}tj||d||d}tj||d||d}tj||d	||d}tj||d
||d}	tj||d||d}
tj||
d||d}tj||d||d}t 	||	|gd¡}|	 
g |¡ g d¡ dgdg¡ g d¡ tj||	d||d}| 
g |¡ g d¡ dgdg¡ g d¡ W 5 Q R X t|j ¡ ƒ}t |jdgd¡}t|ƒ}|  ||¡ tj ||¡ tj¡}tjjd||fd tj¡}t |j¡ t d|¡ t d|¡ t |j¡ t d¡}t d¡}t |¡ t d¡}t d¡}tj  ||¡ tj  ||¡ d S )NÚdagrr   rs   r#   r$   r%   r(   r)   rt   ru   Úfc3bÚfc4bÚfc5bÚfc5sumr”   r+   r•   r–   r—   r˜   r™   rš   r{   r   r4   r|   r›   rœ   )!r   r;   rC   r   Únum_workersr   r~   r   r<   rj   r=   r>   r?   r@   r   rB   r   Úoptimize_inference_for_dagrS   rF   rG   rH   rI   rJ   rK   rL   r   rM   rE   rN   rO   rQ   rR   )rU   r   r   r   rV   r$   r(   r)   rt   ru   r¡   r¢   r£   r¤   r—   rƒ   r„   r…   r#   r+   r–   rš   r   rž   r   r   r   Útest_forward_optim_tree_daggyG  sz    

 ÿ þ ý ÿ þ ý  ÿ  ÿÿ




z*MemongerTest.test_forward_optim_tree_daggyi'  c              	   C   s‚  t  ¡ }d|j ¡ _d|j ¡ _|j d¡ |j d¡ t d¡ t	j
|dd||d}t	j
||d||d}t	j
||d	||d}t	j
||d
||d}t	j
||d||d}	t	j
||d||d}
t	j
||
d||d}t	j
||d||d}t	 ||	|gd¡}| g d¡ g d¡ dgdg¡ g d¡ t	j
||	d||d}| g |¡ g d¡ dgdg¡ g d¡ W 5 Q R X t|j ¡ ƒ}t |jdgd¡}t|ƒ}t |jddgd¡}t|ƒ}|  ||¡ tt|ƒƒ |  ||¡ tj ||¡ tj¡}tjjd||fd tj¡}t |j ¡ t !d|¡ t !d|¡ t |j¡ t "d¡}t "d¡}t |¡ t "d¡}t "d¡}tj# $||¡ tj# $||¡ d S ) Nr    rr   r+   r#   rs   r$   r%   r(   r)   rt   ru   r¡   r¢   r£   r¤   Zrelu1r”   r•   r–   r—   r˜   r™   rš   r{   rv   rx   r   r4   r|   r›   rœ   )%r   r;   rB   rC   r   r¥   ZAddExternalInputr   r~   r   r<   rj   r=   r>   r?   r@   r   r   r¦   rl   ÚprintrP   rS   rF   rG   rH   rI   rJ   rK   rL   r   rM   rE   rN   rO   rQ   rR   )rU   r   r   r   rV   r$   r(   r)   rt   ru   r¡   r¢   r£   r¤   r—   rƒ   r„   r…   Zoptim_proto_extra_inputZblobs_after_extra_inputr#   r+   r–   rš   r   rž   r   r   r   Útest_forward_optim_tree_harder€  sŽ     ÿ þ ý ÿ þ ý  ÿ  ÿ  ÿÿ




z+MemongerTest.test_forward_optim_tree_harderc              	   C   s  d}d}d}t  ¡ }d| ¡ _d| ¡ _t d¡ tj|dd||d}tj||d||d}tj||d||d}tj||d	||d}tj||d
||d}	tj||d||d}
tj||
d||d}tj||d||d}t 	||	|gd¡}|	 
g |¡ g d¡ dgdg¡ g d¡ tj||	d||d}| 
g |¡ g d¡ dgdg¡ g d¡ W 5 Q R X t|j ¡ ƒ}t |jddgd¡}t|ƒ}|  ||¡ d S )Nrr   r    rs   r#   r$   r%   r(   r)   rt   ru   r¡   r¢   r£   r¤   r”   r+   r•   r–   r—   r˜   r™   rš   zname_x/fc5_wr{   )r   r;   rC   r   r¥   r   r~   r   r<   rj   r=   r>   r?   r@   r   rB   r   r¦   rS   )rU   r   r   r   rV   r$   r(   r)   rt   ru   r¡   r¢   r£   r¤   r—   rƒ   r„   r…   r   r   r   Ú%test_forward_optim_tree_dag_traversalÈ  sZ    

 ÿ þ ý ÿ þ ý  ÿz2MemongerTest.test_forward_optim_tree_dag_traversalc              	   C   s„   t  ¡ }d| ¡ _d| ¡ _|j}| dd¡ | ddgd¡ | dd¡ | ddgd¡ |  	t
¡ t |dgd¡ W 5 Q R X d S ©	Nr    rr   ÚAÚBÚCÚDÚEr‹   )r   r;   rC   r   r¥   rB   ÚIndexFreezeÚSumr=   ÚassertRaisesÚRuntimeErrorr   r¦   )rU   rV   rB   r   r   r   Ú2test_forward_optim_tree_enforce_inplace_op_invalidõ  s    

z?MemongerTest.test_forward_optim_tree_enforce_inplace_op_invalidc                 C   sœ   t  ¡ }d| ¡ _d| ¡ _|j}| dd¡ | ddgd¡ | dd¡ | dd¡ | ddgd¡ t	|j ¡ ƒ}t
 |dgd¡}t	|ƒ}|  ||¡ d S r«   )r   r;   rC   r   r¥   rB   r±   r²   r=   r   r   r¦   rS   )rU   rV   rB   rƒ   r„   r…   r   r   r   Ú<test_forward_optim_tree_enforce_inplace_op_valid_and_as_head  s"    

  ÿzIMemongerTest.test_forward_optim_tree_enforce_inplace_op_valid_and_as_headc                 C   s   ddl m} d}t ¡ }|j dd¡\}}g }tdƒD ]0}|j d |¡d |¡¡\}}	| ||	g¡ q6|j	j
g d	g|d
dgd |j|d	||dddgddddd
\}
}}}|j | |
¡dgddg¡\}}| |g¡ t|j ¡ ƒ}tj|jdgtt|jƒƒddtƒ d}t|ƒ}|  ||¡ |D ]$}t |tjdd
dgtjd¡ q$t dtj|gd
 tjd¡ t dtj |¡  tj¡¡ t !|j	¡ t !|j¡ d S )Nr   )Úrnn_cellr!   Úseq_lengthsÚlabelsrb   zhidden_init_{}zcell_init_{}r   rr   r   )ÚshapeZlstm1FT)
ÚmodelZ
input_blobr¸   Zinitial_statesr&   r'   ZscopeZforward_onlyZdrop_statesZreturn_last_layer_onlyÚsoftmaxr-   r‹   ry   r   )Zdtype)"Úcaffe2.pythonr·   r   r;   rB   ZAddExternalInputsrh   rf   ÚextendrE   ZConstantFillZLSTMZSoftmaxWithLossZFlattenrA   r   rC   r   r   r   r   r€   rS   r   rN   rF   ÚzerosrJ   r‚   rL   rG   ZrandrI   rM   )rU   r·   ÚTr»   r¸   r¹   Z
init_blobsrg   Zhidden_initZ	cell_initr   Zlast_hiddenÚ_Z
last_stater¼   r-   rƒ   r„   r…   Z	init_blobr   r   r   Útest_rnn  sj     ÿÿþöþú
 ÿzMemongerTest.test_rnnc                 C   s\   t  ¡ }| dd¡ | dd¡ | dd¡ t |j ¡ j¡}|  t	| 
¡ ƒdddg¡ d S )NÚb1)r   r   )r   rb   )r   rb   )r   r;   ÚCopyr   Úcompute_interference_graphrB   rC   r   rl   rŽ   Úedges)rU   rV   Úgr   r   r   Ú+test_compute_interference_graph_inplace_opsR  s    z8MemongerTest.test_compute_interference_graph_inplace_opsc                 C   sª   t  ¡ }| dd¡ t |ddddd¡}| dd¡ t ||dd	dd¡ t |j ¡ j	¡}t 
|¡}d
dddg}|  |t|ƒ¡ t |¡}ddd
dg}|  |t|ƒ¡ d S )NÚconv0_w_compÚconv0_wr#   Úconv0é    rr   Úconv2_wÚconv2é   rb   r   r   é   ©r   r;   rÄ   r   Úconvr   rÅ   rB   rC   r   Útopological_sort_traversalrl   rŽ   Ú'topological_sort_traversal_longest_path©rU   rV   rË   rÇ   Ú
orders_orgÚorders_gt_orgÚordersÚ	orders_gtr   r   r   Ú"test_topological_sort_longest_pathZ  s    

z/MemongerTest.test_topological_sort_longest_pathc                 C   sÊ   t  ¡ }| dd¡ t |ddddd¡}| dd¡ t ||dd	dd¡ | d
d¡ | dd¡ t |j ¡ j	¡}t 
|¡}ddddddg}|  |t|ƒ¡ t |¡}ddddddg}|  |t|ƒ¡ d S )NrÉ   rÊ   r#   rË   rÌ   rr   rÍ   rÎ   rÏ   Zdata1Zdata2Zdata3r!   rb   r   r   rÐ   rÑ   rÕ   r   r   r   Ú/test_topological_sort_longest_path_multi_targetp  s    

z<MemongerTest.test_topological_sort_longest_path_multi_targetc                 C   sj   t  ¡ }| dd¡ t |j ¡ j¡}t |¡}dg}|  	|t
|ƒ¡ t |¡}dg}|  	|t
|ƒ¡ d S )NrÉ   rÊ   r   )r   r;   rÄ   r   rÅ   rB   rC   r   rÓ   rl   rŽ   rÔ   )rU   rV   rÇ   rÖ   r×   rØ   rÙ   r   r   r   Ú.test_topological_sort_longest_path_single_node‹  s    

z;MemongerTest.test_topological_sort_longest_path_single_nodec                 C   s   t j}d|dddƒfd|dddƒfd|dd	dƒfd
|dddƒfg}|d |d g|d |d gg}t  |d ¡}|  t  |¡d¡ |  ||¡ d S )NrÃ   r   rÐ   r   Úb2rr   Úb3r!   é   Úb4é   r   rb   é   )r   Ú	LiveRangeZcompute_assignments_greedyrl   Úget_memory_usage)rU   rã   Úranges_sortedZassignment_gtÚbestr   r   r   Útest_compute_assignments_greedyœ  s    üþz,MemongerTest.test_compute_assignments_greedyc                 C   sd   t j}d|dddƒfd|dddƒfd|dd	dƒfd
|dddƒfg}t  |d ¡}|  t  |¡d¡ d S )NrÃ   r   rÐ   r   rÝ   rr   rÞ   r!   rß   rà   rá   râ   ©r   rã   Zcompute_assignments_dprl   rä   ©rU   rã   rå   ræ   r   r   r   Útest_compute_assignments_dp­  s    üz(MemongerTest.test_compute_assignments_dpc                 C   sV   t j}d|dddƒfd|dddƒfd|d	ddƒfg}t  |g ¡}|  t  |¡d
¡ d S )NrÃ   r   rb   r   rÝ   rr   rß   rÞ   r!   râ   rè   ré   r   r   r   Útest_compute_assignments_dp1¹  s    ýz)MemongerTest.test_compute_assignments_dp1c           	   	   C   s"  t  ¡ }d| ¡ _d| ¡ _t d¡T tj|dd||d}tj||d||d}tj||d||d}t 	|||gd	¡ W 5 Q R X t  ¡ }d| ¡ _d| ¡ _t d¡T tj|dd
||d}tj||d||d}tj||d||d}t 	|||gd	¡ W 5 Q R X |  
t |j ¡ |j ¡ ¡¡ d S )Nr    rr   rs   r#   ro   r%   rp   rm   ÚoutZother_xZother_yZother_z©r   r;   rC   r   r¥   r   r~   r   r<   rj   r   r   Úverify_graph_equalityrB   ©	rU   r   r   r   rV   r$   r(   r)   Úm2r   r   r   Útest_verify_graph_equalityÄ  s"    



z'MemongerTest.test_verify_graph_equalityc              	   C   sr  t  ¡ }d| ¡ _d| ¡ _t d¡| tj|dd||d}tj||d||d}tj||d||d}tj||d	||d}tj||d
||d}	t 	|||	gd¡ W 5 Q R X t  ¡ }
d|
 ¡ _d|
 ¡ _t d¡| tj|
dd||d}tj|
|d||d}tj|
|d||d}tj|
|d||d}tj|
|d||d}	t 	|
||	gd¡ W 5 Q R X |  
t |j ¡ |
j ¡ ¡¡ d S ©Nr    rr   rs   r#   ro   r%   rp   rm   ÚuÚvrì   rí   ©rU   r   r   r   rV   r$   Zfc2aZfc2bZfc3ar¡   rð   r   r   r   Ú!test_verify_graph_equality_harderÜ  s*    



z.MemongerTest.test_verify_graph_equality_harderc           	   	   C   s"  t  ¡ }d| ¡ _d| ¡ _t d¡T tj|dd||d}tj||d||d}tj||d||d}t 	|||gd	¡ W 5 Q R X t  ¡ }d| ¡ _d| ¡ _t d¡T tj|dd||d}tj||d||d}tj||d||d}t 	|||gd	¡ W 5 Q R X |  
t |j ¡ |j ¡ ¡¡ d S )
Nr    rr   rs   r#   ro   r%   rp   rm   rì   ©r   r;   rC   r   r¥   r   r~   r   r<   rj   ÚassertFalser   rî   rB   rï   r   r   r   Útest_verify_graph_inequalityø  s"    



z)MemongerTest.test_verify_graph_inequalityc              	   C   sr  t  ¡ }d| ¡ _d| ¡ _t d¡| tj|dd||d}tj||d||d}tj||d||d}tj||d	||d}tj||d
||d}	t 	|||	gd¡ W 5 Q R X t  ¡ }
d|
 ¡ _d|
 ¡ _t d¡| tj|
dd||d}tj|
|d||d}tj|
|d||d}tj|
|d	||d}tj|
|d
||d}	t 	|
||	gd¡ W 5 Q R X |  
t |j ¡ |
j ¡ ¡¡ d S rò   r÷   rõ   r   r   r   Ú#test_verify_graph_inequality_harder  s*    



z0MemongerTest.test_verify_graph_inequality_harderc                 C   s"  t  ¡ }tj|ddddd}tj||dddd}tj||dddd}tj||dddd}|j dgdg¡ t |||gd	¡ t |j 	¡ t
dƒ¡}dddh}t
ƒ }|jD ]h}	|	jd
krÜ|  |	jd |k¡ | |	jd ¡ q¨|	jD ]}
|  |
|k¡ qâ|	jD ]}|  ||k¡ qüq¨|  ||¡ d S )Nr#   ro   rb   r%   rp   rm   ró   Zu_aliasrì   ZFreer   )r   r;   r   r<   rB   ZAliasrj   r   Zrelease_blobs_when_usedrC   r   r   r   rø   r   r   r   rl   )rU   rV   r$   r(   r)   rt   Z
with_freesZexpect_freesZfound_freesr   r   r   r   r   r   Útest_release_blobs_when_used,  s&    




z)MemongerTest.test_release_blobs_when_used)(Ú__name__Ú
__module__Ú__qualname__r	   ÚstZintegersZsampled_fromÚhuZdevice_optionsr   ZAssignmentAlgorithmr
   r^   ra   rq   r†   ÚunittestZskipIfr   Zhas_gpu_supportr“   rŸ   r§   r©   rª   rµ   r¶   rÂ   rÈ   rÚ   rÛ   rÜ   rç   rê   rë   rñ   rö   rù   rú   rû   r   r   r   r   r      s”   

ü
0
ý
$þ
D
/þ6þ5þD
,9þ
þ
þ
þ
r   Ú__main__)ZnumpyrF   r½   r   r   r   r   r   Zcaffe2.protor   Z"caffe2.python.hypothesis_test_utilÚpythonZhypothesis_test_utilr   Zfuture.utilsr   Zhypothesis.strategiesZ
strategiesrÿ   Z
hypothesisr	   r
   r  r   r   ZHypothesisTestCaser   rü   Úmainr   r   r   r   Ú<module>   s$         1