a
    ==ic.  ã                   @   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   úl/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/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é   é
   )Ú	min_valueÚ	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   ó    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ÚProtor<   Ú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   sf    ÿþýÿÿ
ÿÿÿ

ÿ
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   r0   r1   r   r   r   r4   h   r5   z3MemongerTest.test_fast_memonger.<locals>.<listcomp>r6   r   r7   r;   )!r   r>   r   r?   r@   rA   rB   rC   rD   rE   rF   r<   rG   rH   r   r   Úoptimize_inference_fastrI   rJ   rK   rL   rM   rN   rO   r   rP   rQ   rR   rS   rT   rU   rV   r   )rX   r   r   r    r!   rY   r&   r*   r+   rZ   r[   Úoptimized_netr%   r-   r/   r]   r^   r_   r   r   r   Útest_fast_memongerU   sN    ÿþýÿÿÿÿÿ


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   r0   r1   r   r   r   r4   Ž   r5   zBMemongerTest.test_fast_memonger_unique_outputs.<locals>.<listcomp>c                 S   s   g | ]}d   |¡‘qS )rf   )Úformat)r2   Úir   r   r   r4      r5   )r   r>   Úranger   r?   ri   ÚappendÚsumÚconcatZrelurH   rF   r   r   r   rb   ÚassertEqualr   r   rS   )rX   rY   r?   rj   ÚzÚrÚxÚyrg   r[   rc   r   r   r   r   Ú!test_fast_memonger_unique_outputs~   s0    ÿÿÿÿÿ
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 d   ƒ n1 s´0    Y  | 
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©rz   Zdont_share_blobsú
name_x/fc5zDont remap final activationr   r7   úname_x/dataúname_x/labelç        )'r   r>   r   Ú	NameScoper   r?   r@   rA   rB   rC   rD   r   rE   rF   r   Úshare_grad_blobsr   r   Úparam_to_gradrV   rS   rW   Ú
assertTruer   rI   rJ   rK   rL   rM   rN   rO   r   rP   rH   rQ   rR   rT   rU   Úarray)rX   r   r   r    rY   r&   r*   r+   rw   rx   rZ   Úblobs_beforeÚoptim_protoÚblobs_afterZoptim_proto_wactsZblobs_wact_optimr%   r-   r/   r]   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¡¡n 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 d
  ƒ n1 s0    Y  t t tjd¡¡t 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 d
  ƒ n1 s*0    Y  | 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vr¢|jj}t|jƒt|j ƒ D ]}||  !|¡ qÎq¢|tj  "|tj ¡}|  #|tƒ ¡ d
S )zP
        Check that memonger does not make blobs cross CPU/GPU boundary
        r   r%   r&   re   r'   r*   r+   rw   Úfc4_cpuNÚfc5_cpuÚfc6_cpuÚfc7_cpur,   r-   r.   r/   Ú Tr|   )ZCopyCPUToGPUÚCopyGPUToCPU)$r   r>   r   ZDeviceScopeZDeviceOptionr   ZGpuDeviceTyper   r?   rE   r   r   ZCPUr@   rA   rB   rC   rD   r   rF   r   r‚   r   r   rƒ   rV   r   Útyper<   Zdevice_typeÚlistr   r   ÚaddÚintersectionZassertEquals)rX   rY   r&   r*   r+   rw   rŠ   r‹   rŒ   r   r†   r‡   rˆ   Zdevice_blobsr   ÚdevÚbZdevice_crossersr   r   r   Útest_memonger_mix_cpu_gpuÝ   sP    ,ÿþý$ú

ÿz&MemongerTest.test_memonger_mix_cpu_gpuiè  )r$   c                 C   st  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 d   ƒ n1 sð0    Y  | 
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 )Nrv   r%   r&   r'   r*   r+   rw   rx   Úpred1r-   Úxent1Úloss1Úfc6Úpred2Úxent2Úloss2úname_x/loss1úname_x/loss2Tz
name_x/fc6r}   r{   r|   r   r7   r~   r   r€   )&r   r>   r   r   r   r?   r@   rA   rB   rC   rD   r   rE   rF   r   r‚   r   r   rƒ   rS   rV   r„   r   rI   rJ   rK   rL   rM   rN   rO   r   rP   rH   rQ   rR   r…   rT   rU   )rX   r   r   r    rY   r&   r*   r+   rw   rx   rš   rZ   r†   r‡   rˆ   r%   r-   r™   r   r]   Úoptimized_loss1Úoptimized_loss2r_   r   r   r   Útest_gradient_optim_tree  st    ÿþýÿþý"
ÿú	ÿÿ




