U
    ‰d%ˆ  ã                   @   sÔ  d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZ d dl	m
  mZ d dlmZ d dlZd dlZd dlmZ d dlmZ d dlmZmZmZmZmZ d dlmZmZ G dd	„ d	ejƒZ G d
d„ dejƒZ!e "ej# d¡G dd„ dejƒƒZ$e "ej%j& d¡G dd„ dejƒƒZ'G dd„ dejƒZ(G dd„ dejƒZ)G dd„ dej*ƒZ+G dd„ dejƒZ,G dd„ dej*ƒZ-G dd„ dej.j/ƒZ0e "dej1kd¡G d d!„ d!ejƒƒZ2G d"d#„ d#e2ƒZ3e4d$krÐe 5¡  dS )%é    N)Ú
namedtuple)ÚList)ÚTensor)Ú
caffe2_pb2)ÚcoreÚ	test_utilÚ	workspaceÚmodel_helperÚbrew)ÚgivenÚsettingsc                   @   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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+d,„ Zd-d.„ Zd/d0„ Zd1S )2ÚTestWorkspacec                 C   s6   t  d¡| _| jjg dddddgdd| _t ¡  d S ©	Nútest-netÚtestblobé   é   é   é   ç      ð?©ÚshapeÚvalue)r   ÚNetÚnetÚConstantFillÚtestblob_refr   ÚResetWorkspace©Úself© r    ú@/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/workspace_test.pyÚsetUp   s      
 ÿzTestWorkspace.setUpc                 C   sF   |   t ¡ d¡ |   t ¡ d¡ |   t d¡d¡ |   t ¡ d¡ d S )NTÚ.z/tmp/caffe-workspace-test)ÚassertEqualr   r   Z
RootFolderr   r    r    r!   ÚtestRootFolder   s    zTestWorkspace.testRootFolderc                 C   s   |   t d¡d¡ d S )Núnon-existingF)r$   r   ÚHasBlobr   r    r    r!   Ú'testWorkspaceHasBlobWithNonexistingName!   s    z5TestWorkspace.testWorkspaceHasBlobWithNonexistingNamec                 C   s`   |   t | j ¡ jd  ¡ ¡d¡ |   t d¡d¡ t ¡ }|   t	|ƒd¡ |   |d d¡ d S )Nr   Tr   r   )
r$   r   ÚRunOperatorOncer   ÚProtoÚopÚSerializeToStringr'   ZBlobsÚlen)r   Úblobsr    r    r!   ÚtestRunOperatorOnce$   s     ÿz!TestWorkspace.testRunOperatorOncec                 C   sˆ   t jdddgdgdddddddd
}t d¡}t d	¡}t d|¡ t d|¡ t | ¡ ddg¡}|  |t	d
dddgƒdddƒ¡ d S )NZConv2DÚXÚWÚYr   r   )Zstride_hZstride_wZpad_tZpad_lZpad_bZpad_rÚkernel)r   é   r4   r4   )r   r   r   r   ZCostZflopsZbytes_writtenÚ
bytes_readi€  é   iH  )
r   ÚCreateOperatorÚnpÚzerosr   ÚFeedBlobZGetOperatorCostr,   ZassertTupleEqualr   )r   r+   r0   r1   Zop_costr    r    r!   ÚtestGetOperatorCost-   s2    ö

  ÿþz!TestWorkspace.testGetOperatorCostc                 C   s2   |   t | j ¡  ¡ ¡d¡ |   t d¡d¡ d S )NTr   )r$   r   Ú
RunNetOncer   r*   r,   r'   r   r    r    r!   ÚtestRunNetOnceF   s
     ÿzTestWorkspace.testRunNetOncec                 C   sv   |   dtjjjj¡ |  t | j 	¡  
¡ ¡d¡ |  t d¡d¡ |  dtjjjj¡ t ¡  |   dtjjjj¡ d S )Nr   T)ÚassertNotInr   ÚCÚ	WorkspaceÚcurrentr.   r$   r<   r   r*   r,   r'   ÚassertInr   r   r    r    r!   ÚtestCurrentWorkspaceWrapperL   s     ÿz)TestWorkspace.testCurrentWorkspaceWrapperc                 C   sN   t  d¡}| t  d| j¡¡ |  t | ¡  	¡ ¡d¡ |  t 
d¡d¡ d S ©Nz	test-planz	test-stepTr   )r   ÚPlanÚAddStepÚExecutionStepr   r$   r   ÚRunPlanr*   r,   r'   )r   Úplanr    r    r!   ÚtestRunPlanV   s    
zTestWorkspace.testRunPlanc                 C   sX   t  d¡}| t  d| j¡¡ t |¡}| ¡ s2q(|  | 	¡ d¡ |  t 
d¡d¡ d S rD   )r   rE   rF   rG   r   r   ZRunPlanInBackgroundZis_doner$   Zis_succeededr'   )r   rI   Zbackground_planr    r    r!   ÚtestRunPlanInBackground\   s    

