U
    ,d,-                     @   sl  d dl Z d dlZd dlmZ d dlmZmZ d dlm	Z	 d dl
mZ d dlmZmZ d dlmZ d dlZdd	 Zd
d Zdd Zdd Zedddd Zedgdddd Zdd Zdd ZG dd dZdd Zdd  ZG d!d" d"eZd#d$ Z G d%d& d&eZ!G d'd( d(e!Z"G d)d* d*eZ#G d+d, d,e#Z$G d-d. d.eZ%G d/d0 d0e%Z&e'd1krhe(  dS )2    N)GUFuncBuilder)	vectorizeguvectorize)PyUFunc_One)DUFunc)tagTestCase)configc                 C   s   | | S )An addition abr   r   K/tmp/pip-unpacked-wheel-eu7e0c37/numba/tests/npyufunc/test_ufuncbuilding.pyadd   s    r   c                 C   s   | |kS Nr   r   r   r   r   equals   s    r   c                 C   s   | | S )zA multiplicationr   r   r   r   r   mul   s    r   c                 C   sJ   |j \}}t|D ]2}t|D ]$}| ||f |||f  |||f< qqdS )A generalized additionN)shaperanger   r   cxyijr   r   r   guadd   s    
r   Tnopythonc                 C   s   | | S r   r   r   r   r   r   inner    s    r    int64(int64, int64)c                 C   s   | | S r   r   r   r   r   r   inner_explicit$   s    r"   c                 C   s
   t | |S r   )r    r   r   r   r   outer(   s    r#   c                 C   s
   t | |S r   )r"   r   r   r   r   outer_explicit+   s    r$   c                   @   s   e Zd ZdS )DummyN__name__
__module____qualname__r   r   r   r   r%   /   s    r%   c                 C   sP   t   |j\}}t|D ]2}t|D ]$}| ||f |||f  |||f< q$qd S r   r%   r   r   r   r   r   r   	guadd_obj2   s
    
r+   c                 C   sH   t   |j\}}t|D ]*}t|D ]}| ||f | |||f< q$qd S r   r*   r   r   r   r   guadd_scalar_obj9   s
    
r,   c                   @   s   e Zd ZdS )MyExceptionNr&   r   r   r   r   r-   A   s   r-   c                 C   s   t d S r   )r-   )r   r   r   r   r   r   guerrorE   s    r.   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )TestUfuncBuildingc                    s   t t}|d} |j |d} |j |  fdd}tjddd}|| |d d d }|| |d	}||  j	d
  
dj d S )Nint32(int32, int32)r!   c                    s.   | | }  | |  |  |j| j d S r   assertPreciseEqualassertEqualdtyper   selfufuncr   r   checkS   s    
z1TestUfuncBuilding.test_basic_ufunc.<locals>.check   int32r4      r<      r   r
   )UFuncBuilderr   assertFalse
objectmodebuild_ufuncnparangereshaper3   r'   assertIn__doc__r6   ufbcresr8   r   r   r5   r   test_basic_ufuncK   s    


z"TestUfuncBuilding.test_basic_ufuncc                    sz   t t}|d} |j |  fdd}tjdddd }|| |d d d }|| |d	}|| d S )
Nzcomplex64(complex64, complex64)c                    s.   | | }  | |  |  |j| j d S r   r1   r   r5   r   r   r8   j   s    
z2TestUfuncBuilding.test_ufunc_struct.<locals>.checkr9   	complex64r;                 ?r<   r=   )r?   r   r@   rA   rB   rC   rD   rE   rH   r   r5   r   test_ufunc_structd   s    

z#TestUfuncBuilding.test_ufunc_structc                 C   sZ   t tddid}|d}| |j | }tjddd}|||}| || | d S )NforceobjTZtargetoptionsr0   
   r:   r;   )r?   r   
assertTruerA   rB   rC   rD   r2   )r6   rI   rJ   r7   r   r   r   r   r   test_ufunc_forceobjw   s    

z%TestUfuncBuilding.test_ufunc_forceobjc                 C   s8   t tddid}|d | }| |ddd dS )	zA
        Check nested call to an implicitly-typed ufunc.
        r   TrP   (int64, int64)r>   r<   N)r?   r#   r   rB   r3   r6   Zbuilderr7   r   r   r   test_nested_call   s    
z"TestUfuncBuilding.test_nested_callc                 C   s8   t tddid}|d | }| |ddd dS )	zA
        Check nested call to an explicitly-typed ufunc.
        r   TrP   rT   rU   r>   r<   N)r?   r$   r   rB   r3   rV   r   r   r   test_nested_call_explicit   s    