z%MemongerTest.test_gradient_optim_treec                 C   sH  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 d   ƒ n1 sV0    Y  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Údagru   rv   r%   r&   r'   r*   r+   rw   rx   Úfc3bÚfc4bÚfc5bÚfc5sumr—   r-   r˜   r™   rš   r›   rœ   r   r~   r   r7   r   rž   rŸ   )!r   r>   rF   r   Únum_workersr   r   r   r?   rm   r@   rA   rB   rC   r   rE   r   Úoptimize_inference_for_dagrV   rI   rJ   rK   rL   rM   rN   rO   r   rP   rH   rQ   rR   rT   rU   )rX   r   r   r    rY   r&   r*   r+   rw   rx   r¤   r¥   r¦   r§   rš   r†   r‡   rˆ   r%   r-   r™   r   r    r¡   r   r   r   Útest_forward_optim_tree_daggyG  sf    

ÿþýÿþý$
ÿÿÿ




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 d   ƒ n1 sr0    Y  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£   ru   r-   r%   rv   r&   r'   r*   r+   rw   rx   r¤   r¥   r¦   r§   Zrelu1r—   r˜   r™   rš   r›   rœ   r   r~   ry   r{   r   r7   r   rž   rŸ   )%r   r>   rE   rF   r   r¨   ZAddExternalInputr   r   r   r?   rm   r@   rA   rB   rC   r   r   r©   ro   ÚprintrS   rV   rI   rJ   rK   rL   rM   rN   rO   r   rP   rH   rQ   rR   rT   rU   )rX   r   r   r    rY   r&   r*   r+   rw   rx   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€  sv    ÿþýÿþý$
ÿÿÿÿ




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 d   ƒ n1 sb0    Y  t|j ¡ ƒ}t |jddgd¡}t|ƒ}|  ||¡ d S )Nru   r£   rv   r%   r&   r'   r*   r+   rw   rx   r¤   r¥   r¦   r§   r—   r-   r˜   r™   rš   r›   rœ   r   zname_x/fc5_wr~   )r   r>   rF   r   r¨   r   r   r   r?   rm   r@   rA   rB   rC   r   rE   r   r©   rV   )rX   r   r   r    rY   r&   r*   r+   rw   rx   r¤   r¥   r¦   r§   rš   r†   r‡   rˆ   r   r   r   Ú%test_forward_optim_tree_dag_traversalÈ  sJ    

ÿþýÿþý$ÿ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 d   ƒ n1 sŠ0    Y  d S ©	Nr£   ru   ÚAÚBÚCÚDÚErŽ   )r   r>   rF   r   r¨   rE   ÚIndexFreezeÚSumr@   ÚassertRaisesÚRuntimeErrorr   r©   )rX   rY   rE   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>   rF   r   r¨   rE   r´   rµ   r@   r   r   r©   rV   )rX   rY   rE   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g d¢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Úlabelsre   zhidden_init_{}zcell_init_{}r   ru   r   )ÚshapeZlstm1FT)
ÚmodelZ
input_blobr»   Zinitial_statesr(   r)   ÚscopeZforward_onlyZdrop_statesZreturn_last_layer_onlyÚsoftmaxr/   rŽ   r|   )r   ru   r   )Zdtype)"Úcaffe2.pythonrº   r   r>   rE   ZAddExternalInputsrk   ri   ÚextendrH   ZConstantFillZLSTMZSoftmaxWithLossZFlattenrD   r   rF   r   r‚   r   r   rƒ   rV   r   rQ   rI   ZzerosrM   r…   rO   rJ   ZrandrL   rP   )rX   rº   ÚTr¾   r»   r¼   Z
init_blobsrj   Zhidden_initZ	cell_initr   Zlast_hiddenÚ_Z
last_staterÀ   r/   r†   r‡   rˆ   Z	init_blobr   r   r   Útest_rnn  sf    ÿÿþöþú

