U
    Ã9%e©?  ã                   @   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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   ú_/var/www/html/Darija-Ai-API/env/lib/python3.8/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Ú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   r6   Úaddr   Úbuild_ufuncr2   ©r.   r/   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 r3   )r   r   r   r6   r   r2   r9   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ú(), (), () -> ()r5   z(intp, intp, intp, intp[:])é
   r"   )
r   r   r6   r7   r8   r(   r)   Úintpr,   Úassert_equal)r.   r/   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   s0   d}t | jd ƒD ]}|| | 7 }|||< qd S r   ©r   r
   ©r   ÚresÚaccr   r   r   r   Ú	my_cumsumE   s    z'TestGUFunc.test_axis.<locals>.my_cumsum©é   é   r   ©Úaxis©r   rK   )r   r(   ÚonesÚcumsumr,   r?   Ú
zeros_like)r.   rF   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   NrB   )r   r   rD   r   r   r   r   r/   W   s    z)TestGUFunc.test_docstring.<locals>.gufuncz numba.tests.npyufunc.test_gufuncr/   rT   )r   r   ÚassertEqualÚ
__module__Ú__name__Ú__qualname__Ú__doc__r9   r   r   r   Útest_docstringV   s     
zTestGUFunc.test_docstringN)
rW   rV   rX   r6   r2   r:   r;   r@   rR   rZ   r   r   r   r   r      s   
r   c                   @   s   e Zd ZdZdZdS )ÚTestGUFuncParallelFÚparallelN©rW   rV   rX   Z_numba_parallel_test_r6   r   r   r   r   r[   c   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/   r   r   r   r1   r   r   r   r2   m   s    zBTestDynamicGUFunc.test_dynamic_matmul.<locals>.check_matmul_gufuncr4   T©r6   Ú
is_dynamicr=   r    r!   r"   r$   )r   r   r6   r(   r)   r   r*   r   rU   ÚlenÚtypes)
r.   r2   r/   r0   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?   )r/   r   r   rQ   Zgoldenr   r   r   Úcheck_ufunc_output„   s    zETestDynamicGUFunc.test_dynamic_ufunc_like.<locals>.check_ufunc_outputr<   Tr_   r=   r"   )r   r   r6   r(   r)   r>   )r.   rf   r/   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©r6   Znopythonc                 S   s0   d}t | jd ƒD ]}|| | 7 }q||d< d S ©Ng        r   r   rB   ©Ú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   r6   Ú
assertTruer`   r(   r)   Úint32r*   re   r   r
   rU   ÚsumÚassertRaisesRegexÚ	TypeError)r.   ro   rm   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 )NrA   c                 S   s0   d}t | jd ƒD ]}|| | 7 }|||< qd S r   rB   rC   r   r   r   rF   ¶   s    z.TestDynamicGUFunc.test_axis.<locals>.my_cumsumrG   r   rJ   rL   )r   r(   rM   rN   rO   r,   r?   )r.   rF   r   rP   r   rQ   r   r   r   rR   ´   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 )NrA   c                 S   s0   d}t | jd ƒD ]}|| | 7 }|||< qd S r   rB   rC   r   r   r   r/   É   s    z8TestDynamicGUFunc.test_gufunc_attributes.<locals>.gufuncÚ	signatureÚ
accumulateÚatÚouterÚreduceÚreduceatz!dynamic gufunc not exporting "%s"é   r    rr   r!   r   é   r=   z-Reduction not defined on ufunc with signaturez?method outer is not allowed in ufunc with non-trivial signature)r   Úhasattrrs   r(   ÚarrayÚassertPreciseEqualrU   rz   ÚassertRaisesÚRuntimeErrorr{   ÚstrÚ	exceptionr~   r   rw   r}   )r.   r/   ÚattrsÚattrÚcontainsr   rD   Ú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   rD   r   r   r   r7   ñ   s    z6TestDynamicGUFunc.test_gufunc_attributes2.<locals>.addr€   r    rr   r!   r   r$   r=   r   é   )r   ZassertIsNonerz   r(   rƒ   r„   rU   r~   r{   r}   r   r|   )r.   r7   r   ÚbrD   r   r   r   r   r   Útest_gufunc_attributes2ð   s"    
 ."z)TestDynamicGUFunc.test_gufunc_attributes2N)
rW   rV   rX   r6   rc   rg   ry   rR   r   r   r   r   r   r   r^   h   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 )rh   zvoid(int32[:], int32[:])ri   Trj   c                 S   s0   d}t | jd ƒD ]}|| | 7 }q||d< d S rk   rB   rl   r   r   r   ro     s    z9TestGUVectorizeScalar.test_scalar_output.<locals>.sum_rowrp   r"   rq   rr   r   N)
r   r6   r(   r)   rt   r*   r   r
   rU   ru   )r.   ro   rm   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[:]rS   Trj   c                 S   s,   t | jd ƒD ]}| | |d  ||< qd S r   rB   ©rm   r   r   r   r   r   r   Úfoo,  s    z4TestGUVectorizeScalar.test_scalar_input.<locals>.foorI   r"   r=   rr   r    )r   r6   r(   r)   rt   r*   r„   )r.   r”   rm   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[:]rS   r5   r=   r    rH   r   )r   r6   r(   r)   Zastypert   rO   r,   r?   r*   r   r
   )r.   r—   Z	my_gufuncÚarrÚgotrP   Zaxr   r   r   Útest_scalar_input_core_type9  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)r5   c                 S   s   d S ©Nr   )r   r   Úcr   r   r   r—   W  s    zGTestGUVectorizeScalar.test_scalar_input_core_type_error.<locals>.pyfuncz2scalar type int32 given for non scalar argument #2©r…   rw   r   r6   rU   r‡   rˆ   ©r.   rŒ   r—   r   r   r   Ú!test_scalar_input_core_type_errorU  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)r5   c                 S   s   d S rœ   r   )r   r   r   r   r   r—   `  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)
rW   rV   rX   rY   r6   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¢   h  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   Údoubleq  s    zFTestGUVectorizePickling.test_pickle_gufunc_non_dyanmic.<locals>.doubleç      à?r=   N)r   ÚpickleÚdumpsÚloadsrU   Ú_frozenÚidentityr`   Úgufunc_builderÚ_sigsrs   Ú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   s   | d |d d …< d S r¥   r   r¦   r   r   r   r§   Ž  s    zLTestGUVectorizePickling.test_pickle_gufunc_dyanmic_null_init.<locals>.doubler¨   rd   r=   N)r   r©   rª   r«   rU   r¬   r­   r`   r®   r¯   ÚassertFalser(   re   r„   r)   rO   )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¨   rd   r=   N)r   r(   re   r)   rO   r©   rª   r«   rU   r¬   r­   r`   r®   r¯   rµ   r°   rs   r„   )r.   r§   r¶   rš   r™   r±   r²   r   r   r   Ú&test_pickle_gufunc_dynamic_initialized­  s<    









ÿ



z>TestGUVectorizePickling.test_pickle_gufunc_dynamic_initializedN)rW   rV   rX   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[   r^   r‘   r¢   r£   rW   Úmainr   r   r   r   Ú<module>   s    I $]r