z%TestWorkspace.testRunPlanInBackgroundc                 C   s6   t  d| j¡}|  t |¡d¡ |  t d¡d¡ d S )Nztest-step-as-planTr   )r   rG   r   r$   r   rH   r'   )r   Ústepr    r    r!   ÚtestConstructPlanFromStepse   s    z(TestWorkspace.testConstructPlanFromStepsc                 C   sT   |   t | j ¡  ¡ ¡d¡ |   t d¡d¡ |   t ¡ d¡ |   t d¡d¡ d S )NTr   F)r$   r   r<   r   r*   r,   r'   r   r   r    r    r!   ÚtestResetWorkspacej   s     ÿz TestWorkspace.testResetWorkspacec              	   C   s  t j ¡ }| d¡ t dddg¡¡ |jd  ¡ }d|j	d< t dddg¡}tj
 |j	|¡ tj
 |jd  ¡ |¡ | ddgtjj¡ tdƒD ] }tdƒD ]}d|j	||f< qžq’d	|j	d
< tjddgtjd}d	|d
< tj
 |j	|¡ tj
 |jd  ¡ |¡ |  t¡ | ddgtjj¡ W 5 Q R X tjddgddggtjd}| |¡ |  |j	d d¡ tj
 |jd  ¡ |¡ t ddg¡}| |¡ d|d< |  |j	d d¡ t ddg¡}| |¡ | ¡ }d|j	d< | ¡ }tj
 ||¡ |  |d d¡ d S )NÚtensorgš™™™™™ñ?g333333ó?gÍÌÌÌÌÌô?gffffff
@r   r   r   éd   )r   r   ©Údtyper   s   abcs   defs   ghis   jkl©r   r   gffffff$@gÍÌÌÌÌÌ@)r   r?   r@   Úcreate_blobÚfeedr8   Úarrayr.   rO   ÚdataÚtestingÚassert_array_equalÚfetchÚinitr   ZDataTypeZINT32Úranger9   Úint32ÚassertRaisesÚRuntimeErrorÚSTRINGÚobjectÚassertEquals)r   ÚwsrO   ÚvalÚxÚyÚval2Úval3r    r    r!   ÚtestTensorAccessr   sB    






zTestWorkspace.testTensorAccessc                 C   sŒ   |   t | j ¡  ¡ ¡d¡ t d¡}|   |jd¡ tj	 
|d¡ d|d d …< |   t d|¡d¡ t d¡}|   |jd¡ tj	 
|d¡ d S ©NTr   ©r   r   r   r   r   ç       @©r$   r   r<   r   r*   r,   Ú	FetchBlobr   r8   rX   rY   r:   ©r   ÚfetchedÚfetched_againr    r    r!   ÚtestFetchFeedBlob    s     ÿ

zTestWorkspace.testFetchFeedBlobc                 C   s   |   t | j ¡  ¡ ¡d¡ t | j¡}|   |jd¡ t	j
 |d¡ d|d d …< |   t | j|¡d¡ t d¡}|   |jd¡ t	j
 |d¡ d S )NTrk   r   rl   r   )r$   r   r<   r   r*   r,   rn   r   r   r8   rX   rY   r:   ro   r    r    r!   Ú!testFetchFeedBlobViaBlobReference®   s     ÿ
z/TestWorkspace.testFetchFeedBlobViaBlobReferencec              
   C   sÊ   t jt jt jt jt jt jt jt jt j	t j
f
D ]˜}zt  |¡jd }W n tk
r\   d}Y nX t j ddd¡d |  |¡}|  t d|¡d¡ t d¡}|  |jd¡ |  |j|¡ t j ||¡ q,d S )	Nr   iè  r   r   g      à?Útestblob_typesT©r   r   r   )r8   Úfloat16Úfloat32Úfloat64ÚboolÚint8Úint16r]   Úint64Úuint8Úuint16ZiinfoÚmaxÚ
ValueErrorÚrandomÚrandÚastyper$   r   r:   rn   r   rR   rX   rY   )r   rR   ÚrngrW   Úfetched_backr    r    r!   ÚtestFetchFeedBlobTypes¼   s*    ö