z+TestUfuncBuilding.test_nested_call_explicitN)r'   r(   r)   rK   rN   rS   rW   rX   r   r   r   r   r/   I   s
   

r/   c                   @   s   e Zd Zdd Zdd ZdS )TestUfuncBuildingJitDisabledc                 C   s   t j| _dt _d S NFr	   DISABLE_JITold_disable_jitr6   r   r   r   setUp   s    z"TestUfuncBuildingJitDisabled.setUpc                 C   s   | j t_d S r   r]   r	   r\   r^   r   r   r   tearDown   s    z%TestUfuncBuildingJitDisabled.tearDownNr'   r(   r)   r_   ra   r   r   r   r   rY      s   rY   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestGUfuncBuildingc                 C   s   t td}|d}| |j | }tjddddd}|||}| 	|| | | 
|jtd | 
|jd | d	|j d S )
N(x, y),(x, y)->(x, y)z(void(int32[:,:], int32[:,:], int32[:,:])rQ   r:   r;   r<      r   r   )r   r   r   r@   rA   rB   rC   rD   rE   r2   r3   r4   r'   rF   rG   r6   ZgufbrJ   r7   r   r   r   r   r   test_basic_gufunc   s    


z$TestGUfuncBuilding.test_basic_gufuncc                 C   s`   t td}|d}| |j | }tjdddddd }|||}| 	|| | d S )	Nrd   4void(complex64[:,:], complex64[:,:], complex64[:,:])rQ   rL   r;   r<   re   rM   )
r   r   r   r@   rA   rB   rC   rD   rE   r2   rf   r   r   r   test_gufunc_struct   s    


z%TestGUfuncBuilding.test_gufunc_structc                 C   sj   t tdtddd}|d}| |j | }tjddd	d	d
d }|||}| 
|| | d S )Nrd   TrO   rP   rh   rQ   rL   r;   r<   re   rM   )r   r   dictr   rR   rA   rB   rC   rD   rE   r2   rf   r   r   r   test_gufunc_struct_forceobj   s    

z.TestGUfuncBuilding.test_gufunc_struct_forceobjN)r'   r(   r)   rg   ri   rl   r   r   r   r   rc      s   rc   c                   @   s   e Zd Zdd Zdd ZdS )TestGUfuncBuildingJitDisabledc                 C   s   t j| _dt _d S rZ   r[   r^   r   r   r   r_      s    z#TestGUfuncBuildingJitDisabled.setUpc                 C   s   | j t_d S r   r`   r^   r   r   r   ra      s    z&TestGUfuncBuildingJitDisabled.tearDownNrb   r   r   r   r   rm      s   rm   c                   @   s   e Zd Zddddg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S )!TestVectorizeDecorr      Nreorderablec                 C   s:   t dgt}tjddd}|||}| || | d S )Nr0   rQ   r:   r;   r   r   rC   rD   r2   r6   r7   r   r   r   r   r   test_vectorize   s    
z!TestVectorizeDecor.test_vectorizec                 C   s>   t dgddt}tjddd}|||}| || | d S )Nr0   Trj   rQ   r:   r;   rq   rr   r   r   r   test_vectorize_objmode   s    
z)TestVectorizeDecor.test_vectorize_objmodec                 C   sD   t dgt}tjddd}|||}| |tj|jtjd d S )Nzbool_(int32, int32)rQ   r:   r;   )r   r   rC   rD   r2   Zonesr   Zbool_)r6   r7   r   rr   r   r   test_vectorize_bool_return   s    
z-TestVectorizeDecor.test_vectorize_bool_returnc              	   C   s   d}| j D ]4}t|g|dt}|dkr,d n|}| |j| q
t|gt}| |jd  | t t|gddt W 5 Q R X | t t|gddt W 5 Q R X d S )Nr0   )identityrp   noner<   )_supported_identitiesr   r   r3   rw   assertIsassertRaises
ValueError)r6   sigrw   r7   expectedr   r   r   test_vectorize_identity   s    
z*TestVectorizeDecor.test_vectorize_identityc                 C   sl   t ddd}t ddd}tt}| |||||  tt}t d}|||| | |||  d S )Nr   ro   rQ   r<   )rC   linspacer   r   r2   empty)r6   r   r   r7   Zufunc2r   r   r   r   test_vectorize_no_args   s    
z)TestVectorizeDecor.test_vectorize_no_argsc                 C   sF   t ddd}t ddd}ttddt}| |||||  d S )Nr   ro   rQ   r<   T)rw   r   )rC   r   r   r   r   r2   )r6   r   r   r7   r   r   r   test_vectorize_only_kws  s    z*TestVectorizeDecor.test_vectorize_only_kwsc                    sH    fdd}t dgddt}|| t ddt}|| || dS )zO
        Passing the output array as a keyword argument (issue #1867).
        c              	      sl   t jdddd}t |}| |||d} ||  |||   t | |||d W 5 Q R X d S )NrQ      r:   r;   )out)Zzzz)rC   rD   
