U
    iâËdµ  ã                   @   s0  d dl Z d dlmZ d dlmZ d dlmZ d dlmZm	Z	m
Z
 d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZmZmZmZ d edg¡ZG dd„ deƒZG dd„ deƒZG dd„ deƒZeeƒZ G dd„ deƒZ!eee< e!eee < dd„ Z"e"eee < G dd„ deƒZ#G dd„ de j$ƒZ%dS )é    N)Úcontextmanager)Úcached_property)Únjit)ÚerrorsÚcpuÚtyping)ÚTargetDescriptor)ÚTargetConfigurationStack)ÚBasicRetarget)Úoverload)Údispatcher_registryÚCPUDispatcherÚCPUÚtarget_registryÚjit_registryÚ.Ú	CustomCPUc                   @   s   e Zd ZdZdS )r   zExtend from the CPU target
    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   úU/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/tests/test_retargeting.pyr      s   c                   @   s    e Zd ZdZdZedd„ ƒZdS )Ú_NestedContextNc              	   c   s6   | j | jf}z|| _ || _d V  W 5 |\| _ | _X d S ©N)Ú_typing_contextÚ_target_context)ÚselfÚtyping_contextÚtarget_contextZ
old_nestedr   r   r   Únested$   s    
z_NestedContext.nested)r   r   r   r   r   r   r    r   r   r   r   r       s   r   c                   @   sP   e Zd ZejZeƒ Zedd„ ƒZ	edd„ ƒZ
edd„ ƒZedd„ ƒZd	d
„ ZdS )ÚCustomTargetDescrc                 C   s   t  | j| j¡S r   )r   Z
CPUContextr   Z_target_name©r   r   r   r   Ú_toplevel_target_context4   s    z*CustomTargetDescr._toplevel_target_contextc                 C   s   t  ¡ S r   )r   ÚContextr"   r   r   r   Ú_toplevel_typing_context9   s    z*CustomTargetDescr._toplevel_typing_contextc                 C   s   | j j}|dk	r|S | jS dS )z5
        The target context for DPU targets.
        N)Ú_nestedr   r#   ©r   r    r   r   r   r   >   s    z CustomTargetDescr.target_contextc                 C   s   | j j}|dk	r|S | jS dS )z5
        The typing context for CPU targets.
        N)r&   r   r%   r'   r   r   r   r   I   s    z CustomTargetDescr.typing_contextc                 C   s   | j  ||¡S )zˆ
        A context manager temporarily replacing the contexts with the
        given ones, for the current thread of execution.
        )r&   r    )r   r   r   r   r   r   Únested_contextT   s    z CustomTargetDescr.nested_contextN)r   r   r   r   ZCPUTargetOptionsÚoptionsr   r&   r   r#   r%   Úpropertyr   r   r(   r   r   r   r   r!   0   s   