z$TestWorkspace.testFetchFeedBlobTypesc                 C   sp   t  d¡ t j¡}d|jddd…< |  t d|¡d¡ t d¡}|  |j	d¡ |  |j
t j¡ t j ||¡ dS )z@Special case for bool to ensure coverage of both true and false.ru   TNr   rt   )r8   r9   rƒ   ry   Zflatr$   r   r:   rn   r   rR   rX   rY   ©r   rW   r…   r    r    r!   ÚtestFetchFeedBlobBoolÔ   s    
z#TestWorkspace.testFetchFeedBlobBoolc              
   C   s  t jt jt jt jt jt jt jt jt j	t j
f
D ]J}t j dd¡ |¡}|  t d|¡d¡ |  t d¡dt  |¡j ¡ q,t  ddg¡}t  dd	g¡}d
\}}|D ]}|t|ƒ7 }q |D ]}|t|ƒ7 }q¶|  t d|¡d¡ |  t d|¡d¡ |  t d¡t d¡ || ¡ d S )Nr   r   Ztestblob_sizeBytesTé   s   Hello World!s   abcds   element1s   element2rS   Ztestblob_str1Ztestblob_str2)r8   rv   rw   rx   ry   rz   r{   r]   r|   r}   r~   r   Úrandnrƒ   Ú
assertTruer   r:   r$   ZGetBlobSizeBytesrR   ÚitemsizerV   r-   )r   rR   rW   Zstrs1Ústrs2Z	strs1_lenZ	strs2_lenÚstrr    r    r!   ÚtestGetBlobSizeBytesÞ   s@    öþÿýz"TestWorkspace.testGetBlobSizeBytesc                 C   sP   t jdt jd}|  t d|¡d¡ t d¡}|  |jd¡ |  |jt j¡ d S )N)r   r   r   )r   rR   Ztestblob_emptyT)	r8   Úemptyrw   r$   r   r:   rn   r   rR   r‡   r    r    r!   ÚtestFetchFeedBlobZeroDim  s
    
z&TestWorkspace.testFetchFeedBlobZeroDimc                 C   s~   t  d ddg ¡d ddg ¡ddg¡}t d|¡ t d¡}|  |j|j¡ td	|jd	 ƒD ]}|  || || ¡ q`d S )
Nó    é
   s   long stringé€   s   very long strings   small   stringó)   Hello, world! I have special   symbols !Zmy_str_tensorr   )	r8   rV   Újoinr   r:   rn   r$   r   r\   ©r   Ústrsr   Úir    r    r!   ÚtestFetchFeedLongStringTensor	  s    üÿ
z+TestWorkspace.testFetchFeedLongStringTensorc                 C   sd   t  dddg¡}t d|¡ t d¡}|  |j|j¡ td|jd ƒD ]}|  || || ¡ qFd S )Ns   elem1s   elem 2s	   element 3Zmy_str_tensor_2r   )r8   rV   r   r:   rn   r$   r   r\   r—   r    r    r!   ÚtestFetchFeedShortStringTensor  s    
z,TestWorkspace.testFetchFeedShortStringTensorc                 C   s*   d}t  d|¡ t  d¡}|  ||¡ d S )Nr•   Zmy_plain_string)r   r:   rn   r$   )r   ÚsÚs2r    r    r!   ÚtestFetchFeedPlainString"  s    
z&TestWorkspace.testFetchFeedPlainStringc                 C   sN   d}d}t  d|¡ t  d|¡ t  ddg¡\}}|  ||¡ |  ||¡ d S )Ns   test1s   test2Ús1r   )r   r:   Z
FetchBlobsrb   )r   rŸ   r   Zfetch1Zfetch2r    r    r!   ÚtestFetchBlobs)  s    zTestWorkspace.testFetchBlobsc                 C   sÌ   |   t | j ¡  ¡ ¡d¡ tjd }|   |jd¡ tj	 
|d¡ d|d d …< |tjd< tjd }|   |jd¡ tj	 
|d¡ |  dtjk¡ |  dtjk¡ |   ttjƒd¡ tjD ]}|   |d¡ q¶d S )NTr   rk   r   rl   Znon_existantr   )r$   r   r<   r   r*   r,   r.   r   r8   rX   rY   r‹   ÚassertFalser-   )r   rp   rq   Úkeyr    r    r!   ÚtestFetchFeedViaBlobDict2  s"     ÿ



z&TestWorkspace.testFetchFeedViaBlobDictc              
   C   s  t  tjdg ddddd¡ t  d¡}| d¡ d |d	< |d< tj | 	¡ t 
dddddg¡¡ tj t  d¡t 
dddddg¡¡ tjdtjd
}t  d|¡ t  tjddgddgdd¡ d|d< tj t  d¡t 
ddgddgg¡¡ tj |t 
ddgddgg¡¡ d S )Nr   Úfoo©r   r   r“   )r   r   rR   é   é	  r   rQ   ÚbarÚReshapeÚ_©r   r   )r   é{   ©r   r   r   )r   r)   r   r7   Ú
FetchTorchÚresize_r8   rX   rY   ÚnumpyrV   rn   ÚtorchÚonesr|   r:   )r   ÚtÚzr    r    r!   ÚtestTorchInteropF  s:         ÿÿ

" ÿÿ ÿzTestWorkspace.testTorchInteropN)Ú__name__Ú
__module__Ú__qualname__r"   r%   r(   r/   r;   r=   rC   rJ   rK   rM   rN   ri   rr   rs   r†   rˆ   r   r‘   rš   r›   rž   r    r£   rµ   r    r    r    r!   r      s0   	
	.
$		r   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestMultiWorkspacesc                 C   s   t  d¡ t  ¡  d S )NÚdefault)r   ÚSwitchWorkspacer   r   r    r    r!   r"   a  s    
zTestMultiWorkspaces.setUpc                 C   sø   t  d¡| _| jjg dddddgdd |  t | j ¡  ¡ ¡d	¡ |  t 	d¡d	¡ |  t 
d
d	¡d ¡ |  t 	d¡d¡ |  t 
d¡d ¡ |  t 	d¡d	¡ zt 
d¡ |  d	d¡ W n tk
rÎ   Y nX t ¡ }|  d|k¡ |  d
|k¡ d S )Nr   r   r   r   r   r   r   r   TÚtestFrº   r&   )r   r   r   r   r$   r   r<   r*   r,   r'   r»   r_   Z
Workspacesr‹   )r   Z
workspacesr    r    r!   ÚtestCreateWorkspacee  s&     ÿ
z'TestMultiWorkspaces.testCreateWorkspaceN)r¶   r·   r¸   r"   r½   r    r    r    r!   r¹   `  s   r¹   zNo gpu support.c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Ze ej	 d¡dd	„ ƒZ
d
S )ÚTestWorkspaceGPUc                 C   s>   t  ¡  t d¡| _| jjg dddddgdd | j ¡  d S r   )r   r   r   r   r   r   ZRunAllOnGPUr   r    r    r!   r"   €  s    zTestWorkspaceGPU.setUpc                 C   sŒ   |   t | j ¡  ¡ ¡d¡ t d¡}|   |jd¡ tj	 
|d¡ d|d d …< |   t d|¡d¡ t d¡}|   |jd¡ tj	 
|d¡ d S rj   rm   ro   r    r    r!   ÚtestFetchBlobGPU†  s     ÿ

