U
    iâË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   ú`/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/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)Ú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__))ÚsysÚ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
+
 

