o
    ç0 i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 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   úb/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/numba/tests/test_cfunc.pyÚadd_usecase   ó   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   r   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                    ó   ‡ 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 }q3||d< d S )Nr   é   é   é   é   é   )	ÚCARRAY_USECASE_OUT_LENÚndimÚshapeÚstridesÚflagsÚc_contiguousÚf_contiguousÚnpÚndindex©	Zin_ptrZout_ptrÚmÚnÚin_ÚoutÚsÚiÚj©Úfuncr   r   Úcfarray_usecase1   s   

z-make_cfarray_usecase.<locals>.cfarray_usecaser   ©r6   r7   r   r5   r   Úmake_cfarray_usecase/   s   r9   c                    r   )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 }q8||d< d S )N©Údtyper   r   r    r!   r"   r#   )
r+   Úfloat32r$   r%   r&   r'   r(   r)   r*   r,   r-   r5   r   r   r7   I   s   
z3make_cfarray_dtype_usecase.<locals>.cfarray_usecaser   r8   r   r5   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.testsrV   Zload_inline_moduler   Ú
square_sigr   Z_numba_test_funcptrÚcffirO   )rP   rV   ÚffiÚlibrQ   Ú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   rO   rK   )rP   rQ   r   r   r   Útest_locals‹   s   zTestCFunc.test_localsc                 C   s¸   t tƒtƒ}tƒ }|  | dd¡d¡ W d   ƒ n1 sw   Y  |  | ¡ d¡ tƒ }| dd¡}|  |d¡ W d   ƒ n1 sEw   Y  | ¡ }|  d|¡ |  d|¡ d S )	Nr!   r   g      @Ú r   g        zZeroDivisionError:zException ignored)	r   r^   r   r   rO   rK   rA   ÚgetvaluerH   )rP   rQ   Úerrr[   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_llvmrH   rE   )rP   rQ   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 sw   Y  |  ¡ }ttƒtƒ W d  ƒ n1 s2w   Y  |  dt|j	ƒ¡ dS )z7
        Object mode is currently unsupported.
        T)ZforceobjNzUntyped global name 'object')
ÚassertRaisesÚNotImplementedErrorr   r@   r   ÚassertTypingErrorr   rH   rG   Ú	exception)rP   Úraisesr   r   r   Útest_object_mode§   s   ÿ
ÿzTestCFunc.test_object_modeN)
rB   Ú
__module__rC   rU   r   r\   r_   rc   rd   rj   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   sJ   t  dd¡ d¡ t j¡}t jtt jd}|||ƒ||ƒg|j¢R Ž  |S )Né
   é   ©r   r    r:   )r+   ÚarangeÚreshapeÚastyper<   Úemptyr$   r&   )rP   Úpointer_factoryr6   r   r1   r   r   r   Úrun_carray_usecase·   s   zTestCArray.run_carray_usecasec                 C   s(   |   ||¡}|   ||¡}|  ||¡ d S r   )ru   rO   )rP   rt   Úpyfuncr   ÚexpectedÚgotr   r   r   Úcheck_carray_usecase½   s   zTestCArray.check_carray_usecasec                 C   s   |j  t j¡S r   )rK   Údata_asrM   ©rP   Zarrr   r   r   Úmake_voidptrÂ   s   zTestCArray.make_voidptrc                 C   ó   |j  t  t j¡¡S r   )rK   rz   ÚPOINTERZc_floatr{   r   r   r   Úmake_float32_pointerÅ   ó   zTestCArray.make_float32_pointerc                 C   r}   r   )rK   rz   r~   Zc_doubler{   r   r   r   Úmake_float64_pointerÈ   r€   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’w   Y  ˆ  t¡ ||jj|jƒ W d   ƒ n1 s¯w   Y  ˆ  t¡}|ˆ  |¡|jt jƒ W d   ƒ n1 sÏw   Y  ˆ  dt|jƒ¡ d S )Nc                    s$   ˆ   | |¡ ˆ  | jj|jj¡ d S r   )rO   rA   rK   Údata)rx   rw   ©rP   r   r   ÚeqÌ   s   z*TestCArray.check_carray_farray.<locals>.eqr"   ro   )ÚorderÚKz%mismatching dtype 'int32' for pointer)r+   rp   rq   rr   r<   Úcopyr   r&   ÚsizeZravelr;   r|   Úint32Úviewre   Ú	TypeErrorrK   r‚   rH   rG   rh   )rP   r6   r…   r„   Úbaser   ri   r   rƒ   r   Úcheck_carray_farrayË   s4    