z!TestWorkspaceGPU.testFetchBlobGPUc                 C   sZ   t  ¡ }|  t|ƒtj¡ |  |jd¡ |  |jd |jd ¡ |  |jd t  ¡ ¡ d S )Nr   r   r   )	r   ZGetGpuPeerAccessPatternr$   Útyper8   ZndarrayÚndimr   ZNumGpuDevices)r   Úpatternr    r    r!   ÚtestGetGpuPeerAccessPattern”  s
    z,TestWorkspaceGPU.testGetGpuPeerAccessPatternz'Tensor interop doesn't yet work on ROCmc                 C   sv  t j ¡ }t tjdg ddddt tj¡d¡ t 	d¡}| 
d¡ |  |j¡ d |d	< |d< tj | ¡  ¡ t dddddg¡¡ tj t d¡t dddddg¡¡ t jdt jd
d}t d|¡ t tjddgddgdt tj¡d¡ d|d< tj t d¡t ddgddgg¡¡ tj | ¡ t ddgddgg¡¡ |  t j ¡ |¡ ~~t ¡  |  t j ¡ |¡ d S )Nr   r¤   r¥   r   r“   )r   r   rR   Údevice_optionr¦   r§   r   Úcuda)rR   Zdevicer¨   r©   rª   r«   )r   rÄ   r¬   r­   r   )r±   rÅ   Zmemory_allocatedr   r)   r   r7   ÚDeviceOptionZGpuDeviceTyper®   r¯   r‹   Zis_cudar8   rX   rY   Úcpur°   rV   rn   r²   r|   r:   ZassertGreaterr   r$   )r   Zinitial_memr³   r´   r    r    r!   rµ   ›  sV    

ùÿ

