U
    ,‰dß?  ã                   @   sæ   d dl Z d dlZd dlZd dlm  mZ d dlm	Z	m
Z
mZmZmZ d dlmZ d dlmZmZ dd„ 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d„ deƒZedkrâe  ¡  dS )é    N)ÚvoidÚfloat32Úint64ÚjitÚguvectorize)ÚGUVectorize)ÚtagÚTestCasec           	   
   C   sv   | j \}}|j \}}t|ƒD ]T}t|ƒD ]F}d|||f< t|ƒD ],}|||f  | ||f |||f  7  < q@q(qdS )zdocstring for matmulcorer   N)ÚshapeÚrange)	ÚAÚBÚCÚmÚnÚpÚiÚjÚk© r   úD/tmp/pip-unpacked-wheel-eu7e0c37/numba/tests/npyufunc/test_gufunc.pyÚ
matmulcore   s    

r   c                 C   s   | | | |d< d S ©Nr   r   )ÚaÚxÚyÚoutr   r   r   Úaxpy   s    r   c                   @   s@   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dS )Ú
TestGUFuncÚcpuc                 C   sv   d}t j|d d t jd |dd¡}t j|d d t jd |dd¡}|||ƒ}t ||¡}t jj||ddd d S )	Nié  é   é   ©Údtypeé   çñhãˆµøä>ç:Œ0âŽyE>©ZrtolZatol)ÚnpÚaranger   ÚreshapeÚutÚmatrix_multiplyÚtestingÚassert_allclose)ÚselfÚgufuncÚ	matrix_ctr   r   r   ÚGoldr   r   r   Úcheck_matmul_gufunc   s    ""
zTestGUFunc.check_matmul_gufuncc                 C   sf   t td| jd}| td d …d d …f td d …d d …f td d …d d …f f¡ | ¡ }|  |¡ d S ©Nú(m,n),(n,p)->(m,p)©Útarget)r   r   r7   Úaddr   Úbuild_ufuncr3   ©r/   r0   r   r   r   Útest_gufunc(   s    ÿ@zTestGUFunc.test_gufuncc                 C   s\   t ttd d …d d …f td d …d d …f td d …d d …f ƒgd| jdtƒ}|  |¡ d S r4   )r   r   r   r7   r   r3   r:   r   r   r   Útest_guvectorize_decor0   s    >þþz!TestGUFunc.test_guvectorize_decorc                 C   sX   t td| jd}| d¡ | ¡ }tjdtjd}||||ƒ}tj 	||| | ¡ d S )Nú(), (), () -> ()r6   z(intp, intp, intp, intp[:])é
   r"   )
r   r   r7   r8   r9   r(   r)   Úintpr-   Úassert_equal)r/   r0   r   r   r   r   r   Útest_ufunc_like7   s    
zTestGUFunc.test_ufunc_likec                 C   sp   t dgdƒdd„ ƒ}t d¡}||dd}tj|dd}tj ||¡ t |¡}|||dd tj ||¡ d S )	Nzf8[:],f8[:]ú(n)->(n)c                 S   s0   d}t | jd ƒD ]}|| | 7 }|||< qd S r   ©r   r
   ©r   ÚresÚaccr   r   r   r   Ú	my_cumsumF   s    z'TestGUFunc.test_axis.<locals>.my_cumsum©é   é   r   ©Úaxis©r   rL   )r   r(   ÚonesÚcumsumr-   r@   Ú
zeros_like)r/   rG   r   r   ÚexpectedÚout_kwr   r   r   Ú	test_axisD   s    



zTestGUFunc.test_axisc                 C   sf   t td d … ttd d … fgdƒdd„ ƒ}|  d|j¡ |  d|j¡ |  d|j¡ |  d|j¡ d S )Nú(n),()->(n)c                 S   s(   t | jd ƒD ]}| | | ||< qdS )údocstring for gufuncr   NrC   )r   r   rE   r   r   r   r   r0   X   s    z)TestGUFunc.test_docstring.<locals>.gufuncz numba.tests.npyufunc.test_gufuncr0   rU   )r   r   ÚassertEqualÚ
__module__Ú__name__Ú__qualname__Ú__doc__r:   r   r   r   Útest_docstringW   s     
zTestGUFunc.test_docstringN)
rX   rW   rY   r7   r3   r;   r<   rA   rS   r[   r   r   r   r   r      s   
r   c                   @   s   e Zd ZdZdZdS )ÚTestGUFuncParallelFÚparallelN©rX   rW   rY   Z_numba_parallel_test_r7   r   r   r   r   r\   d   s   r\   c                   @   s@   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dS )ÚTestDynamicGUFuncr   c           
      C   s  dd„ }t td| jdd}d}tj|d d tjd	 |dd¡}tj|d d
 tjd	 |dd
