U
    d#                     @   s   d dl mZmZ d dlmZ d dlm  mZ d dl	m
Z
mZ d dlmZ d dlZG dd deZdd Zd	d
 Zdd Zdd ZG dd dejZdS )    )core	workspace)CreatePythonOperatorN)givensettingsc                   @   s   e Zd ZdS )CustomErrorN)__name__
__module____qualname__ r   r   @/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/python_op_test.pyr      s   r   c                   C   s   t dd S Nz!This is an intentional exception.r   r   r   r   r    SubFunctionThatThrowsCustomError   s    r   c                 C   s   t  S )N)r   inputs_r   r   r   #MainOpFunctionThatThrowsCustomError   s    r   c                 C   s   t dd S Nz,This is an intentional exception in builder.r   r   r   r   r   ,MainOpFunctionThatThrowsCustomErrorInBuilder   s    r   c                    sD   dgdkst dkst  d dk s.t  fdd}|S )Nr   name   @-C6?c                    sV   | d j d d kstdks&tdks2t d dk sBtd  d7  < d S )Nr   r   r   r   r      )dataAssertionErrorr   outputsextraindexZ
iterationsr   r   r   my_op!   s
    zop_builder.<locals>.my_op)r   )r   r!   r    r"   r   r   r   
op_builder   s    r#   c                   @   sl  e Zd Zee ddd Zdd Zdd Zee ddd	 Z	d
d Z
ee ddd Zee ddd Zee ddd Zee ddd Zee ejdddejddddedddd Zef e e dejedddd Zef d ejd!d"iejeddd#d$ Zef d ejd%d"iejeddd&d' Zd(S ))PythonOpTestxc                    s6    fdd}t |dgg }td t| d S )Nc                    sZ     j| d j   t| d jt   t| d jtj tj| d j d S Nr   	assertEqualshapetypetupler   npZndarraytestingassert_almost_equalr   selfr&   r   r   f.   s    z!PythonOpTest.test_feed.<locals>.fr&   r   r   FeedBlobRunOperatorOncer1   r&   r2   opr   r0   r   	test_feed,   s    zPythonOpTest.test_feedc              	   C   s2   t tg g }| td t| W 5 Q R X d S r   )r   r   assertRaisesRegexr   r   r5   r1   r7   r   r   r   test_exception7   s    zPythonOpTest.test_exceptionc              	   C   s2   t tg g }| td t| W 5 Q R X d S r   )r   r   r9   r   r   r5   r:   r   r   r   test_exception_builder<   s    z#PythonOpTest.test_exception_builderc                    sD    fdd}t d}||dgg  td t| d S )Nc                    sZ     j| d j   t| d jt   t| d jtj tj| d j d S r'   r(   r   r0   r   r   r2   C   s    z6PythonOpTest.test_feed_with_helper_function.<locals>.ftestr&   )r   NetPythonr   r4   Z
RunNetOnce)r1   r&   r2   netr   r0   r   test_feed_with_helper_functionA   s
    
z+PythonOpTest.test_feed_with_helper_functionc                 C   s   t d}d}|tddgddif|gg  |tddgddif|gg  tdD ]\}|d| }t|t	d	g t
| td
D ]"}t|t	|g t| qqVd S )NZbuilder_templateiterr   r   r    r      z
builder_%dr   
   )r   r>   r?   r#   rangeZCloner   r4   r-   arrayZ	CreateNetZRunNet)r1   r@   Z	iter_blobrepeatZ
cloned_netir   r   r   test_builder_tupleM   s    
  
zPythonOpTest.test_builder_tuplec                    sN    fdd}t |dgg }td t| ~td t| d S )Nc                    s,     j| d j tj| d j d S r'   )r)   r*   r-   r.   r/   r   r   r0   r   r   r2   `   s    z)PythonOpTest.test_feed_with_gc.<locals>.fr&   r3   r6   r   r0   r   test_feed_with_gc^   s    
zPythonOpTest.test_feed_with_gcc                    sP    fdd}t |dgdg}td t| td}tj| d S )Nc                    sT   |d  | d j  j| d j  j|d j | d j|d jd< d S Nr   .)reshaper*   r)   r   r   r0   r   r   r2   l   s    z$PythonOpTest.test_reshape.<locals>.fr&   y)r   r   r4   r5   	FetchBlobr-   r.   r/   )r1   r&   r2   r7   rM   r   r0   r   test_reshapej   s    

zPythonOpTest.test_reshapec                    sX    fdd}t j }td}|jg dg  jd |j|ddg g  || dS )	zI
        Verify that python op can manipulate workspace directly
        c                    s    |j d  }tj|  d S )Ninternal)Zblobsfetchr-   r.   r/   )r   r   wsZfetchedr%   r   r   r2   }   s    z3PythonOpTest.test_workspace_manipulation.<locals>.fr=   rP   )valuesr*   T)Zpass_workspaceN)	r   CZ	Workspacer   r>   ZGivenTensorFillr*   r?   run)r1   r&   r2   rR   r@   r   r%   r   test_workspace_manipulationx   s    