& ÿ
ûÿ	 ÿ$z!TestWorkspaceGPU.testTorchInteropN)r¶   r·   r¸   r"   r¿   rÃ   ÚunittestÚskipIfr   Zhas_cuda_supportrµ   r    r    r    r!   r¾   ~  s    ÿr¾   zNo MKLDNN support.c                   @   s   e Zd Zdd„ ZdS )ÚTestWorkspaceIDEEPc                 C   sH   t j dd¡ t j¡}t d|t t	j
¡¡ t d¡}t j ||¡ d S )Nr   r   Ztestblob_ideep)r8   r   rŠ   rƒ   rw   r   r:   r   rÆ   r   ZIDEEPrn   rX   rY   )r   Zarrrp   r    r    r!   ÚtestFeedFetchBlobIDEEPÑ  s    
z)TestWorkspaceIDEEP.testFeedFetchBlobIDEEPN)r¶   r·   r¸   rË   r    r    r    r!   rÊ   Ï  s   rÊ   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestImmedibatec                 C   s4   t jdd |  t  ¡ ¡ t  ¡  |  t  ¡ ¡ d S )NT©Zi_know)r   ÚStartImmediater‹   ZIsImmediateÚStopImmediater¡   r   r    r    r!   ÚtestImmediateEnterExitÙ  s    z%TestImmedibate.testImmediateEnterExitc              	   C   sØ   t jdd t d¡}|jg dddddgd	d
 |  t  ¡ dg¡ t  d¡}|  t	¡ t  
d¡ W 5 Q R X tj |d	¡ d|d d …< |  t  d|¡¡ tj t  d¡d¡ t  ¡  |  t	¡ t  d¡}W 5 Q R X d S )NTrÍ   r   r   r   r   r   r   r   r   rl   )r   rÎ   r   r   r   r$   ZImmediateBlobsZFetchImmediater^   r_   rn   r8   rX   rY   r‹   ZFeedImmediaterÏ   )r   r   Úcontentr    r    r!   ÚtestImmediateRunsCorrectlyß  s    

z)TestImmedibate.testImmediateRunsCorrectlyc                 C   sj   t jdd |  tt jƒdk¡ t j}|  tj |¡¡ t  ¡  |  tt jƒdk¡ |  	tj 
|¡¡ d S )NTrÍ   r   )r   rÎ   r‹   r-   Z_immediate_root_folderÚosÚpathÚisdirrÏ   r¡   Úexists)r   Zroot_folderr    r    r!   ÚtestImmediateRootFolderñ  s    z&TestImmedibate.testImmediateRootFolderN)r¶   r·   r¸   rÐ   rÒ   r×   r    r    r    r!   rÌ   Ø  s   rÌ   c                   @   s   e Zd Zdd„ ZdS )ÚTestCppEnforceAsExceptionc              	   C   s6   t  ddgdg¡}|  t¡ t |¡ W 5 Q R X d S )NÚRelur0   r2   )r   r7   r^   r_   r   r)   )r   r+   r    r    r!   ÚtestEnforce   s    z%TestCppEnforceAsException.testEnforceN)r¶   r·   r¸   rÚ   r    r    r    r!   rØ   ÿ  s   rØ   c                   @   sþ   e Zd Zdd„ Zee ¡ ejdddddd„ ƒZee ¡ e ¡ ejdddd	d
d„ ƒZ	ee ¡ e ¡ e ¡ ejdddddd„ ƒZ
ee ¡ e ¡ ejdddd	dd„ ƒZee ¡ e ¡ e ej¡ddd„ ƒZee ¡ e ¡ ddd„ ƒZdd„ ZdS )ÚTestCWorkspacec              	   C   sþ   t j ¡ }|  |ji ¡ |  |ji ¡ t d¡}|jg dddddgdd | 	|¡ |  
t¡ | 	|¡ W 5 Q R X | 	|d	¡ |j	|d	d
 |  d|j¡ |  t|jƒd¡ | ¡ j}|  d|¡ |j|  ¡ }|jd }tj tjdtjd| ¡ ¡ d S )Nr   r   r   r   r   r   r   r   T)Ú	overwriterk   rQ   )r   r?   r@   r$   Únetsr.   r   r   r   Ú
create_netr^   r_   rB   r-   r*   ÚnameÚrunr8   rX   rY   r²   rw   rZ   )r   rc   r   Únet_nameÚblobr    r    r!   Útest_net_execution  s(    




 ÿz!TestCWorkspace.test_net_executionéÿÿÿÿr   ©Z	min_valueZ	max_value)rß   r   c                 C   s^   t j ¡ }tjdg |gdg|d}| |¡ |  ||j¡ tj	j