ÿÿÿÿzTestCArray.check_carray_farrayc                 C   ó   |   td¡ dS )z,
        Test pure Python carray().
        ÚCN)r   r   rƒ   r   r   r   Útest_carrayó   ó   zTestCArray.test_carrayc                 C   rŽ   )z,
        Test pure Python farray().
        ÚFN)r   r   rƒ   r   r   r   Útest_farrayù   r‘   zTestCArray.test_farrayc                 #   sL    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)rP   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 sGw   Y  |  dt	|j
ƒ¡ |}|   t¡D ]}t|ƒ|ƒ}|  | j||j¡ q\d S )Nz7mismatching dtype 'float32' for pointer type 'float64*')rœ   Úcarray_float32_usecase_sigr   ry   r   rK   rg   Úcarray_float64_usecase_sigrH   rG   rh   Úcarray_voidptr_usecase_sig)rP   ZusecaseZdtype_usecaserv   ÚsigrQ   ri   r   r   r   Úcheck_numba_carray_farray
  s&   
ÿÿþz$TestCArray.check_numba_carray_farrayc                 C   ó   |   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"  r‘   zTestCArray.test_numba_carrayc                 C   r¢   )zK
        Test Numba-compiled farray() against pure Python farray()
        N)r¡   Úfarray_usecaseÚfarray_dtype_usecaserƒ   r   r   r   Útest_numba_farray(  r‘   zTestCArray.test_numba_farrayN)rB   rk   rC   Ú__doc__ru   ry   r|   r   r   r   r   r“   rœ   r¡   r¥   r¨   r   r   r   r   rl   ²   s    (rl   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)rX   r«   Zcdef)rP   Úsrcr«   rY   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)é	   )r;   r&   Úmyfuncr   r   )r­   ÚtypeofÚcffi_supportÚmap_typerF   r   ZRecordrA   Úlenr‰   r<   Úfloat64ZNestedArrayr   Ú	Signaturerš   ÚCPointerr˜   r›   )rP   rY   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 ]+}|d || _	|d || _
d| d || _tdƒD ]}	|d |	 || j|	< qVq9t| d|¡ƒ}
| |
d¡}tj| |¡t |¡dd}ˆ |ƒ}|  ||¡ d S )Nr®   Tr¯   r¶   c                 S   sH   d}t | jƒD ]}| | }||j|j |j 7 }|| | j ¡ 7 }q|S )Nr   )Úrangerˆ   r±   r²   r³   r´   Úsum)rŒ   Útmpr3   Ú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µ   rm   Zsize_t)Úbufferr;   r&   )r­   r·   r¸   r¹   r   r   ÚnewrL   r¿   r±   r²   r³   r´   rJ   rK   r+   ZndarrayrÉ   r   Zas_dtyperA   )rP   rY   r®   Znb_big_structr    rÆ   ZmydatarÄ   r3   r4   rS   rx   ÚarrayÚexpectr   rÅ   r   Útest_cfunc_callback^  s4   


ÿýz"TestCffiStruct.test_cfunc_callbackc                 C   s\   |   ¡ }|  t¡}tj| d¡dd W d   ƒ n1 sw   Y  |  dt|jƒ¡ d S )NÚerrorTr¯   z0field 'bits' has bitshift, this is not supported)	r­   re   Ú
ValueErrorr¸   r¹   r·   rA   rG   rh   )rP   rY   ri   r   r   r   Útest_unsupport_bitsize‰  s   þÿþz%TestCffiStruct.test_unsupport_bitsizeN)rB   rk   rC   Zc_sourcer­   r¾   rÍ   rÐ   r   r   r   r   rª   /  s    +rª   Ú__main__):r©   rK   Ú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^   rW   r   r$   r9   r£   r¦   r=   r¤   r§   Úvoidr½   r<   r”   r   r»   rž   ZvoidptrrŸ   r>   rl   rª   rB   Úmainr   r   r   r   Ú<module>   sZ    
þ
þÿI}gÿ