¡}tj|d d
 tjd	 |dd
¡}|||||ƒ tj|d d tjd	 |dd¡}tj|d d
 tjd	 |dd
¡}tj|d d
 tjd	 |dd
¡}	|||||	ƒ |  t	|j
ƒd¡ d S )Nc                 S   s0   t  ||¡}| |||ƒ tjj||ddd d S )Nr%   r&   r'   )r+   r,   r(   r-   r.   )r0   r   r   r   r2   r   r   r   r3   n   s    zBTestDynamicGUFunc.test_dynamic_matmul.<locals>.check_matmul_gufuncr5   T©r7   Ú
is_dynamicr>   r    r!   r"   r$   )r   r   r7   r(   r)   r   r*   r   rV   ÚlenÚtypes)
r/   r3   r0   r1   ZAi64ZBi64ZCi64r   r   r   r   r   r   Útest_dynamic_matmull   s     ÿ""""""z%TestDynamicGUFunc.test_dynamic_matmulc                 C   s8   dd„ }t td| jdd}tjdtjd}|||ƒ d S )Nc                 S   sj   t jd|jd}t jd|jd}| ||||ƒ | ||||d || | }t j ||¡ t j ||¡ d S )Nr>   r"   ©r   )r(   Úzerosr#   r-   r@   )r0   r   r   rR   Zgoldenr   r   r   Úcheck_ufunc_output…   s    zETestDynamicGUFunc.test_dynamic_ufunc_like.<locals>.check_ufunc_outputr=   Tr`   r>   r"   )r   r   r7   r(   r)   r?   )r/   rg   r0   r   r   r   r   Útest_dynamic_ufunc_likeƒ   s    
ÿz)TestDynamicGUFunc.test_dynamic_ufunc_likec              	   C   sª   t d| jdddd„ ƒ}|  |j¡ tjdtjd dd	¡}tjdtjd}|||ƒ t	|j
d
 ƒD ]}|  || ||  ¡ ¡ qdd}|  t|¡ ||ƒ W 5 Q R X dS )úw
        Note that scalar output is a 0-dimension array that acts as
        a pointer to the output location.
        ú(n)->()T©r7   Znopythonc                 S   s0   d}t | jd ƒD ]}|| | 7 }q||d< d S ©Ng        r   r   rC   ©Úinpr   Útmpr   r   r   r   Úsum_row   s    z=TestDynamicGUFunc.test_dynamic_scalar_output.<locals>.sum_rowé0u  r"   é'  é   r   z)Too few arguments for function 'sum_row'.N)r   r7   Ú
assertTruera   r(   r)   Úint32r*   rf   r   r
   rV   ÚsumÚassertRaisesRegexÚ	TypeError)r/   rp   rn   r   r   Úmsgr   r   r   Útest_dynamic_scalar_output—   s    


z,TestDynamicGUFunc.test_dynamic_scalar_outputc                 C   sx   t dƒdd„ ƒ}t d¡}tj|dd}t |¡}|||dd tj ||¡ t |¡}|||dd tj ||¡ d S )NrB   c                 S   s0   d}t | jd ƒD ]}|| | 7 }|||< qd S r   rC   rD   r   r   r   rG   ·   s    z.TestDynamicGUFunc.test_axis.<locals>.my_cumsumrH   r   rK   rM   )r   r(   rN   rO   rP   r-   r@   )r/   rG   r   rQ   r   rR   r   r   r   rS   µ   s    