|g|j|  ¡ ddd d S )Nr   r   r   ç-Cëâ6?©ZatolZrtol)r   r?   r@   r   r7   rà   rB   r.   r8   rX   Úassert_allcloserZ   )r   rß   r   rc   r+   r    r    r!   Útest_operator_run  s    

   ÿz TestCWorkspace.test_operator_run)Ú	blob_namerá   r   c                 C   st   t j ¡ }t |¡}|jg |gdg|d | |¡ |  ||j¡ |  	||j
¡ tjj|g|j|  ¡ ddd d S ©Nr   r   ræ   rç   )r   r?   r@   r   r   r   rà   rB   r.   r>   rÝ   r8   rX   rè   rZ   ©r   rê   rá   r   rc   r   r    r    r!   Útest_net_run)  s    


   ÿzTestCWorkspace.test_net_run)rê   rá   Ú	plan_namer   c                 C   sš   t j ¡ }t |¡}t |¡}|jg |gdg|d | tjd|gdd¡ | 	|¡ |  
||j¡ |  
| ¡ |j¡ tjj|g|j|  ¡ ddd d S )Nr   r   rL   )rÝ   Znum_iterræ   rç   )r   r?   r@   r   rE   r   r   rF   rG   rà   rB   r.   ÚNamerÝ   r8   rX   rè   rZ   )r   rê   rî   rá   r   rc   rI   r   r    r    r!   Útest_plan_run9  s    



   ÿzTestCWorkspace.test_plan_runc                 C   s|   t j ¡ }t |¡}|jg |gdg|d | |¡ ¡  |  ||j	¡ |  | 
¡ |j¡ tjj|g|j	|  ¡ ddd d S rë   )r   r?   r@   r   r   r   rÞ   rà   rB   r.   rï   rÝ   r8   rX   rè   rZ   rì   r    r    r!   Útest_net_createN  s    

   ÿzTestCWorkspace.test_net_create)rß   r   rÄ   c                 C   s„   t j ¡ }| |¡j||d |  ||j¡ |j| }tj 	||j|  
¡ ¡ | d |¡¡}| | |¡¡ tj 	|| 
¡ ¡ d S )N)rÄ   ú{}_serde)r   r?   r@   rT   rU   rB   r.   r8   rX   Zassert_equalrZ   ÚformatÚdeserializeÚ	serialize)r   rß   r   rÄ   rc   râ   Ú
serde_blobr    r    r!   Útest_array_serde^  s    

zTestCWorkspace.test_array_serdec                 C   sˆ   |  dd¡}tj ¡ }| |¡ |¡ |  ||j¡ |j| }|  ||j|  	¡ ¡ | d 
|¡¡}| | |¡¡ |  || 	¡ ¡ d S )NÚasciiÚignorerò   )Úencoder   r?   r@   rT   rU   rB   r.   r$   rZ   ró   rô   rõ   )r   rß   r   rc   râ   rö   r    r    r!   Útest_string_serdem  s    

z TestCWorkspace.test_string_serdec              	   C   s.   t j ¡ }|  t¡ | d¡ W 5 Q R X d S )Nz...)r   r?   r@   r^   Ú	TypeErrorrÞ   )r   rc   r    r    r!   Útest_exceptiony  s    
zTestCWorkspace.test_exceptionN)r¶   r·   r¸   rã   r   ÚstÚtextÚfloatsré   rí   rð   rñ   ÚhturO   Zsampled_fromZdevice_optionsr÷   rû   rý   r    r    r    r!   rÛ     s>   
	ý
ü
ý

ý


rÛ   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestPredictorc                 C   sF   t  ¡ }tj|dddddtddfdtddfd	d
}|j |¡ |S )NrW   rf   r   r   r   r   ©r   g        r   )Údim_inÚdim_outZweight_initZ	bias_initZaxis)r	   ÚModelHelperr
   ÚfcÚdictr   ZAddExternalOutput)r   Úmrf   r    r    r!   Ú_create_model  s    ø
zTestPredictor._create_modelc                 C   s”   t  ¡  |  ¡ }t  dtjdgdd¡ t  t  |j 	¡ ¡t  |j
 	¡ ¡¡| _tjddddgdd}| j |g¡}tj tjddggdd|¡ d S )	NrW   r   rw   rQ   r   r   r6   i  )r   r   r
  r:   r8   r9   Z	PredictorZStringifyProtoZparam_init_netr*   r   Z	predictorrV   rà   rX   Zassert_array_almost_equal)r   r	  ÚinputsÚoutputsr    r    r!   Útest_predictor_memory_model¢  s    þ ÿz)TestPredictor.test_predictor_memory_modelN)r¶   r·   r¸   r
  r  r    r    r    r!   r  €  s   !r  c                   @   s¤   e Z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ejdddejddddeddd	d
