a
    þ
þ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   úi/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/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 d  ƒ n1 s°0    Y  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   s°  t dƒdd„ ƒ}g d¢}|D ] }t||ƒ}|  |d|f ¡ qt g d¢¡}t g d¢¡}|||ƒ |  |t g d¢¡¡ |  |jd¡ |  t	¡}| 
|¡ W d   ƒ n1 s²0    Y  |  t|jƒd	¡ |  t	¡}| |¡ W d   ƒ n1 sø0    Y  |  t|jƒd	¡ |  t	¡ }| |d
dg¡ W d   ƒ n1 sF0    Y  |  t|jƒd	¡ |  t¡}| ||¡ W d   ƒ n1 s0    Y  |  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   r   r   ©r‚   rs   é   r>   z-Reduction not defined on ufunc with signaturer   r    z?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.    


((0,z(TestDynamicGUFunc.test_gufunc_attributesc                 C   s:  t dƒdd„ ƒ}|  |j¡ t g d¢¡}t g d¢¡}t g d¢¡}||||ƒ |  |t g d¢¡¡ |  |j¡ |  | |¡d¡ |  | |¡t g d	¢¡¡ |  | 	d
dgddg¡t ddgddgg¡¡ |  | 
|d
dg¡t ddg¡¡ t g d¢¡}t ddg¡}| |d
dg|¡ |  |t g d¢¡¡ 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$   r$   r>   r„   r   r‚   r    rs   é   )r    r!   rs   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   Úaxr   r   r   Útest_scalar_input_core_type:  s$    þþ



z1TestGUVectorizeScalar.test_scalar_input_core_typec                 C   sZ   |   t¡*}tdgd| jddd„ ƒ}W d   ƒ n1 s:0    Y  |  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   sZ   |   t¡*}tdgd| jddd„ ƒ}W d   ƒ n1 s:0    Y  |  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®   Ú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