U
    Ã9%e3  ã                   @   s²  d Z ddlZddlZddlZddlZddlmZ ddlZddl	m
Z
mZmZmZ ddlmZmZmZ ddlm  m  mZ ddlmZmZmZmZ ddlZddlmZ dd	„ Zd
d„ Zdd„ Z dZ!dZ"dZ#dd„ Z$dZ%dd„ Z&e&eƒZ'e&eƒZ(dd„ Z)e)eƒZ*e)eƒZ+e ,e -ej.¡e -ej.¡ej/ej/¡Z0e ,e -ej1¡e -ej1¡ej/ej/¡Z2e ,ej3ej3ej/ej/¡Z4G dd„ deƒZ5G dd„ deƒZ6eG dd„ deƒƒZ7e8dkr®e 9¡  dS )z
Tests for @cfunc and friends.
é    N)Ú
namedtuple)ÚcfuncÚcarrayÚfarrayÚnjit)ÚtypesÚtypingÚutils)ÚTestCaseÚskip_unless_cffiÚtagÚcaptured_stderr)Únumpy_supportc                 C   s   | | S ©N© ©ÚaÚbr   r   úU/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/numba/tests/test_cfunc.pyÚadd_usecase   s    r   c                 C   s   | | }|S r   r   )r   r   Úcr   r   r   Údiv_usecase   s    r   c                 C   s   | d S )Né   r   )r   r   r   r   Úsquare_usecase   s    r   zfloat64(float64, float64)zfloat64(int64, int64)zfloat64(float64)c                 C   s   t ƒ  | | S r   )Úobjectr   r   r   r   Úobjmode_usecase'   s    r   é   c                    s   ‡ fdd„}|S )Nc           	         s”   ˆ | ||fƒ}ˆ |t ƒ}|j|d< |j|dd…< |j|dd…< |jj|d< |jj|d< d}t ||¡D ] \}}||||f ||  7 }qf||d< d S )Nr   é   é   é   é   é   )	ÚCARRAY_USECASE_OUT_LENÚndimÚshapeÚstridesÚflagsÚc_contiguousÚf_contiguousÚnpÚndindex©	Zin_ptrZout_ptrÚmÚnZin_ÚoutÚsÚiÚj©Úfuncr   r   Úcfarray_usecase1   s    

z-make_cfarray_usecase.<locals>.cfarray_usecaser   ©r3   r4   r   r2   r   Úmake_cfarray_usecase/   s    r6   c                    s   ‡ fdd„}|S )Nc           	         sž   ˆ | ||ft jd}ˆ |tt jƒ}|j|d< |j|dd…< |j|dd…< |jj|d< |jj|d< d}t  	||¡D ] \}}||||f ||  7 }qp||d< d S )N©Údtyper   r   r   r   r    r!   )
r)   Úfloat32r"   r#   r$   r%   r&   r'   r(   r*   r+   r2   r   r   r4   I   s    
z3make_cfarray_dtype_usecase.<locals>.cfarray_usecaser   r5   r   r2   r   Úmake_cfarray_dtype_usecaseF   s    r:   c                   @   s@   e Zd Zdd„ Zedd„ ƒZdd„ Zdd„ Zd	d
„ Zdd„ Z	dS )Ú	TestCFuncc                 C   sš   t tƒtƒ}|  |jd¡ |  |jd¡ |  |jt¡ |j}|  	|t
¡ |  d|¡ |j}|  	|t¡ |j}|  t |tj¡j|¡ |  |ddƒd¡ dS )z8
        Basic usage and properties of a cfunc.
        r   ç       @g      @g      @N)r   Úadd_sigr   ÚassertEqualÚ__name__Ú__qualname__ZassertIsÚ__wrapped__Únative_nameÚassertIsInstanceÚstrÚassertInÚaddressÚintÚctypesÚcastÚc_void_pÚvalueÚassertPreciseEqual)ÚselfÚfÚsymbolÚaddrÚctr   r   r   Ú