„ ƒƒZeej	ddddedddd„ ƒƒZ
dS )ÚTestTransformr   r“   rå   )Ú	input_dimÚ
output_dimÚ
batch_sizec           	   
   C   sœ   t  ¡ }tj|dd||d}tj||d||d}tj||d||dddd	}| g |¡ g d
¡ dgdg¡ g d¡ t	 
d|j ¡ ¡}|  |jd jd¡ d S )NrW   Úfc1©r  r  Úfc2ÚconvTÚCUDNNr   )r  r  Ú	use_cudnnÚenginer3   ÚpredÚlabelZxentÚlossÚConvToNNPackr   ZNNPACK)r	   r  r
   r  r  rÙ   ÚSoftmaxZLabelCrossEntropyÚAveragedLossr   ÚApplyTransformr   r*   r$   r+   r  )	r   r  r  r  r	  r  r  r  Ztransformed_net_protor    r    r!   Útest_simple_transform³  s,    ø ÿ þz#TestTransform.test_simple_transformi'  )Údeadlinec              	   C   sH   t  ¡ }tj|dd||d |  t¡ t d|j 	¡ ¡ W 5 Q R X d S )NrW   r  r  Zdefinitely_not_a_real_transform)
r	   r  r
   r  r^   r_   r   r  r   r*   )r   r  r  r  r	  r    r    r!   Útest_registry_invalidÏ  s    z#TestTransform.test_registry_invalidrä   r  c              
   C   s4  t  d¡}|jg dgddddg|d |jg dgddddg|d |jg dgdg|d |  t | ¡  ¡ ¡d¡ t 	¡ }t
j|dd	ddddd
d}| g |¡ g d¡ g d¡ |  t |j ¡  ¡ ¡d¡ t d|j ¡ | ¡ ¡}|  t | ¡ ¡d¡ tjd|j ¡ | ¡ dddd}|  t | ¡ ¡d¡ d S )NÚinit_netrW   r¦   r   Zconv_wr   Zconv_bTr  r  )r  r  r3   r  r  r  r  r  r“   rP   rl   )Zwarmup_runsZ	main_runsZimprovement_threshold)r   r   r   r$   r   r<   r*   r,   r	   r  r
   r  rÙ   r  r  r   ZApplyTransformIfFaster)r   r   r#  r	  r  Úprotor    r    r!   Útest_apply_transform_if_fasterÛ  sH    
 ÿø  ÿúz,TestTransform.test_apply_transform_if_fasterN)r¶   r·   r¸   r   rþ   Zintegersr   r   r"  r   r%  r    r    r    r!   r  ²  s    ý
ýr  c                       s|   e Zd Z‡ fdd„Zejjdd„ ƒZejjdejeje	ejdœdd„ƒZ
ejjee ed	œd
d„ƒZejjdd„ ƒZ‡  ZS )ÚMyModulec              	      s2   t t| ƒ ¡  tj t dddddgg¡¡| _d S )Nr   r   r   r   g      @)Úsuperr&  Ú__init__r±   ÚnnÚ	ParameterrO   Úmultr   ©Ú	__class__r    r!   r(    s    zMyModule.__init__c                 C   s   | j  |¡S ©N)r+  Úmm©r   re   r    r    r!   Úforward  s    zMyModule.forwardr   )re   rf   r´   Úreturnc                 C   s   || | S r.  r    )r   re   rf   r´   r    r    r!   Úmulti_input  s    zMyModule.multi_input)Útensor_listr2  c                 C   s   |d |d  |d  S )Nr   r   r   r    )r   r4  r    r    r!   Úmulti_input_tensor_list  s    z MyModule.multi_input_tensor_listc                 C   s   ||d fS )Nr   r    r0  r    r    r!   Úmulti_output  s    zMyModule.multi_output)r   )r¶   r·   r¸   r(  r±   ÚjitZscript_methodr1  r   Úintr3  r   r5  r6  Ú__classcell__r    r    r,  r!   r&    s   
r&  ÚScriptModulez2Script module integration in Caffe2 is not enabledc                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚTestScriptModulec                 C   s   t  dtƒ ¡ d S )Nr	  )r   r:   r&  r   r    r    r!   Ú_createFeedModule"  s    z"TestScriptModule._createFeedModulec                 C   s.   t ƒ }t d|¡ t d¡}|  |d k	¡ d S )NÚmodule)r&  r   r:   rn   r‹   )r   r	  Úm2r    r    r!   ÚtestCreation%  s    
zTestScriptModule.testCreationc                 C   s†   |   ¡  tj dd¡ tj¡}t dddddgg¡ tj¡}t d|¡ t 	t
 dddgd	g¡¡ tjjt d	¡t ||¡dd
 d S )Nr¦   r   r   r   r   Úwr:  r	  rf   ©Údecimal)r<  r8   r   r‚   rƒ   rw   rV   r   r:   r)   r   r7   rX   Úassert_almost_equalrn   Úmatmul)r   rd   Úparamr    r    r!   ÚtestForward+  s    ÿ 
 ÿzTestScriptModule.testForwardc                 C   sä   |   ¡  tj dd¡ tj¡}t d|¡ tj dd¡ tj¡}t d|¡ t t	j
