o
    ‘i©?  ã                   @   sØ   d dl Z d dlZd dl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rje  ¡  dS dS )é    N)ÚvoidÚfloat32Úint64ÚjitÚguvectorize)ÚGUVectorize)ÚtagÚTestCasec           	   
   C   sv   | j \}}|j \}}t|ƒD ]*}t|ƒD ]#}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   úo/var/www/html/eduruby.in/lip-sync/lip-sync-env/lib/python3.10/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                   @   ó@   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ÚmatmulÚ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_decor/   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_like6   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   ó0   d}t | jd ƒD ]}|| | 7 }|||< q	d S r   ©r   r
   ©r   ÚresÚaccr   r   r   r   Ú	my_cumsumE   ó
   
þz'TestGUFunc.test_axis.<locals>.my_cumsum©é   é   r   ©Úaxis©r   rN   )r   r)   ÚonesÚcumsumr-   r@   Ú
zeros_like)r/   rH   r   r   ÚexpectedÚout_kwr   r   r   Ú	test_axisC   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   NrD   )r   r   rF   r   r   r   r   r0   W   s   ÿz)TestGUFunc.test_docstring.<locals>.gufuncz numba.tests.npyufunc.test_gufuncr0   rW   )r   r   ÚassertEqualÚ
__module__Ú__name__Ú__qualname__Ú__doc__r:   r   r   r   Útest_docstringV   s    
zTestGUFunc.test_docstringN)
rZ   rY   r[   r7   r3   r;   r<   rA   rU   r]   r   r   r   r   r      s    
r   c                   @   ó   e Zd ZdZdZdS )ÚTestGUFuncParallelFÚparallelN©rZ   rY   r[   Z_numba_parallel_test_r7   r   r   r   r   r_   c   ó    r_   c                   @   r   )Ú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.   )r0   r   r   r   r2   r   r   r   r3   m   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   rX   ÚlenÚtypes)
r/   r3   r0   r1   ZAi64ZBi64ZCi64r   r   r   r   r   r   Útest_dynamic_matmulk   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   rT   Zgoldenr   r   r   Úcheck_ufunc_output„   s   zETestDynamicGUFunc.test_dynamic_ufunc_like.<locals>.check_ufunc_outputr=   Trd   r>   r#   )r   r   r7   r)   r*   r?   )r/   rk   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 ]}|  || ||  ¡ ¡ q2d}|  t|¡ ||ƒ W d  ƒ dS 1 sYw   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   ó0   d}t | jd ƒD ]}|| | 7 }q	||d< d S ©Ng        r   r   rD   ©Ú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   Ú
assertTruere   r)   r*   Úint32r+   rj   r   r
   rX   ÚsumÚassertRaisesRegexÚ	TypeError)r/   ru   rs   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   rC   r   rD   rE   r   r   r   rH   ¶   rI   z.TestDynamicGUFunc.test_axis.<locals>.my_cumsumrJ   r   rM   rO   )r   r)   rP   rQ   rR   r-   r@   )r/   rH   r   rS   r   rT   r   r   r   rU   ´   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 sYw   Y  |  t|jƒd	¡ |  t	¡}| |¡ W d   ƒ n1 s|w   Y  |  t|jƒd	¡ |  t	¡}| |d
dg¡ W d   ƒ n1 s¢w   Y  |  t|jƒd	¡ |  t¡}| ||¡ W d   ƒ n1 sÆw   Y  |  t|jƒd¡ d S )NrB   c                 S   rC   r   rD   rE   r   r   r   r0   É   rI   z8TestDynamicGUFunc.test_gufunc_attributes.<locals>.gufunc)Ú	signatureÚ
accumulateÚatÚouterÚreduceÚreduceatz!dynamic gufunc not exporting "%s"©é   r!   rx   r"   ©r   r   r   r   ©r‡   rx   é   r>   z-Reduction not defined on ufunc with signaturer   r!   z?method outer is not allowed in ufunc with non-trivial signature)r   Úhasattrry   r)   ÚarrayÚassertPreciseEqualrX   r€   ÚassertRaisesÚRuntimeErrorr   ÚstrÚ	exceptionr„   r…   r}   rƒ   )r/   r0   ÚattrsÚattrÚcontainsr   rF   Úraisesr   r   r   Útest_gufunc_attributesÈ   s6   