test_basick   s    zTestCFunc.test_basicc                 C   s@   ddl m} | ¡ \}}ttƒtƒ}| |j¡}|  |d¡ d S )Nr   )Úcffi_usecasesg      @)	Znumba.testsrS   Zload_inline_moduler   Ú
square_sigr   Z_numba_test_funcptrÚcffirL   )rM   rS   ÚffiÚlibrN   Úresr   r   r   Ú	test_cffi   s
    zTestCFunc.test_cffic                 C   s.   t tdtjidtƒ}|  | dd¡d¡ d S )Nr   )Úlocalsr   r   r<   )r   Údiv_sigr   Zint64r   rL   rH   )rM   rN   r   r   r   Útest_locals‹   s    zTestCFunc.test_localsc              	   C   s   t tƒtƒ}tƒ }|  | dd¡d¡ W 5 Q R X |  | ¡ d¡ tƒ }| dd¡}|  |d¡ W 5 Q R X | ¡ }|  d|¡ |  d|¡ d S )	Nr   r   g      @Ú r   g        zZeroDivisionError:zException ignored)	r   r[   r   r   rL   rH   r>   ÚgetvaluerE   )rM   rN   ÚerrrX   r   r   r   Útest_errors‘   s    zTestCFunc.test_errorsc                 C   s2   t tƒtƒ}| ¡ }|  |j|¡ |  d|¡ d S )Nzfadd double)r   r=   r   Zinspect_llvmrE   rB   )rM   rN   Zirr   r   r   Útest_llvm_ir¡   s    zTestCFunc.test_llvm_irc              	   C   s\   |   t¡ ttddtƒ W 5 Q R X |  ¡ }ttƒtƒ W 5 Q R X |  dt|j	ƒ¡ dS )z7
        Object mode is currently unsupported.
        T)ZforceobjzUntyped global name 'object'N)
ÚassertRaisesÚNotImplementedErrorr   r=   r   ÚassertTypingErrorr   rE   rD   Ú	exception)rM   Úraisesr   r   r   Útest_object_mode§   s
    