ddddgdgdd¡ t t	j
dddgd	d
gdd¡ tjjt d¡|| d dd tjjt d	¡|dd tjjt d
¡|d dd d S )Nr¦   r@  Úw2r:  r	  rf   r3  )ÚmethodÚy1Úy2r6  r   rA  r   ©r<  r8   r   r‚   rƒ   rw   r   r:   r)   r   r7   rX   rC  rn   )r   rd   rg   r    r    r!   ÚtestMultiInputOutput7  s8       ÿÿ   ÿÿ 
 ÿz%TestScriptModule.testMultiInputOutputc              	   C   s¶   |   ¡  tj dd¡ tj¡}t d|¡ tj dd¡ tj¡}t d|¡ tj dd¡ tj¡}t d|¡ t t	j
dddddgdgdd	d
¡ tjjt d¡|| | dd d S )Nr¦   r@  rG  Zw3r:  r	  rf   r5  T)rH  Zpass_inputs_as_tensor_listrA  rK  )r   rd   rg   rh   r    r    r!   ÚtestMultiTensorListInputM  s*    
ûÿ	 
 ÿz)TestScriptModule.testMultiTensorListInputc                 C   sR  t  ¡ }zþ|  ¡  t 	t
jddgg dtj |d¡dd¡ t ¡  |  t d¡¡ t 	t
jdg g dtj |d¡ddd¡ |  t d¡¡ tj d	d	¡ tj¡}t dd
ddd	gg¡ tj¡}t d|¡ t 	t
 dddgdg¡¡ tjjt d¡t ||¡d	d W 5 zt |¡ W n4 tk
rJ } z|jtjkr:‚ W 5 d }~X Y nX X d S )NZSaver	  r   ÚdbZminidb)Úabsolute_pathrN  Údb_typeÚLoad)rO  rN  rP  Zload_allr¦   r   r   r   r@  r:  rf   rA  )ÚtempfileÚmkdtempÚshutilÚrmtreeÚOSErrorÚerrnoÚENOENTr<  r   r)   r   r7   rÓ   rÔ   r–   r   r¡   r'   r‹   r8   r   r‚   rƒ   rw   rV   r:   rX   rC  rn   rD  )r   ZtmpdirÚerd   rE  r    r    r!   ÚtestSerializationc  sV    úÿ
ùÿÿ 
 ÿ
z"TestScriptModule.testSerializationN)	r¶   r·   r¸   r<  r?  rF  rL  rM  rZ  r    r    r    r!   r;    s   r;  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestScriptModuleFromStringc              	   C   s&   t  tjdg dg|  tƒ ¡d¡ d S )NZScriptModuleLoadr	  )Zserialized_binary)r   r)   r   r7   Ú_get_modules_bytesr&  r   r    r    r!   r<  ˜  s    
üÿz,TestScriptModuleFromString._createFeedModulec                 C   s&   dd l }| ¡ }tj ||¡ | ¡ S )Nr   )ÚioÚBytesIOr±   r7  ÚsaveÚgetvalue)r   Z
the_moduler]  Úbufferr    r    r!   r\  ¢  s    z-TestScriptModuleFromString._get_modules_bytesN)r¶   r·   r¸   r<  r\  r    r    r    r!   r[  —  s   
r[  Ú__main__)6rW  rÓ   rT  rR  rÈ   Úcollectionsr   Útypingr   Z"caffe2.python.hypothesis_test_utilÚpythonZhypothesis_test_utilr  Zhypothesis.strategiesZ
strategiesrþ   r°   r8   r±   r   Zcaffe2.protor   Zcaffe2.pythonr   r   r   r	   r
   Z
hypothesisr   r   ZTestCaser   r¹   rÉ   Zhas_gpu_supportr¾   r?   Z
use_mkldnnrÊ   rÌ   rØ   ZHypothesisTestCaserÛ   r  r  r7  r:  r&  Z_REGISTERED_OPERATORSr;  r[  r¶   Úmainr    r    r    r!   Ú<module>   sH     OP'z2Uþv
