a
    þ
þdt3  ã                   @   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 ddlZddlmZ e ejd¡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j0¡e /ej0¡ej1ej1¡Z2e .e /ej3¡e /ej3¡ej1ej1¡Z4e .ej5ej5ej1ej1¡Z6G dd„ deƒZ7G dd„ deƒZ8eG dd„ deƒƒZ9e:dkr¸e ;¡  dS ) z
Tests for @cfunc and friends.
é    N)Ú
namedtuple)ÚcfuncÚcarrayÚfarrayÚnjit)ÚtypesÚtypingÚutils)ÚTestCaseÚtagÚcaptured_stderr)Únumpy_supportz4CFFI not supported -- please install the cffi modulec                 C   s   | | S ©N© ©ÚaÚbr   r   ú_/var/www/html/stable-diffusion-webui/venv/lib/python3.9/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_usecase5   s    

z-make_cfarray_usecase.<locals>.cfarray_usecaser   ©r2   r3   r   r1   r   Úmake_cfarray_usecase3   s    r5   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*   r1   r   r   r3   M   s    
z3make_cfarray_dtype_usecase.<locals>.cfarray_usecaser   r4   r   r1   r   Úmake_cfarray_dtype_usecaseJ   s    r9   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_basico   s    zTestCFunc.test_basicc                 C   s@   ddl m} | ¡ \}}ttƒtƒ}| |j¡}|  |d¡ d S )Nr   )Úcffi_usecasesg      @)	Znumba.testsrR   Zload_inline_moduler   Ú
square_sigr   Z_numba_test_funcptrÚcffirK   )rL   rR   ÚffiÚlibrM   Ú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   Úint64r   rK   rG   )rL   rM   r   r   r   Útest_locals   s    zTestCFunc.test_localsc                 C   s¸   t tƒtƒ}tƒ $}|  | dd¡d¡ W d   ƒ n1 s<0    Y  |  | ¡ d¡ tƒ (}| dd¡}|  |d¡ W d   ƒ n1 sŠ0    Y  | ¡ }|  d|¡ |  d|¡ d S )	Nr   r   g      @Ú r   g        zZeroDivisionError:zException ignored)	r   rZ   r   r   rK   rG   r=   ÚgetvaluerD   )rL   rM   ÚerrrW   r   r   r   Útest_errors•   s    2*zTestCFunc.test_errorsc                 C   s2   t tƒtƒ}| ¡ }|  |j|¡ |  d|¡ d S )Nzfadd double)r   r<   r   Zinspect_llvmrD   rA   )rL   rM   Zirr   r   r   Útest_llvm_ir¥   s    zTestCFunc.test_llvm_irc                 C   s„   |   t¡  ttddtƒ W d  ƒ n1 s00    Y  |  ¡ }ttƒtƒ W d  ƒ n1 sd0    Y  |  dt|j	ƒ¡ dS )z7
        Object mode is currently unsupported.
        T)ZforceobjNzUntyped global name 'object')
ÚassertRaisesÚNotImplementedErrorr   r<   r   ÚassertTypingErrorr   rD   rC   Ú	exception)rL   Úraisesr   r   r   Útest_object_mode«   s
    .