zTestDynamicGUFunc.test_axisc              	   C   sp  t dƒdd„ ƒ}dddddd	g}|D ] }t||ƒ}|  |d
|f ¡ q$t ddddg¡}t ddddg¡}|||ƒ |  |t ddddg¡¡ |  |jd¡ |  t	¡}| 
|¡ W 5 Q R X |  t|jƒd¡ |  t	¡}| |¡ W 5 Q R X |  t|jƒd¡ |  t	¡}| |ddg¡ W 5 Q R X |  t|jƒd¡ |  t¡}| ||¡ W 5 Q R X |  t|jƒd¡ d S )NrB   c                 S   s0   d}t | jd ƒD ]}|| | 7 }|||< qd S r   rC   rD   r   r   r   r0   Ê   s    z8TestDynamicGUFunc.test_gufunc_attributes.<locals>.gufuncÚ	signatureÚ
accumulateÚatÚouterÚreduceÚreduceatz!dynamic gufunc not exporting "%s"é   r    rs   r!   r   é   r>   z-Reduction not defined on ufunc with signaturez?method outer is not allowed in ufunc with non-trivial signature)r   Úhasattrrt   r(   ÚarrayÚassertPreciseEqualrV   r{   ÚassertRaisesÚRuntimeErrorr|   ÚstrÚ	exceptionr   r€   rx   r~   )r/   r0   ÚattrsÚattrÚcontainsr   rE   Úraisesr   r   r   Útest_gufunc_attributesÉ   s.    


z(TestDynamicGUFunc.test_gufunc_attributesc              	   C   sV  t dƒdd„ ƒ}|  |j¡ t ddddg¡}t ddddg¡}t ddddg¡}||||ƒ |  |t d	d	d	d	g¡¡ |  |j¡ |  | |¡d
¡ |  | |¡t dddd
g¡¡ |  | 	ddgddg¡t ddgddgg¡¡ |  | 
|ddg¡t ddg¡¡ t ddddg¡}t ddg¡}| |ddg|¡ |  |t ddddg¡¡ d S )Nz	(),()->()c                 S   s   | | |d< d S r   r   )r   r   rE   r   r   r   r8   ò   s    z6TestDynamicGUFunc.test_gufunc_attributes2.<locals>.addr   r    rs   r!   r   r$   r>   r‚   é   )r   ZassertIsNoner{   r(   r„   r…   rV   r   r|   r~   r€   r}   )r/   r8   r   ÚbrE   r   r   r   r   r   Útest_gufunc_attributes2ñ   s"    
 ."z)TestDynamicGUFunc.test_gufunc_attributes2N)
rX   rW   rY   r7   rd   rh   rz   rS   rŽ   r‘   r   r   r   r   r_   i   s   (r_   c                   @   s<   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dS )ÚTestGUVectorizeScalarz<
    Nothing keeps user from out-of-bound memory access
    r   c                 C   sl   t dgd| jdddd„ ƒ}tjdtjd d	d
¡}||ƒ}t|jd ƒD ]}|  || ||  	¡ ¡ qJdS )ri   zvoid(int32[:], int32[:])rj   Trk   c                 S   s0   d}t | jd ƒD ]}|| | 7 }q||d< d S rl   rC   rm   r   r   r   rp     s    z9TestGUVectorizeScalar.test_scalar_output.<locals>.sum_rowrq   r"   rr   rs   r   N)
r   r7   r(   r)   ru   r*   r   r
   rV   rv   )r/   rp   rn   r   r   r   r   r   Útest_scalar_output  s     ÿ

z(TestGUVectorizeScalar.test_scalar_outputc                 C   sR   t dgd| jdddd„ ƒ}tjdtjd d	d
¡}||dƒ}|  |d |¡ d S )Nzint32[:], int32[:], int32[:]rT   Trk   c                 S   s,   t | jd ƒD ]}| | |d  ||< qd S r   rC   ©rn   r   r   r   r   r   r   Úfoo-  s    z4TestGUVectorizeScalar.test_scalar_input.<locals>.foorJ   r"   r>   rs   r    )r   r7   r(   r)   ru   r*   r…   )r/   r•   rn   r   r   r   r   Útest_scalar_input+  s     ÿ

z'TestGUVectorizeScalar.test_scalar_inputc                 C   sÆ   dd„ }t dgd| jd|ƒ}t d¡ tj¡}||dƒ}t |¡}||d|ƒ tj ||¡ t d¡ tj¡ 	dd¡}||dƒ}t |¡}t
|jd	 ƒD ]}||| d|| ƒ qštj ||¡ d S )
Nc                 S   s(   t | jƒD ]}|| | d  ||< q
d S )Nr   )r   Úsizer”   r   r   r   Úpyfunc;  s    zATestGUVectorizeScalar.test_scalar_input_core_type.<locals>.pyfuncúint32[:], int32, int32[:]rT   r6   r>   r    rI   r   )r   r7   r(   r)   Zastyperu   rP   r-   r@   r*   r   r
   )r/   r˜   Z	my_gufuncÚarrÚgotrQ   Zaxr   r   r   Útest_scalar_input_core_type:  s$    þþ



