U
    dl                     @   s   d dl Z d dlm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mZ d dlZejdddZG d	d
 d
ejZedkre   dS )    N)core)given)	workspace)
FunctionalFc                    s   | t jdd| tdtjd  |rd tjj  tjd fddt	j  D fS t
| tjtdj  dddj  g  tjttjd fd	dt	td D fS d
S )z3Generates (axis, split_info, tensor_splits) tuples.   )Z	min_valuer      )Zdtypec                    s    g | ]}t j| d qS )axis)nparraytake.0i)r	   tensor A/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/functional_test.py
<listcomp>   s   z"_tensor_splits.<locals>.<listcomp>)elementsmax_sizec                    s,   g | ]$}j t| |d    dqS r   r   )r   ranger   r	   splitsr   r   r   r   )   s   N)hur   stZintegerslenshaper
   ZonesZint32r   sortedlistsr   Zdiff)ZdrawZadd_axisr   r   r   _tensor_splits   s2      	   r    c                   @   sz   e Zd Zef e eddgdejdd Z	ef de
 iejdd Zef e
 e d	ejd
d ZdS )TestFunctional ZCUDNN)Xenginec           
   	   C   s   |dt | 7 }||dk  d7  < tj||d}|d }|d }td< tjddgd	g|d
}td| t	| t
d	}	W 5 Q R X t jj||	dd t jj||	dd d S )Ng{Gz?g        )device_optionr   Zoutput_0Ztmp_workspaceRelur#   Y)r$   Functional Relu result mismatcherr_msg)r
   signr   r&   r   ZWorkspaceGuardr   ZCreateOperatorZFeedBlobZRunOperatorOnceZ	FetchBlobtestingassert_array_equal)
selfr#   r$   gcdcoutputZY_lZY_dopZY_refr   r   r   	test_relu1   s(    
    zTestFunctional.test_relutensor_splitsc           
         sn   |\ }}t j| |d\}}tj| d}t fdd|D }	tjj||dd tjj||	dd d S )N)r	   r%   r   c                    s   g | ]}|j   qS r   )r   )r   ar   r   r   r   N   s     z.TestFunctional.test_concat.<locals>.<listcomp>z!Functional Concat result mismatchr)   z%Functional Concat split info mismatch)r   ZConcatr
   concatenater   r,   r-   )
r.   r4   r/   r0   _r   Zconcat_result
split_infoZconcat_result_refZsplit_info_refr   r   r   test_concatG   s    
zTestFunctional.test_concat)r4   split_as_argc                    s   |\ }}d}|r6t j| dg}t |t|d}n"t j| d|g}t t|d}tj|d|i|}	|f fdd	}
|
| }t|D ]\}}t jj|	| |dd	 qd S )
NTr   )r	   split
num_output)r	   r<   r%   c                    s2   t dgt|  fddtt|D S )Nr   c                    s4   g | ],}t jt | |d    dqS r   )r
   r   r   Zaranger   )r	   inputsr   r   r   m   s   z@TestFunctional.test_split.<locals>.split_ref.<locals>.<listcomp>)r
   Zcumsumlistr   r   )r=   r;   r   )r=   r>   r   	split_refk   s    
z,TestFunctional.test_split.<locals>.split_refr(   r)   )	r
   r6   dictr   r   ZSplit	enumerater,   r-   )r.   r4   r:   r/   r0   r8   r   Zinput_tensorskwargsresultr@   Z
result_refr   refr   r   r   
test_split\   s     
  zTestFunctional.test_splitN)__name__
__module____qualname__r   r   r   r   Zsampled_fromZgcsr3   r    r9   ZbooleansrF   r   r   r   r   r!   0   s   "

r!   __main__)F)ZunittestZcaffe2.pythonr   Z
hypothesisr   Zhypothesis.strategiesZ
strategiesr   Z"caffe2.python.hypothesis_test_utilpythonZhypothesis_test_utilr   r   Zcaffe2.python.functionalr   Znumpyr
   Z	compositer    ZHypothesisTestCaser!   rG   mainr   r   r   r   <module>   s   I