*zTestCFunc.test_object_modeN)
r>   Ú
__module__r?   rQ   Úskip_cffi_unsupportedrX   r\   r`   ra   rg   r   r   r   r   r:   m   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   sJ   t  dd¡ d¡ t j¡}t jtt jd}|||ƒ||ƒg|j¢R Ž  |S )Né
   é   ©r   r   r6   )r(   ÚarangeÚreshapeÚastyper8   Úemptyr!   r#   )rL   Úpointer_factoryr2   r   r-   r   r   r   Úrun_carray_usecase»   s    zTestCArray.run_carray_usecasec                 C   s(   |   ||¡}|   ||¡}|  ||¡ d S r   )rs   rK   )rL   rr   Úpyfuncr   ÚexpectedÚgotr   r   r   Úcheck_carray_usecaseÁ   s    zTestCArray.check_carray_usecasec                 C   s   |j  t j¡S r   )rG   Údata_asrI   ©rL   Zarrr   r   r   Úmake_voidptrÆ   s    zTestCArray.make_voidptrc                 C   s   |j  t  t j¡¡S r   )rG   rx   ÚPOINTERÚc_floatry   r   r   r   Úmake_float32_pointerÉ   s    zTestCArray.make_float32_pointerc                 C   s   |j  t  t j¡¡S r   )rG   rx   r{   Úc_doublery   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 d   ƒ n1 s&0    Y  ˆ  t¡  ||jj|jƒ W d   ƒ n1 sb0    Y  ˆ  t¡&}|ˆ  |¡|jt jƒ W d   ƒ n1 s¤0    Y  ˆ  dt|jƒ¡ d S )Nc                    s$   ˆ   | |¡ ˆ  | jj|jj¡ d S r   )rK   r=   rG   Údata)rv   ru   ©rL   r   r   ÚeqÐ   s    z*TestCArray.check_carray_farray.<locals>.eqr   rm   )ÚorderÚKz%mismatching dtype 'int32' for pointer)r(   rn   ro   rp   r8   Úcopyr}   r#   ÚsizeZravelr7   rz   Úint32Úviewrb   Ú	TypeErrorrG   r€   rD   rC   re   )rL   r2   rƒ   r‚   Úbaser   rf   r   r   r   Úcheck_carray_farrayÏ   s.     



206ÿ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)rL   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 d   ƒ n1 sŽ0    Y  |  dt	|j
ƒ¡ |}|   t¡D ]"}t|ƒ|ƒ}|  | j||j¡ q¸d S )Nz7mismatching dtype 'float32' for pointer type 'float64*')r˜   Úcarray_float32_usecase_sigr   rw   r}   rG   rd   Úcarray_float64_usecase_sigrD   rC   re   Úcarray_voidptr_usecase_sig)rL   ZusecaseZdtype_usecasert   ÚsigrM   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__rs   rw   rz   r}   r   r‹   r   r   r˜   r   r    r£   r   r   r   r   rj   ¶   s   (rj   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)rT   r¦   Zcdef)rL   Úsrcr¦   rU   r   r   r   Úget_ffiD  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)é	   )r7   r#   Úmyfuncr   r   )r¨   ÚtypeofÚcffi_supportÚmap_typerB   r   ZRecordr=   Úlenr‡   r8   Úfloat64ZNestedArrayr   Ú	Signaturer–   ÚCPointerr”   r—   )rL   rU   r©   Znbtyper±   rœ   r   r   r   Útest_type_parsingK  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Š   Útmpr/   Úelemr   r   r   Úcalch  s    z0TestCffiStruct.test_cfunc_callback.<locals>.calcc                    s   t | |ƒ}ˆ |ƒS r   )r   )Úptrr,   rŠ   ©r¾   r   r   Úfooq  s    
z/TestCffiStruct.test_cfunc_callback.<locals>.foozbig_struct[3]zbig_struct*r   é{   éÕ   r   r°   rk   Zsize_t)Úbufferr7   r#   )r¨   r²   r³   r´   r   r   ÚnewrH   rº   r¬   r­   r®   r¯   rF   rG   r(   ZndarrayrÄ   r   Zas_dtyper=   )rL   rU   r©   Znb_big_structrœ   rÁ   Zmydatar¿   r/   r0   rO   rv   ÚarrayÚexpectr   rÀ   r   Útest_cfunc_callbackb  s2    


ýz"TestCffiStruct.test_cfunc_callbackc                 C   s\   |   ¡ }|  t¡$}tj| d¡dd W d   ƒ n1 s<0    Y  |  dt|jƒ¡ d S )NÚerrorTrª   z0field 'bits' has bitshift, this is not supported)	r¨   rb   Ú
ValueErrorr³   r´   r²   r=   rC   re   )rL   rU   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¥   3  s
   +r¥   Ú__main__)<r¤   rG   Ú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   ZunittestZnumba.npr   Z
skipUnlessZ	SUPPORTEDri   r   r   r   r<   rZ   rS   r   r!   r5   rž   r¡   r9   rŸ   r¢   Úvoidr¸   r8   r   r™   r¶   rš   Zvoidptrr›   r:   rj   r¥   r>   Úmainr   r   r   r   Ú<module>   s^   þ
þ
þÿI}g