ÿÿÿÿ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   rF   r   r   r   r8   ñ   s   z6TestDynamicGUFunc.test_gufunc_attributes2.<locals>.addr†   )r"   rx   r!   r‡   rˆ   )r%   r%   r%   r%   r>   r‰   r   r‡   r!   rx   é   )r!   r"   rx   r"   )r   ZassertIsNoner€   r)   rŒ   r   rX   r„   r   rƒ   r…   r‚   )r/   r8   r   ÚbrF   r   r   r   r   r   Útest_gufunc_attributes2ð   s"   
."z)TestDynamicGUFunc.test_gufunc_attributes2N)
rZ   rY   r[   r7   rh   rl   r   rU   r–   r™   r   r   r   r   rc   h   s    (rc   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 ]}|  || ||  	¡ ¡ q%dS )rm   zvoid(int32[:], int32[:])rn   Tro   c                 S   rp   rq   rD   rr   r   r   r   ru     s   z9TestGUVectorizeScalar.test_scalar_output.<locals>.sum_rowrv   r#   rw   rx   r   N)
r   r7   r)   r*   rz   r+   r   r
   rX   r{   )r/   ru   rs   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[:]rV   Tro   c                 S   s,   t | jd ƒD ]}| | |d  ||< qd S r   rD   ©rs   r   r   r   r   r   r   Úfoo,  s   ÿz4TestGUVectorizeScalar.test_scalar_input.<locals>.foorL   r#   r>   rx   r!   )r   r7   r)   r*   rz   r+   r   )r/   r   rs   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|| ƒ qMt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[:]rV   r6   r>   r!   rK   r   )r   r7   r)   r*   Zastyperz   rR   r-   r@   r+   r   r
   )r/   r    Z	my_gufuncÚarrÚgotrS   Úaxr   r   r   Útest_scalar_input_core_type9  s$   þþ



z1TestGUVectorizeScalar.test_scalar_input_core_typec                 C   óZ   |   t¡}tdgd| jddd„ ƒ}W d   ƒ n1 sw   Y  |  dt|jƒ¡ d S )Nr¡   z(n),(n)->(n)r6   c                 S   ó   d S ©Nr   )r   r˜   Úcr   r   r   r    W  ó   zGTestGUVectorizeScalar.test_scalar_input_core_type_error.<locals>.pyfuncz2scalar type int32 given for non scalar argument #2©rŽ   r}   r   r7   rX   r   r‘   ©r/   r•   r    r   r   r   Ú!test_scalar_input_core_type_errorU  ó   ÿýÿz7TestGUVectorizeScalar.test_scalar_input_core_type_errorc                 C   r¦   )Nzint32[:], int32[:]z
(m,n)->(n)r6   c                 S   r§   r¨   r   )r   r˜   r   r   r   r    `  rª   z8TestGUVectorizeScalar.test_ndim_mismatch.<locals>.pyfuncz,type and shape signature mismatch for arg #1r«   r¬   r   r   r   Útest_ndim_mismatch^  r®   z(TestGUVectorizeScalar.test_ndim_mismatchN)
rZ   rY   r[   r\   r7   r›   rž   r¥   r­   r¯   r   r   r   r   rš     s    	rš   c                   @   r^   )ÚTestGUVectorizeScalarParallelFr`   Nra   r   r   r   r   r°   h  rb   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   ó   | d |d d …< d S ©Nr!   r   ©r   r   r   r   r   Údoubleq  ó   zFTestGUVectorizePickling.test_pickle_gufunc_non_dyanmic.<locals>.doubleç      à?r>   N)r   ÚpickleÚdumpsÚloadsrX   Ú_frozenÚidentityre   Úgufunc_builderÚ_sigsry   Údisable_compiler   r)   r*   )r/   r¶   ÚserÚclonedr¢   r   r   r   Útest_pickle_gufunc_non_dyanmicn  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   r³   r´   r   rµ   r   r   r   r¶   Ž  r·   zLTestGUVectorizePickling.test_pickle_gufunc_dyanmic_null_init.<locals>.doubler¸   ri   r>   N)r   r¹   rº   r»   rX   r¼   r½   re   r¾   r¿   ÚassertFalser)   rj   r   r*   rR   )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   r³   r´   r   rµ   r   r   r   r¶   ³  r·   zNTestGUVectorizePickling.test_pickle_gufunc_dynamic_initialized.<locals>.doubler¸   ri   r>   N)r   r)   rj   r*   rR   r¹   rº   r»   rX   r¼   r½   re   r¾   r¿   rÅ   rÀ   ry   r   )r/   r¶   rÆ   r£   r¢   rÁ   rÂ   r   r   r   Ú&test_pickle_gufunc_dynamic_initialized­  s<   









ÿ



z>TestGUVectorizePickling.test_pickle_gufunc_dynamic_initializedN)rZ   rY   r[   rÃ   rÇ   rÈ   r   r   r   r   r±   m  s    "r±   Ú__main__)Zunittestr¹   Únumpyr)   Znumbar   r   r   r   r   Znumba.np.ufuncr   Znumba.tests.supportr   r	   r   r   r   r_   rc   rš   r°   r±   rZ   Úmainr   r   r   r   Ú<module>   s$    I $]rÿ