r!   c                   @   s   e Zd ZeZdS )ÚCustomCPUDispatcherN)r   r   r   Úcustom_targetZtargetdescrr   r   r   r   r+   _   s   r+   c                  O   s*   d|kst ‚d|kst ‚t| dti|—ŽS )NÚtargetÚ_target)ÚAssertionErrorr   ÚCUSTOM_TARGET)ÚargsÚkwargsr   r   r   Ú
custom_jitg   s    r3   c                   @   s    e Zd Zedd„ ƒZdd„ ZdS )ÚCustomCPURetargetc                 C   s   t S r   )r0   r"   r   r   r   Úoutput_targets   s    zCustomCPURetarget.output_targetc                 C   s   t td�|jƒ}|S )N©r.   )r   r0   Zpy_func)r   Zcpu_dispZkernelr   r   r   Úcompile_retargetw   s    z"CustomCPURetarget.compile_retargetN)r   r   r   r*   r5   r7   r   r   r   r   r4   r   s   
r4   c                   @   s`   e Zd Zdd„ Zdd„ Ze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 )ÚTestRetargetingc                    sB   t dd�dd„ ƒ‰ t ‡ fdd„ƒ}t dd„ ƒ}tƒ | _tƒ | _d S )	Nr   r6   c                 S   s   | d S )zo
            This has a fixed target to "cpu".
            Cannot be used in CUSTOM_TARGET target.
            é
   r   ©Úxr   r   r   Úfixed_target€   s    z+TestRetargeting.setUp.<locals>.fixed_targetc                    s   ˆ | ƒd S )z‹
            This has a flexible target, but uses a fixed target function.
            Cannot be used in CUSTOM_TARGET target.
            éd   r   r:   ©r<   r   r   Úflex_call_fixedˆ   s    z.TestRetargeting.setUp.<locals>.flex_call_fixedc                 S   s   | d S )zf
            This has a flexible target.
            Can be used in CUSTOM_TARGET target.
            iè  r   r:   r   r   r   Úflex_target�   s    z*TestRetargeting.setUp.<locals>.flex_target)r   ÚlocalsÚ	functionsr4   Úretarget)r   r?   r@   r   r>   r   ÚsetUp}   s    

zTestRetargeting.setUpc                 C   s   t  | j¡S r   )r	   Úswitch_targetrC   r"   r   r   r   rE   �   s    zTestRetargeting.switch_targetc              	   c   s:   |   tj¡�}d V  W 5 Q R X |  t› d�t|jƒ¡ d S )Nz != cpu)ÚassertRaisesr   Z
NumbaErrorZassertInr0   ÚstrÚ	exception)r   Zraisesr   r   r   Úcheck_retarget_error    s    z$TestRetargeting.check_retarget_errorc                 C   s(   | j j ¡ }|  |d |d  d¡ d S )NÚhitÚmissr   )rC   ÚcacheÚstatsZassertGreater)r   rM   r   r   r   Úcheck_non_empty_cache¦   s    z%TestRetargeting.check_non_empty_cachec                    s^   | j d ‰ | j d ‰t‡ ‡fdd„ƒ}|dƒ}|  |d¡ | jj ¡ }|  |tddd�¡ d S )	Nr<   r@   c                    s   ˆ | ƒ} ˆ| ƒ} | S r   r   r:   ©r<   r@   r   r   Úfoo±   s    z'TestRetargeting.test_case0.<locals>.fooé{   im  r   )rJ   rK   )rB   r   ÚassertEqualrC   rL   rM   Údict)r   rP   ÚrrM   r   rO   r   Ú
test_case0­   s    

zTestRetargeting.test_case0c              	      sN   | j d ‰ t‡ fdd„ƒ}|  ¡ � |dƒ}W 5 Q R X |  |d¡ |  ¡  d S )Nr@   c                    s   ˆ | ƒ} | S r   r   r:   ©r@   r   r   rP   À   s    z'TestRetargeting.test_case1.<locals>.foorQ   ic  )rB   r   rE   rR   rN   )r   rP   rT   r   rV   r   Ú
test_case1½   s    

zTestRetargeting.test_case1c              
      sZ   | j d ‰ | j d ‰t‡ ‡fdd„ƒ}|  ¡ �" |  ¡ � |dƒ W 5 Q R X W 5 Q R X dS )zK
        The non-nested call into fixed_target should raise error.
        r<   r@   c                    s   ˆ | ƒ} ˆ| ƒ} | S r   r   r:   rO   r   r   rP   Ñ   s    z'TestRetargeting.test_case2.<locals>.foorQ   N©rB   r   rI   rE   ©r   rP   r   rO   r   Ú
test_case2Ê   s    



zTestRetargeting.test_case2c              
      sZ   | j d ‰| j d ‰ t‡ ‡fdd„ƒ}|  ¡ �" |  ¡ � |dƒ W 5 Q R X W 5 Q R X dS )zF
        The nested call into fixed_target should raise error
        r@   r?   c                    s   ˆ | ƒ} ˆ| ƒ} | S r   r   r:   ©r?   r@   r   r   rP   â   s    z'TestRetargeting.test_case3.<locals>.foorQ   NrX   rY   r   r[   r   Ú
test_case3Û   s    



zTestRetargeting.test_case3c              
      sn   | j d ‰| j d ‰ ˆ dƒ}|  |d¡ t‡ ‡fdd„ƒ}|  ¡ �" |  ¡ � |dƒ W 5 Q R X W 5 Q R X dS )z‚
        Same as case2 but flex_call_fixed() is invoked outside of CUSTOM_TARGET
        target before the switch_target.
        r@   r?   rQ   éé   c                    s   ˆ | ƒ} ˆ| ƒ} | S r   r   r:   r[   r   r   rP   ÷   s    z'TestRetargeting.test_case4.<locals>.fooN)rB   rR   r   rI   rE   )r   rT   rP   r   r[   r   Ú
test_case4ì   s    



zTestRetargeting.test_case4c              	      s”   dd„ ‰ t ˆ td�dd„ ƒ}t ˆ dd�dd„ ƒ}td	d
„ ƒ}t‡ fdd„ƒ}|dƒ}|  |d¡ |  ¡ � |dƒ}|  |d¡ W 5 Q R X |  ¡  dS )zA
        Tests overload resolution with target switching
        c                 S   s   d S r   r   r:   r   r   r   Úoverloaded_func  s    z3TestRetargeting.test_case5.<locals>.overloaded_func)r-   c                 S   s   dd„ }|S )Nc                 S   s   dS )Ninõ  r   r:   r   r   r   Úimpl  s    zRTestRetargeting.test_case5.<locals>.ol_overloaded_func_custom_target.<locals>.implr   ©r;   r`   r   r   r   Ú ol_overloaded_func_custom_target	  s    zDTestRetargeting.test_case5.<locals>.ol_overloaded_func_custom_targetr   c                 S   s   dd„ }|S )Nc                 S   s   dS )Ni·z  r   r:   r   r   r   r`     s    zHTestRetargeting.test_case5.<locals>.ol_overloaded_func_cpu.<locals>.implr   ra   r   r   r   Úol_overloaded_func_cpu  s    z:TestRetargeting.test_case5.<locals>.ol_overloaded_func_cpuc                 S   s   d S r   r   r:   r   r   r   Úflex_resolve_overload  s    z9TestRetargeting.test_case5.<locals>.flex_resolve_overloadc                    s   | ˆ | ƒ S r   r   r:   ©r_   r   r   rP     s    z'TestRetargeting.test_case5.<locals>.foorQ   i2{  iéõ  N)r   r0   r   rR   rE   rN   )r   rb   rc   rd   rP   rT   r   re   r   Ú
test_case5  s    





zTestRetargeting.test_case5N)r   r   r   rD   rE   r   rI   rN   rU   rW   rZ   r\   r^   rf   r   r   r   r   r8   |   s    
r8   )&ZunittestÚ
contextlibr   Ú	functoolsr   Znumbar   Z
numba.corer   r   r   Znumba.core.descriptorsr   Znumba.core.dispatcherr	   Znumba.core.retargetr
   Znumba.core.extendingr   Znumba.core.target_extensionr   r   r   r   r   Újoinr   r0   r   Úobjectr   r!   r,   r+   r3   r4   ZTestCaser8   r   r   r   r   Ú<module>   s*   ,