zeros_likerz   r2   r{   	TypeError)r7   r   r   gotr^   r   r   r8     s    
z=TestVectorizeDecor.test_vectorize_output_kwarg.<locals>.checkr0   Tr   N)r   r   )r6   r8   r7   r   r^   r   test_vectorize_output_kwarg
  s    
z.TestVectorizeDecor.test_vectorize_output_kwargc                 C   sD   t dgdt}tjddddd}|||}| || | d S N$(int32[:,:], int32[:,:], int32[:,:])(x,y),(x,y)->(x,y)rQ   r:   r;   r<   re   )r   r   rC   rD   rE   r2   rr   r   r   r   test_guvectorize  s    
z#TestVectorizeDecor.test_guvectorizec                 C   sP   t dgdt}tjddddd}t|}|||| | || | d S )Nr   z(x,y),(x,y),(x,y)rQ   r:   r;   r<   re   )r   r   rC   rD   rE   r   r2   )r6   r7   r   r   r   r   r   test_guvectorize_no_output&  s    
z-TestVectorizeDecor.test_guvectorize_no_outputc                 C   sD   t dgdt}tjddddd}|||}| || | d S r   )r   r+   rC   rD   rE   r2   rr   r   r   r   test_guvectorize_objectmode.  s    
z.TestVectorizeDecor.test_guvectorize_objectmodec                 C   sD   t dgdt}tjddddd}||d}| |d | d	S )
zA
        Test passing of scalars to object mode gufuncs.
        z(int32[:,:], int32, int32[:,:])z(x,y),()->(x,y)rQ   r:   r;   r<   re   r>   N)r   r,   rC   rD   rE   r2   rr   r   r   r   "test_guvectorize_scalar_objectmode5  s    
z5TestVectorizeDecor.test_guvectorize_scalar_objectmodec              	   C   sN   t dgdddt}tjddddd	}| t ||| W 5 Q R X d S )
Nr   r   Trj   rQ   r:   r;   r<   re   )r   r.   rC   rD   rE   r{   r-   )r6   r7   r   r   r   r   $test_guvectorize_error_in_objectmode?  s     z7TestVectorizeDecor.test_guvectorize_error_in_objectmodec              	   C   s   dgdf}| j D ]4}t|d|it}|dkr2d n|}| |j| qt| t}| |jd  | t t|ddit W 5 Q R X | t t|ddit W 5 Q R X d S )Nr   r   rw   rp   rx   r<   )	ry   r   r   r3   rw   rz   r{   r|   r   )r6   argsrw   r7   r~   r   r   r   test_guvectorize_identityF  s    

z,TestVectorizeDecor.test_guvectorize_identityc              	   C   s   dg}|  t}t|dt W 5 Q R X | dt|j |  t}t|dt W 5 Q R X | t|jd |  t}t|dt W 5 Q R X d S )Nr   z)-:zbad token in signaturez(x,y),(x,y)->(x,z,v)zundefined output symbols: v,zz(x,y),(x,y),(x,y)->)	r{   r|   r   r   rF   str	exception	NameErrorr3   )r6   ZsigsZraisesr   r   r   test_guvectorize_invalid_layoutU  s    z2TestVectorizeDecor.test_guvectorize_invalid_layout)r'   r(   r)   ry   rs   rt   rv   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rn      s   

rn   c                   @   s   e Zd Zdd Zdd ZdS )TestVectorizeDecorJitDisabledc                 C   s   t j| _dt _d S rZ   r[   r^   r   r   r   r_   h  s    z#TestVectorizeDecorJitDisabled.setUpc                 C   s   | j t_d S r   r`   r^   r   r   r   ra   l  s    z&TestVectorizeDecorJitDisabled.tearDownNrb   r   r   r   r   r   f  s   r   __main__))sysZnumpyrC   Znumba.np.ufunc.ufuncbuilderr   Znumbar   r   Znumba.np.ufuncr   Znumba.np.ufunc.dufuncr   r?   Znumba.tests.supportr   r   Z
numba.corer	   Zunittestr   r   r   r   r    r"   r#   r$   r%   r+   r,   	Exceptionr-   r.   r/   rY   rc   rm   rn   r   r'   mainr   r   r   r   <module>   s@   

M
+
 