z(PythonOpTest.test_workspace_manipulationc                 C   s2   dd }t |dgdg}td| t| d S )Nc                 S   s&   zt dW n t k
r    Y nX d S )NzException in handler)	Exceptionr   r   r   r   r2      s    z>PythonOpTest.test_caught_exception_doesnt_terminate.<locals>.fr&   rM   r3   r6   r   r   r   &test_caught_exception_doesnt_terminate   s    z3PythonOpTest.test_caught_exception_doesnt_terminater      )Z	min_valueZ	max_value)r&   nwi  )deadlinec           
         s   dd   fddt |D }td}| j| d| _|| _d}td}|	t
d	|| td
| t|   t |D ] }tt|}	tj||	 qd S )Nc                 S   s,   |d  | d j | d j|d jd< d S rK   rL   r*   r   r   r   r   r   r2      s    z5PythonOpTest.test_multithreaded_evaluation.<locals>.fc                    s    g | ]}t  d gt|gqS r%   )r   str).0rH   r2   r   r   
<listcomp>   s     z>PythonOpTest.test_multithreaded_evaluation.<locals>.<listcomp>r@   Zdagd   planz	test-stepr&   )rE   r   r>   ZProtor7   extendr+   Znum_workersZPlanZAddStepZExecutionStepr   r4   ZRunPlanZSerializeToStringrN   r^   r-   r.   r/   )
r1   r&   rZ   r[   opsr@   Zitersrc   rH   rM   r   r`   r   test_multithreaded_evaluation   s    



z*PythonOpTest.test_multithreaded_evaluation)r&   in_placei'  c                 C   sZ   dd }dd }t |dg|r dndg|d}| |||gddg | |||gdg d S )	Nc                 S   s0   |d  | d j | d jd |d jd< d S )Nr   rC   .r]   r   r   r   r   r2      s    z%PythonOpTest.test_gradient.<locals>.fc                 S   s0   | d }|d }| |j |jd |jd< d S )NrC   r   .r]   )r   r   grad_output
grad_inputr   r   r   grad_f   s    z*PythonOpTest.test_gradient.<locals>.grad_fr&   rM   rj   r   r   ZassertGradientChecksZassertDeviceChecks)r1   r&   rg   gcdcr2   rj   r7   r   r   r   test_gradient   s       zPythonOpTest.test_gradientr   rC   )rZ   c           
   	      sx   |\}} fdd} fdd}t |ddgddg|d	}d
D ]}	 ||||g|	ddg q< ||||gddg d S )Nc                    sP   dD ]F}  t| | jt || | | j | | jd || jd< qd S )Nr   r   rC   .r)   r+   r*   r,   rL   r   r   r   idxr1   r   r   r2      s    z.PythonOpTest.test_gradient_multiple.<locals>.fc                    s^     t| d   t|d dD ]4\}}| | }|| }||j |jd |jd< q$d S )N   rC   ))   r   )r   r   .r)   lenrL   r*   r   r   r   Zgrad_output_idxZgrad_input_idxrh   ri   rt   r   r   rj      s    z3PythonOpTest.test_gradient_multiple.<locals>.grad_fx1x2y1y2rk   rp   r   r   rl   )
r1   r   rm   rn   rz   r{   r2   rj   r7   rs   r   rt   r   test_gradient_multiple   s    
z#PythonOpTest.test_gradient_multiple   c           
         s   |\}}} fdd} fdd}t |dddgdd	d
g|ddgdgd}	 ||	|||gdddg  ||	|||gdddg d S )Nc                    sP   dD ]F}  t| | jt || | | j | | jd || jd< qd S )N)r   r   rC   rC   .rq   rr   rt   r   r   r2      s    z;PythonOpTest.test_gradient_multiple_with_indices.<locals>.fc                    s^     t| d   t|d dD ]4\}}| | }|| }||j |jd |jd< q$d S )N   r   ))ru   r   rC   .rw   ry   rt   r   r   rj      s    z@PythonOpTest.test_gradient_multiple_with_indices.<locals>.grad_frz   r{   x3r|   r}   Zy3r   rC   )rj   Zgrad_output_indicesZgrad_input_indicesr   rl   )
r1   r   rm   rn   rz   r{   r   r2   rj   r7   r   rt   r   #test_gradient_multiple_with_indices   s    

  z0PythonOpTest.test_gradient_multiple_with_indicesN)r   r	   r
   r   huZtensorr8   r;   r<   rA   rI   rJ   rO   rV   rX   stZintegersr   rf   ZbooleansZgcsro   Ztensorsr~   r   r   r   r   r   r$   +   s<   






r$   )Zcaffe2.pythonr   r   Zcaffe2.python.corer   Z"caffe2.python.hypothesis_test_utilpythonZhypothesis_test_utilr   Z
hypothesisr   r   Zhypothesis.strategiesZ
strategiesr   Znumpyr-   rW   r   r   r   r   r#   ZHypothesisTestCaser$   r   r   r   r   <module>   s   