U
    hâËd  ã                   @   sŒ  d dl mZmZmZ d dlZd dlmZmZm	Z	m
Z
 G dd„ dƒZe	dd„ ƒZe	dd	„ ƒZej�s^d d
lmZ d dlmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZ G dd„ de
j ƒZ!e!ƒ Z"e #e¡dd„ ƒZ$eeƒdd„ ƒZ%ee!ƒG dd„ dej&ƒƒZ'ee!ddƒ ee!ddƒ eee
j(e
j(ƒdd„ ƒZ)ej*G dd„ deƒƒZ+ee!dƒdd„ ƒZ,ed ƒG d!d"„ d"eƒƒZ-e.d#k�rˆe /¡  dS )$é    )Úskip_on_cudasimÚunittestÚCUDATestCaseN)ÚconfigÚcudaÚnjitÚtypesc                   @   s,   e Zd ZdZdd„ Zdd„ Zedd„ ƒZdS )	ÚIntervalz7
    A half-open interval on the real number line.
    c                 C   s   || _ || _d S ©N©ÚloÚhi)Úselfr   r   © r   ú_/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/cuda/tests/cudapy/test_extending.pyÚ__init__   s    zInterval.__init__c                 C   s   d| j | jf S )NzInterval(%f, %f)r   ©r   r   r   r   Ú__repr__   s    zInterval.__repr__c                 C   s   | j | j S r
   )r   r   r   r   r   r   Úwidth   s    zInterval.widthN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Úpropertyr   r   r   r   r   r	      s
   r	   c                 C   s   | j S r
   )r   )Úintervalr   r   r   Úinterval_width   s    r   c                 C   s   t | j|j | j|j ƒS r
   ©r	   r   r   )ÚiÚjr   r   r   Úsum_intervals   s    r   )Úcgutils)Úlower_builtinÚmake_attribute_wrapperÚmodelsÚregister_modelÚtype_callableÚtypeof_impl)ÚAttributeTemplate)Úregistry)Ú
lower_attrc                       s   e Zd Z‡ fdd„Z‡  ZS )ÚIntervalTypec                    s   t ƒ jdd� d S )Nr	   )Úname)Úsuperr   r   ©Ú	__class__r   r   r   +   s    zIntervalType.__init__)r   r   r   r   Ú__classcell__r   r   r-   r   r*   *   s   r*   c                 C   s   t S r
   )Úinterval_type)ÚvalÚcr   r   r   Útypeof_interval0   s    r3   c                 C   s   dd„ }|S )Nc                 S   s    t | tjƒrt |tjƒrtS d S r
   )Ú
isinstancer   ÚFloatr0   r   r   r   r   Útyper6   s    ztype_interval.<locals>.typerr   )Úcontextr6   r   r   r   Útype_interval4   s    r8   c                   @   s   e Zd Zdd„ ZdS )ÚIntervalModelc                 C   s*   dt jfdt jfg}tj | |||¡ d S )Nr   r   )r   Úfloat64r#   ÚStructModelr   )r   ZdmmZfe_typeÚmembersr   r   r   r   =   s    þzIntervalModel.__init__N)r   r   r   r   r   r   r   r   r9   ;   s   r9   r   r   c                 C   s2   |j }|\}}t |¡| |ƒ}||_||_| ¡ S r
   )Úreturn_typer    Zcreate_struct_proxyr   r   Z	_getvalue)r7   ÚbuilderÚsigÚargsÚtypr   r   r   r   r   r   Úimpl_intervalG   s    rB   c                   @   s   e Zd ZeZdd„ ZdS )ÚInterval_attrsc                 C   s   t jS r
   )r   r:   )r   Úmodr   r   r   Úresolve_widthT   s    zInterval_attrs.resolve_widthN)r   r   r   r*   ÚkeyrE   r   r   r   r   rC   P   s   rC   r   c                 C   s$   |  |d¡}|  |d¡}| ||¡S ©Nr   é   )Zextract_valueZfsub)r7   r>   r?   Úargr   r   r   r   r   Úcuda_Interval_widthW   s    rJ   z)Extensions not supported in the simulatorc                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚTestExtendingc                 C   sB   t jdd„ ƒ}t d¡}t |¡}|d ||ƒ tj ||¡ d S )Nc                 S   s*   t |d |d ƒ}|j| d< |j| d< d S rG   r   ©ÚrÚxZivr   r   r   Úfa   s    
z(TestExtending.test_attributes.<locals>.f©ç      ø?ç      @©rH   rH   )r   ÚjitÚnpÚasarrayZ
zeros_likeÚtestingZassert_equal©r   rO   rN   rM   r   r   r   Útest_attributes`   s    


zTestExtending.test_attributesc                 C   sR   t jdd„ ƒ}t d¡}t d¡}|d ||ƒ tj |d |d |d  ¡ d S )Nc                 S   s    t |d |d ƒ}|j| d< d S rG   )r	   r   rL   r   r   r   rO   o   s    z&TestExtending.test_property.<locals>.frP   rH   rS   r   ©r   rT   rU   rV   ZzerosrW   Zassert_allcloserX   r   r   r   Útest_propertyn   s    


zTestExtending.test_propertyc                 C   sR   t jdd„ ƒ}t d¡}t d¡}|d ||ƒ tj |d |d |d  ¡ d S )Nc                 S   s"   t |d |d ƒ}t|ƒ| d< d S rG   )r	   r   rL   r   r   r   rO   |   s    z3TestExtending.test_extension_type_as_arg.<locals>.frP   rH   rS   r   rZ   rX   r   r   r   Útest_extension_type_as_arg{   s    


z(TestExtending.test_extension_type_as_argc                 C   sh   t jdd„ ƒ}t d¡}t d¡}|d ||ƒ t |d |d  |d |d  f¡}tj ||¡ d S )	Nc                 S   sF   t |d |d ƒ}t |d |d ƒ}t||ƒ}|j| d< |j| d< d S )Nr   rH   é   é   )r	   r   r   r   )rM   rN   Ziv1Ziv2Ziv_sumr   r   r   rO   ‰   s
    

z8TestExtending.test_extension_type_as_retvalue.<locals>.f)rQ   rR   g      @g      @r]   rS   r   rH   r^   rZ   )r   rO   rN   rM   Úexpectedr   r   r   Útest_extension_type_as_retvalueˆ   s    


&z-TestExtending.test_extension_type_as_retvalueN)r   r   r   rY   r[   r\   r`   r   r   r   r   rK   ^   s   rK   Ú__main__)0Znumba.cuda.testingr   r   r   ÚnumpyrU   Znumbar   r   r   r   r	   r   r   ZENABLE_CUDASIMZ
numba.corer    Znumba.core.extendingr!   r"   r#   r$   r%   r&   Znumba.core.typing.templatesr'   Znumba.cuda.cudadeclr(   Zcuda_registryZnumba.cuda.cudaimplr)   Zcuda_lower_attrÚTyper*   r0   Úregisterr3   r8   r;   r9   r5   rB   Zregister_attrrC   rJ   rK   r   Úmainr   r   r   r   Ú<module>   sB   

 



;
