a
    ==ic#                     @   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   m/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/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J dksJ  d dk s.J  fdd}|S )Nr   name   @-C6?c                    sV   | d j d d ksJ dks&J dks2J  d dk sBJ d  d7  < d S )Nr   r   r   r   r      )datar   outputsextraindexZ
iterationsr   r   r   my_op!   s
    zop_builder.<locals>.my_opr   )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r0   r%   r1   opr   r/   r   	test_feed,   s    zPythonOpTest.test_feedc                 C   sF   t tg g }| td t| W d    n1 s80    Y  d S r   )r   r   assertRaisesRegexr   r   r4   r0   r6   r   r   r   test_exception7   s    zPythonOpTest.test_exceptionc                 C   sF   t tg g }| td t| W d    n1 s80    Y  d S r   )r   r   r8   r   r   r4   r9   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   r/   r   r   r1   C   s    z6PythonOpTest.test_feed_with_helper_function.<locals>.ftestr%   )r   NetPythonr   r3   Z
RunNetOnce)r0   r%   r1   netr   r/   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   r3   r,   arrayZ	CreateNetZRunNet)r0   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   r/   r   r   r1   `   s    z)PythonOpTest.test_feed_with_gc.<locals>.fr%   r2   r5   r   r/   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   r/   r   r   r1   l   s    z$PythonOpTest.test_reshape.<locals>.fr%   y)r   r   r3   r4   	FetchBlobr,   r-   r.   )r0   r%   r1   r6   rL   r   r/   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   r1   }   s    z3PythonOpTest.test_workspace_manipulation.<locals>.fr<   rO   )valuesr)   T)Zpass_workspaceN)	r   CZ	Workspacer   r=   ZGivenTensorFillr)   r>   run)r0   r%   r1   rQ   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 y   Y n0 d S )NzException in handler)	Exceptionr   r   r   r   r1      s    z>PythonOpTest.test_caught_exception_doesnt_terminate.<locals>.fr%   rL   r2   r5   r   r   r   &test_caught_exception_doesnt_terminate   s    z3PythonOpTest.test_caught_exception_doesnt_terminater      )	min_value	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 rJ   rK   r)   r   r   r   r   r   r1      s    z5PythonOpTest.test_multithreaded_evaluation.<locals>.fc                    s    g | ]}t  d gt|gqS r$   )r   str).0rG   r1   r   r   
<listcomp>       z>PythonOpTest.test_multithreaded_evaluation.<locals>.<listcomp>r?   Zdagd   planz	test-stepr%   )rD   r   r=   ZProtor6   extendr*   Znum_workersZPlanZAddStepZExecutionStepr   r3   ZRunPlanZSerializeToStringrM   r_   r,   r-   r.   )
r0   r%   r[   r\   opsr?   Zitersre   rG   rL   r   ra   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   rB   .r^   r   r   r   r   r1      s    z%PythonOpTest.test_gradient.<locals>.fc                 S   s0   | d }|d }| |j |jd |jd< d S )NrB   r   .r^   )r   r   grad_output
grad_inputr   r   r   grad_f   s    z*PythonOpTest.test_gradient.<locals>.grad_fr%   rL   rl   r   r   ZassertGradientChecksZassertDeviceChecks)r0   r%   ri   gcdcr1   rl   r6   r   r   r   test_gradient   s    zPythonOpTest.test_gradientr   rB   )r[   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   rB   .r(   r*   r)   r+   rK   r   r   r   idxr0   r   r   r1      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   rB   ))   r   )r   r   .r(   lenrK   r)   r   r   r   Zgrad_output_idxZgrad_input_idxrj   rk   rv   r   r   rl      s    z3PythonOpTest.test_gradient_multiple.<locals>.grad_fx1x2y1y2rm   rr   r   r   rn   )
r0   r   ro   rp   r|   r}   r1   rl   r6   ru   r   rv   r   test_gradient_multiple   s    
z#PythonOpTest.test_gradient_multiple   c           
         s~   |\}}} fdd} fdd}t |g dg d|ddgdgd	}	 ||	|||gdddg  ||	|||gg d
 d S )Nc                    sP   dD ]F}  t| | jt || | | j | | jd || jd< qd S )Nr   r   rB   rB   .rs   rt   rv   r   r   r1      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   ))rw   r   rB   .ry   r{   rv   r   r   rl      s    z@PythonOpTest.test_gradient_multiple_with_indices.<locals>.grad_f)r|   r}   x3)r~   r   Zy3r   rB   )rl   Zgrad_output_indicesZgrad_input_indicesr   rn   )
r0   r   ro   rp   r|   r}   r   r1   rl   r6   r   rv   r   #test_gradient_multiple_with_indices   s    

z0PythonOpTest.test_gradient_multiple_with_indicesN)r   r	   r
   r   huZtensorr7   r:   r;   r@   rH   rI   rN   rU   rW   stZintegersr   rh   ZbooleansZgcsrq   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.strategies
strategiesr   numpyr,   rV   r   r   r   r   r"   ZHypothesisTestCaser#   r   r   r   r   <module>   s   