zTestCFunc.test_object_modeN)
r?   Ú
__module__r@   rR   r   rY   r\   r`   ra   rg   r   r   r   r   r;   i   s   
	r;   c                   @   sp   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d„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )Ú
TestCArrayz*
    Tests for carray() and farray().
    c                 C   sH   t  dd¡ d¡ t j¡}t jtt jd}|||ƒ||ƒf|jžŽ  |S )Né
   é   ©r   r   r7   )r)   ÚarangeÚreshapeÚastyper9   Úemptyr"   r$   )rM   Úpointer_factoryr3   r   r.   r   r   r   Úrun_carray_usecase·   s    zTestCArray.run_carray_usecasec                 C   s(   |   ||¡}|   ||¡}|  ||¡ d S r   )rr   rL   )rM   rq   Úpyfuncr   ÚexpectedÚgotr   r   r   Úcheck_carray_usecase½   s    zTestCArray.check_carray_usecasec                 C   s   |j  t j¡S r   )rH   Údata_asrJ   ©rM   Zarrr   r   r   Úmake_voidptrÂ   s    zTestCArray.make_voidptrc                 C   s   |j  t  t j¡¡S r   )rH   rw   ÚPOINTERZc_floatrx   r   r   r   Úmake_float32_pointerÅ   s    zTestCArray.make_float32_pointerc                 C   s   |j  t  t j¡¡S r   )rH   rw   rz   Zc_doublerx   r   r   r   Úmake_float64_pointerÈ   s    zTestCArray.make_float64_pointerc              	      s‚  ‡ fdd„}t  d¡ d¡ t j¡j|d}|ˆ  |¡|jƒ}|||ƒ |ˆ  |¡|jƒ}||| 	d¡ƒ |ˆ  |¡|j|j
ƒ}|||ƒ |ˆ  |¡|jt jƒ}|||ƒ |ˆ  |¡|j|j
ƒ}|||ƒ |ˆ  |¡|jt jƒ}||| t j¡ƒ ˆ  t¡ |ˆ  |¡|jƒ W 5 Q R X ˆ  t¡ ||jj|jƒ W 5 Q R X ˆ  t¡}|ˆ  |¡|jt jƒ W 5 Q R X ˆ  dt|jƒ¡ d S )Nc                    s$   ˆ   | |¡ ˆ  | jj|jj¡ d S r   )rL   r>   rH   Údata)ru   rt   ©rM   r   r   ÚeqÌ   s    z*TestCArray.check_carray_farray.<locals>.eqr    rl   )ÚorderÚKz%mismatching dtype 'int32' for pointer)r)   rm   rn   ro   r9   Úcopyr{   r$   ÚsizeZravelr8   ry   Úint32Úviewrb   Ú	TypeErrorrH   r}   rE   rD   re   )rM   r3   r€   r   Úbaser   rf   r   r~   r   Úcheck_carray_farrayË   s.     



 ÿzTestCArray.check_carray_farrayc                 C   s   |   td¡ dS )z,
        Test pure Python carray().
        ÚCN)rˆ   r   r~   r   r   r   Útest_carrayó   s    zTestCArray.test_carrayc                 C   s   |   td¡ dS )z,
        Test pure Python farray().
        ÚFN)rˆ   r   r~   r   r   r   Útest_farrayù   s    zTestCArray.test_farrayc                 #   sJ   t jt jt jt jt jt jfD ](‰ t‡ fdd„|jD ƒƒ}|j	|Ž V  qdS )zŠ
        Generate a bunch of concrete signatures by varying the width
        and signedness of size arguments (see issue #1923).
        c                 3   s    | ]}|t jkrˆ n|V  qd S r   )r   Úintp)Ú.0r   ©Zactual_sizer   r   Ú	<genexpr>  s   ÿz.TestCArray.make_carray_sigs.<locals>.<genexpr>N)
r   r   r„   ZintcÚuintpZuint32ZuintcÚtupleÚargsÚreturn_type)rM   Z
formal_sigr“   r   r   r   Úmake_carray_sigsÿ   s      ÿÿzTestCArray.make_carray_sigsc              	   C   sÌ   |}|   t¡D ]"}t|ƒ|ƒ}|  | j||j¡ q|}|   t¡D ]"}t|ƒ|ƒ}|  | j||j¡ q@|  ¡ }ttƒ|ƒ}W 5 Q R X |  dt	|j
ƒ¡ |}|   t¡D ]"}t|ƒ|ƒ}|  | j||j¡ q¤d S )Nz7mismatching dtype 'float32' for pointer type 'float64*')r•   Úcarray_float32_usecase_sigr   rv   r{   rH   rd   Úcarray_float64_usecase_sigrE   rD   re   Úcarray_voidptr_usecase_sig)rM   ZusecaseZdtype_usecasers   ÚsigrN   rf   r   r   r   Úcheck_numba_carray_farray
  s"    
ÿz$TestCArray.check_numba_carray_farrayc                 C   s   |   tt¡ dS )zK
        Test Numba-compiled carray() against pure Python carray()
        N)rš   Úcarray_usecaseÚcarray_dtype_usecaser~   r   r   r   Útest_numba_carray"  s    zTestCArray.test_numba_carrayc                 C   s   |   tt¡ dS )zK
        Test Numba-compiled farray() against pure Python farray()
        N)rš   Úfarray_usecaseÚfarray_dtype_usecaser~   r   r   r   Útest_numba_farray(  s    zTestCArray.test_numba_farrayN)r?   rh   r@   Ú__doc__rr   rv   ry   r{   r|   rˆ   rŠ   rŒ   r•   rš   r   r    r   r   r   r   ri   ²   s   (ri   c                   @   s4   e Zd ZdZefdd„Zdd„ Zdd„ Zdd	„ Zd
S )ÚTestCffiStructzÎ
typedef struct _big_struct {
    int    i1;
    float  f2;
    double d3;
    float  af4[9];
} big_struct;

typedef struct _error {
    int bits:4;
} error;

typedef double (*myfunc)(big_struct*, size_t);
c                 C   s    ddl m} |ƒ }| |¡ |S )Nr   )ÚFFI)rU   r£   Zcdef)rM   Úsrcr£   rV   r   r   r   Úget_ffi@  s    
zTestCffiStruct.get_ffic                 C   sþ   |   ¡ }| d¡}tj|dd}|  |tj¡ |  t|ƒd¡ |  | d¡tj	¡ |  | d¡tj
¡ |  | d¡tj¡ |  | d¡tjtj
d	d
¡ | d¡}tj|dd}|  |tj¡ |  |jd t |¡¡ |  |jd tj¡ |  |jtj¡ d S )NÚ
big_structT©Zuse_record_dtypeé   Úi1Úf2Úd3Úaf4)é	   )r8   r$   Úmyfuncr   r   )r¥   ÚtypeofÚcffi_supportÚmap_typerC   r   ZRecordr>   Úlenr„   r9   Úfloat64ZNestedArrayr   Ú	Signaturer“   ÚCPointerr‘   r”   )rM   rV   r¦   Znbtyper®   r™   r   r   r   Útest_type_parsingG  s$    
þ
z TestCffiStruct.test_type_parsingc                    s  |   ¡ }| d¡}tj|dd}tj| d¡dd}tdd„ ƒ‰ t|ƒ‡ fdd„ƒ}| d	¡}| d
|¡}tdƒD ]V}|d || _	|d || _
d| d || _tdƒD ]}	|d |	 || j|	< q¬qrt| d|¡ƒ}
| |
d¡}tj| |¡t |¡dd}ˆ |ƒ}|  ||¡ d S )Nr¦   Tr§   r®   c                 S   sH   d}t | jƒD ]4}| | }||j|j |j 7 }|| | j ¡ 7 }q|S )Nr   )Úrangerƒ   r©   rª   r«   r¬   Úsum)r‡   Útmpr0   Úelemr   r   r   Úcalcd  s    z0TestCffiStruct.test_cfunc_callback.<locals>.calcc                    s   t | |ƒ}ˆ |ƒS r   )r   )Úptrr-   r‡   ©r»   r   r   Úfoom  s    
z/TestCffiStruct.test_cfunc_callback.<locals>.foozbig_struct[3]zbig_struct*r   é{   éÕ   r   r­   rj   Zsize_t)Úbufferr8   r$   )r¥   r¯   r°   r±   r   r   ÚnewrI   r·   r©   rª   r«   r¬   rG   rH   r)   ZndarrayrÁ   r   Zas_dtyper>   )rM   rV   r¦   Znb_big_structr™   r¾   Zmydatar¼   r0   r1   rP   ru   ÚarrayÚexpectr   r½   r   Útest_cfunc_callback^  s2    


ýz"TestCffiStruct.test_cfunc_callbackc              	   C   sH   |   ¡ }|  t¡}tj| d¡dd W 5 Q R X |  dt|jƒ¡ d S )NÚerrorTr§   z0field 'bits' has bitshift, this is not supported)	r¥   rb   Ú
ValueErrorr°   r±   r¯   r>   rD   re   )rM   rV   rf   r   r   r   Útest_unsupport_bitsize‰  s    þþz%TestCffiStruct.test_unsupport_bitsizeN)r?   rh   r@   Zc_sourcer¥   r¶   rÅ   rÈ   r   r   r   r   r¢   /  s
   +r¢   Ú__main__):r¡   rH   ÚosÚ
subprocessÚsysÚcollectionsr   Únumpyr)   Znumbar   r   r   r   Z
numba.corer   r   r	   Znumba.core.typing.cffi_utilsÚcoreZ
cffi_utilsr°   Znumba.tests.supportr
   r   r   r   ZunittestZnumba.npr   r   r   r   r=   r[   rT   r   r"   r6   r›   rž   r:   rœ   rŸ   Úvoidrµ   r9   r   r–   r³   r—   Zvoidptrr˜   r;   ri   r¢   r?   Úmainr   r   r   r   Ú<module>   s\   
 þ
 þ ÿI}g