ÿzMemongerTest.test_rnnc                 C   sZ   t  ¡ }| dd¡ | dd¡ | dd¡ t |j ¡ j¡}|  t	| 
¡ ƒg d¢¡ d S )NÚb1))r   r   )r   re   )r   re   )r   r>   ÚCopyr   Úcompute_interference_graphrE   rF   r   ro   r‘   Úedges)rX   rY   Ú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 
|¡}g d
¢}|  |t|ƒ¡ t |¡}g d¢}|  |t|ƒ¡ d S )NÚconv0_w_compÚconv0_wr%   Úconv0é    ru   Úconv2_wÚconv2é   )re   r   r   é   )r   r   re   rÓ   ©r   r>   rÇ   r   Úconvr   rÈ   rE   rF   r   Útopological_sort_traversalro   r‘   Ú'topological_sort_traversal_longest_path©rX   rY   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 
|¡}g d¢}|  |t|ƒ¡ t |¡}g d¢}|  |t|ƒ¡ d S )NrÌ   rÍ   r%   rÎ   rÏ   ru   rÐ   rÑ   rÒ   Zdata1Zdata2Zdata3)ru   r#   re   r   r   rÓ   )r   r   re   rÓ   ru   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È   rE   rF   r   rÖ   ro   r‘   r×   )rX   rY   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   Úb2ru   Úb3r#   é   Úb4é   r   re   é   )r   Ú	LiveRangeZcompute_assignments_greedyro   Úget_memory_usage)rX   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à   ru   rá   r#   râ   rã   rä   rå   ©r   ræ   Zcompute_assignments_dpro   rç   ©rX   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   re   r   rà   ru   râ   rá   r#   rå   rë   rì   r   r   r   Útest_compute_assignments_dp1¹  s    ýz)MemongerTest.test_compute_assignments_dp1c           	      C   sL  t  ¡ }d| ¡ _d| ¡ _t d¡^ tj|dd||d}tj||d||d}tj||d||d}t 	|||gd	¡ W d   ƒ n1 sŠ0    Y  t  ¡ }d| ¡ _d| ¡ _t d¡^ tj|dd
||d}tj||d||d}tj||d||d}t 	|||gd	¡ W d   ƒ n1 s 0    Y  |  
t |j ¡ |j ¡ ¡¡ d S )Nr£   ru   rv   r%   rr   r'   rs   rp   ÚoutZother_xZother_yZother_z©r   r>   rF   r   r¨   r   r   r   r?   rm   r„   r   Úverify_graph_equalityrE   ©	rX   r   r   r    rY   r&   r*   r+   Úm2r   r   r   Útest_verify_graph_equalityÄ  s"    

0

2z'MemongerTest.test_verify_graph_equalityc                 C   sœ  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 d   ƒ n1 s²0    Y  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 d   ƒ n1 sp0    Y  |  
t |j ¡ |
j ¡ ¡¡ d S ©Nr£   ru   rv   r%   rr   r'   rs   rp   ÚuÚvrï   rð   ©rX   r   r   r    rY   r&   Zfc2aZfc2bZfc3ar¤   ró   r   r   r   Ú!test_verify_graph_equality_harderÜ  s*    

0

2z.MemongerTest.test_verify_graph_equality_harderc           	      C   sL  t  ¡ }d| ¡ _d| ¡ _t d¡^ tj|dd||d}tj||d||d}tj||d||d}t 	|||gd	¡ W d   ƒ n1 sŠ0    Y  t  ¡ }d| ¡ _d| ¡ _t d¡^ tj|dd||d}tj||d||d}tj||d||d}t 	|||gd	¡ W d   ƒ n1 s 0    Y  |  
t |j ¡ |j ¡ ¡¡ d S )
Nr£   ru   rv   r%   rr   r'   rs   rp   rï   ©r   r>   rF   r   r¨   r   r   r   r?   rm   ÚassertFalser   rñ   rE   rò   r   r   r   Útest_verify_graph_inequalityø  s"    

0

2z)MemongerTest.test_verify_graph_inequalityc                 C   sœ  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 d   ƒ n1 s²0    Y  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 d   ƒ n1 sp0    Y  |  
t |j ¡ |
j ¡ ¡¡ d S rõ   rú   rø   r   r   r   Ú#test_verify_graph_inequality_harder  s*    

0

2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ƒ¡}h d
£}t
ƒ }|jD ]h}	|	jdkrÚ|  |	jd |v ¡ | |	jd ¡ q¦|	jD ]}
|  |
|v ¡ qà|	jD ]}|  ||v ¡ qúq¦|  ||¡ d S )Nr%   rr   re   r'   rs   rp   rö   Zu_aliasrï   >   rr   rp   rs   ZFreer   )r   r>   r   r?   rE   ZAliasrm   r   Zrelease_blobs_when_usedrF   r   r   r   rû   r   r’   r   ro   )rX   rY   r&   r*   r+   rw   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
   ra   rd   rt   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__)ÚnumpyrI   rÁ   r   r   r   r   r   Zcaffe2.protor   Z"caffe2.python.hypothesis_test_utilÚpythonZhypothesis_test_utilr  Zfuture.utilsr   Zhypothesis.strategiesÚ
strategiesr  Z
hypothesisr	   r
   r  r   r   ZHypothesisTestCaser   rÿ   Úmainr   r   r   r   Ú<module>   s$         1