z1TestGUVectorizeScalar.test_scalar_input_core_typec              	   C   sF   |   t¡ }tdgd| jddd„ ƒ}W 5 Q R X |  dt|jƒ¡ d S )Nr™   z(n),(n)->(n)r6   c                 S   s   d S ©Nr   )r   r   Úcr   r   r   r˜   X  s    zGTestGUVectorizeScalar.test_scalar_input_core_type_error.<locals>.pyfuncz2scalar type int32 given for non scalar argument #2©r†   rx   r   r7   rV   rˆ   r‰   ©r/   r   r˜   r   r   r   Ú!test_scalar_input_core_type_errorV  s    ÿÿz7TestGUVectorizeScalar.test_scalar_input_core_type_errorc              	   C   sF   |   t¡ }tdgd| jddd„ ƒ}W 5 Q R X |  dt|jƒ¡ d S )Nzint32[:], int32[:]z
(m,n)->(n)r6   c                 S   s   d S r   r   )r   r   r   r   r   r˜   a  s    z8TestGUVectorizeScalar.test_ndim_mismatch.<locals>.pyfuncz,type and shape signature mismatch for arg #1rŸ   r    r   r   r   Útest_ndim_mismatch_  s    ÿÿz(TestGUVectorizeScalar.test_ndim_mismatchN)
rX   rW   rY   rZ   r7   r“   r–   rœ   r¡   r¢   r   r   r   r   r’     s   	r’   c                   @   s   e Zd ZdZdZdS )ÚTestGUVectorizeScalarParallelFr]   Nr^   r   r   r   r   r£   i  s   r£   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestGUVectorizePicklingc                 C   sÂ   t dgdƒdd„ ƒ}t |¡}t |¡}|  |j|j¡ |  |j|j¡ |  |j|j¡ |  |jj	|jj	¡ |  
|j¡ | ¡  |  
|j¡ |  |dƒ|dƒ¡ t d¡}|  ||ƒ||ƒ¡ dS )zNon-dynamic gufunc.
        zf8,f8[:]ú()->()c                 S   s   | d |d d …< d S ©Nr    r   ©r   r   r   r   r   Údoubler  s    zFTestGUVectorizePickling.test_pickle_gufunc_non_dyanmic.<locals>.doubleç      à?r>   N)r   ÚpickleÚdumpsÚloadsrV   Ú_frozenÚidentityra   Úgufunc_builderÚ_sigsrt   Údisable_compiler…   r(   r)   )r/   r¨   ÚserÚclonedrš   r   r   r   Útest_pickle_gufunc_non_dyanmico  s     




ÿ
z6TestGUVectorizePickling.test_pickle_gufunc_non_dyanmicc                 C   sö   t ddddd„ ƒ}t |¡}t |¡}|  |j|j¡ |  |j|j¡ |  |j|j¡ |  |jj	|jj	¡ |  
|j¡ t d¡}t d¡}|d|d |d|d |  ||¡ t d¡}t |¡}t |¡}|||d |||d |  ||¡ d	S )
z:Dynamic gufunc w/o prepopulating before pickling.
        r¥   r   ©r®   c                 S   s   | d |d d …< d S r¦   r   r§   r   r   r   r¨     s    zLTestGUVectorizePickling.test_pickle_gufunc_dyanmic_null_init.<locals>.doubler©   re   r>   N)r   rª   r«   r¬   rV   r­   r®   ra   r¯   r°   ÚassertFalser(   rf   r…   r)   rP   )r/   r¨   r²   r³   Úexpectr›   rš   r   r   r   Ú$test_pickle_gufunc_dyanmic_null_initŒ  s,    




ÿ




z<TestGUVectorizePickling.test_pickle_gufunc_dyanmic_null_initc                 C   sJ  t ddddd„ ƒ}t d¡}t d¡}|d|d t d¡}t |¡}t |¡}|||d t |¡}t |¡}|  |j	|j	¡ |  |j
|j
¡ |  |j|j¡ |  |jj|jj¡ |  |j	¡ | ¡  |  |j	¡ t d¡}t d¡}|d|d |d|d |  ||¡ t |¡}t |¡}|||d |||d |  ||¡ d	S )
zªDynamic gufunc prepopulated before pickling.

        Once unpickled, we disable compilation to verify that the gufunc
        compilation state is carried over.
        r¥   r   rµ   c                 S   s   | d |d d …< d S r¦   r   r§   r   r   r   r¨   ´  s    zNTestGUVectorizePickling.test_pickle_gufunc_dynamic_initialized.<locals>.doubler©   re   r>   N)r   r(   rf   r)   rP   rª   r«   r¬   rV   r­   r®   ra   r¯   r°   r¶   r±   rt   r…   )r/   r¨   r·   r›   rš   r²   r³   r   r   r   Ú&test_pickle_gufunc_dynamic_initialized®  s<    









ÿ



z>TestGUVectorizePickling.test_pickle_gufunc_dynamic_initializedN)rX   rW   rY   r´   r¸   r¹   r   r   r   r   r¤   n  s   "r¤   Ú__main__)Zunittestrª   Znumpyr(   Znumpy.core.umath_testsÚcoreZumath_testsr+   Znumbar   r   r   r   r   Znumba.np.ufuncr   Znumba.tests.supportr   r	   r   r   r   r\   r_   r’   r£   r¤   rX   Úmainr   r   r   r   Ú<module>   s"   I $]r