U
    iâËd¿)  ã                   @   sÌ  d Z ddlZddlZddlmZ ddlmZ ddlZddl	m
Z
 ddlZddlmZmZ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mZmZmZmZmZm Z  ddl!m"Z" ddl#m$Z$m%Z% da&dd„ Z'e dd„ ƒZ(dd„ Z)G dd„ dej*ƒZ+G dd„ dej,ƒZ-e .e+¡dd„ ƒZ/ee-ƒG dd„ dej0j1j2j3ƒƒZ4ee+ƒdd„ ƒZ5ee+ej6ej7ej,ƒdd„ ƒZ8ee-ƒd d!„ ƒZ9ee-d"ƒd#d$„ ƒZ:ed%d&„ ƒZ;G d'd(„ d(e%e$ƒZ<e=d)k�rÈe >¡  dS )*z!
Test NumPy Subclassing features
é    N)ÚNumber©Úwraps)Úir)ÚnjitÚtypeofÚobjmode)ÚcgutilsÚtypesÚtyping)Úbox)ÚTypingError)Ú
cpu_target)Ú	intrinsicÚlower_builtinÚoverload_classmethodÚregister_modelÚtype_callableÚtypeof_implÚregister_jitable)Únumpy_support)ÚTestCaseÚMemoryLeakMixinc                  G   s   t d k	rt  | ¡ d S ©N)Ú_loggerÚappend©Úargs© r   ú\/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/tests/test_ndarray_subclasses.pyÚ_do_log   s    r    c               	   G   s   t ƒ � t| Ž  W 5 Q R X d S r   )r   r    r   r   r   r   Úlog$   s    r!   c                    s   t ˆ ƒ‡ fdd„ƒ}|S )Nc                     s   g a ˆ | |ŽS r   )r   )r   Úkwargs©Úfnr   r   Úcore+   s    zuse_logger.<locals>.corer   )r$   r%   r   r#   r   Ú
use_logger*   s    r&   c                   @   s   e Zd ZdZdd„ ZdS )ÚMyArrayTc           	      O   sÆ   |dkr¾d }g }|D ]Œ}t |tƒr.| |¡ qt |t| ƒtjfƒr˜t |t| ƒƒrj| t |j|j|¡¡ n
| |¡ |d k	r�||jkr–tdƒ‚q |j}qt	  S q|||Ž}|  
|j|j|¡S t	S d S )NÚ__call__zinconsistent sizes)Ú
isinstancer   r   ÚtypeÚnpÚndarrayÚshapeÚdtypeÚ	TypeErrorÚNotImplementedÚ	__class__)	ÚselfÚufuncÚmethodÚinputsr"   ÚNZscalarsÚinpÚretr   r   r   Ú__array_ufunc__=   s$    





zMyArray.__array_ufunc__N)Ú__name__Ú
__module__Ú__qualname__Z __numba_array_subtype_dispatch__r9   r   r   r   r   r'   3   s   r'   c                       s:   e Zd Zd‡ fdd„	Zdd„ Zdd„ Zed	d
„ ƒZ‡  ZS )ÚMyArrayTypeFTc                    s4   d|› d|› d|› d�}t ƒ j||||||d� d S )NzMyArray(z, ú))ÚreadonlyÚalignedÚname)ÚsuperÚ__init__)r2   r.   ÚndimÚlayoutr?   r@   rA   ©r1   r   r   rC   W   s
     ÿzMyArrayType.__init__c                 O   s   t ‚d S r   )ÚNotImplementedError)r2   r   r"   r   r   r   Úcopy\   s    zMyArrayType.copyc                 O   sN   |dkrF|D ]}t |tjtjfƒst  S qtdd„ |D ƒƒrBtS tS tS d S )Nr(   c                 s   s   | ]}t |tƒV  qd S r   )r)   r=   )Ú.0r7   r   r   r   Ú	<genexpr>h   s     z.MyArrayType.__array_ufunc__.<locals>.<genexpr>)r)   r
   ÚArrayr   r0   Úallr=   )r2   r3   r4   r5   r"   r7   r   r   r   r9   b   s    
zMyArrayType.__array_ufunc__c                 C   s   t S r   )r'   )r2   r   r   r   Úbox_typen   s    zMyArrayType.box_type)FT)	r:   r;   r<   rC   rH   r9   ÚpropertyrM   Ú__classcell__r   r   rF   r   r=   V   s
   r=   c                 C   s\   zt  | j¡}W n$ tk
r4   td| jf ƒ‚Y nX t  | ¡}| jj }t|| j	||d�S )NzUnsupported array dtype: %s)r?   )
r   Z
from_dtyper.   rG   Ú
ValueErrorZ
map_layoutÚflagsZ	writeabler=   rD   )ÚvalÚcr.   rE   r?   r   r   r   Útypeof_ta_ndarrays   s    

rT   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚMyArrayTypeModelc                    s~   |j }dt |j¡fdtjfdtjfdtjfdt |j¡fdt tj|¡fdt tj|¡fdtjfg}tt	| ƒ 
|||¡ d S )	NÚmeminfoÚparentZnitemsÚitemsizeÚdatar-   ÚstridesZextra_field)rD   r
   ÚMemInfoPointerr.   ZpyobjectZintpZCPointerÚUniTuplerB   rU   rC   )r2   ZdmmZfe_typerD   ÚmembersrF   r   r   rC   €   s    ø
zMyArrayTypeModel.__init__)r:   r;   r<   rC   rO   r   r   rF   r   rU   ~   s   rU   c                 C   s   dd„ }|S )Nc                 S   s   t |jt| ƒ|jd�}|S )N)r.   rD   rE   )r=   r.   ÚlenrE   )r-   r.   ÚbufÚoutr   r   r   Útyper‘   s      ÿztype_myarray.<locals>.typerr   )Úcontextra   r   r   r   Útype_myarray�   s    rc   c                 C   s‚   ddl m}m} |jd }|\}}}	||ƒ| ||	d�}
||jƒ| |ƒ}|||
j|
j|
j|
j|
j	d� | 
¡ }| j ||j|¡ |S )Nr   )Ú
make_arrayÚpopulate_arrayéÿÿÿÿ)Úvalue)rY   r-   rZ   rX   rV   )Znumba.np.arrayobjrd   re   r   Úreturn_typerY   r-   rZ   rX   rV   Z	_getvalueÚnrtZincref)rb   ÚbuilderÚsigr   rd   re   Zsrcarytyr-   r.   r_   ZsrcaryZretaryr8   r   r   r   Úimpl_myarrayš   s    

ûrl   c                 C   sT   |j jst‚t | j¡}|j |j |¡¡}|j	 
| ||¡}|j j |j| |¡ |S r   )rb   Z
enable_nrtÚAssertionErrorr   Zas_dtyper.   Zenv_managerZ
read_constZ	add_constZpyapiZnrt_adapt_ndarray_to_pythonri   Zdecrefrj   )ÚtyprR   rS   Znp_dtypeZdtypeptrZnewaryr   r   r   Ú	box_array±   s    ro   Z	_allocatec                 C   s   dd„ }|S )z;Implements a Numba-only classmethod on the array type.
    c                 S   s   t d||ƒ t||ƒS )NúLOG _ol_array_allocate)r!   Úallocator_MyArray)ÚclsÚ	allocsizeÚalignr   r   r   ÚimplÀ   s    z _ol_array_allocate.<locals>.implr   )rr   rs   rt   ru   r   r   r   Ú_ol_array_allocate¼   s    rv   c                 C   s*   dd„ }t  t j¡}t |||¡}||fS )Nc                 S   sÊ   | j  ¡  |\}}|j}t d¡}tj}t |d¡}	tj||	dd�}
| 	|
d¡}t |tj
||g¡}tj||dd�}|j d¡ t|tjƒrœ|  tj|¡}n|j|ks®tdƒ‚| 	||||g¡}d|_|S )	Né    r   Z"_nrt_get_sample_external_allocator)rA   Z'NRT_MemInfo_alloc_safe_aligned_externalZnoaliaszalign must be a uint32Zallocate_MyArray)ri   Z_require_nrtÚmoduler   ZIntTyper	   Z	voidptr_tÚFunctionTypeZget_or_insert_functionÚcallZintp_tZreturn_valueZadd_attributer)   ÚbuiltinsÚintZget_constantr
   Zuint32r*   rm   rA   )rb   rj   rk   r   Úsizert   ÚmodÚu32ÚvoidptrZget_alloc_fntyZget_alloc_fnZ	ext_allocZfntyr$   rz   r   r   r   ru   É   s2    

  ÿ  ÿzallocator_MyArray.<locals>.impl)r
   r[   r€   r   Ú	signature)Z	typingctxrs   rt   ru   Zmiprk   r   r   r   rq   Ç   s    rq   c                   @   sN   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zejd	d
„ ƒZ	dd„ Z
edd„ ƒZdS )ÚTestNdarraySubclassesc                 C   sh   t dd„ ƒ}t d¡}t|j|j|ƒ}| |¡}||ƒ}|  |t¡ |  t	|ƒt	|ƒ¡ |  
||¡ dS )z6This tests the path to `MyArrayType.box_type`
        c                 S   s   | d S )Né   r   ©Úar   r   r   Úfooî   s    z6TestNdarraySubclasses.test_myarray_return.<locals>.fooé   N©r   r+   Úaranger'   r-   r.   Úpy_funcÚassertIsInstanceÚassertIsr*   ÚassertPreciseEqual©r2   r†   r_   r…   ÚexpectedÚgotr   r   r   Útest_myarray_returnë   s    


z)TestNdarraySubclasses.test_myarray_returnc                 C   sh   t dd„ ƒ}t d¡}t|j|j|ƒ}| |¡}||ƒ}|  |t¡ |  t	|ƒt	|ƒ¡ |  
||¡ d S )Nc                 S   s   | S r   r   r„   r   r   r   r†   û   s    z8TestNdarraySubclasses.test_myarray_passthru.<locals>.foor‡   rˆ   rŽ   r   r   r   Útest_myarray_passthruú   s    


z+TestNdarraySubclasses.test_myarray_passthruc                 C   sX   t dd„ ƒ}t d¡}| |¡}||ƒ}|  |t¡ |  t|ƒt|ƒ¡ |  ||¡ d S )Nc                 S   s   t | j| j| ƒS r   ©r'   r-   r.   )r_   r   r   r   r†     s    z7TestNdarraySubclasses.test_myarray_convert.<locals>.foor‡   )	r   r+   r‰   rŠ   r‹   r'   rŒ   r*   r�   )r2   r†   r_   r�   r�   r   r   r   Útest_myarray_convert  s    


z*TestNdarraySubclasses.test_myarray_convertc                 C   s@   dd„ }t  d¡}||ƒ}|  t|ƒt j¡ |  ||| ¡ d S )Nc                 S   s   t | j| j| ƒ}t |¡|  S r   ©r'   r-   r.   r+   Zasarray©r_   Z	convertedr   r   r   r†     s    z?TestNdarraySubclasses.test_myarray_asarray_non_jit.<locals>.foor‡   )r+   r‰   rŒ   r*   r,   r�   ©r2   r†   r_   r�   r   r   r   Útest_myarray_asarray_non_jit  s
    
z2TestNdarraySubclasses.test_myarray_asarray_non_jitc                 C   s<   |   ¡  tdd„ ƒ}t d¡}||ƒ}|  t|ƒtj¡ d S )Nc                 S   s   t | j| j| ƒ}t |¡S r   r•   r–   r   r   r   r†   !  s    z7TestNdarraySubclasses.test_myarray_asarray.<locals>.foor‡   )Zdisable_leak_checkr   r+   r‰   rŒ   r*   r,   r—   r   r   r   Útest_myarray_asarray  s    

z*TestNdarraySubclasses.test_myarray_asarrayc              	   C   s^   t dd„ ƒ}tjdtjd�}|  t¡�}||ƒ W 5 Q R X d}|D ]}|  |t|jƒ¡ qBd S )Nc                 S   s   t | j| j| ƒ}|| S r   r“   r–   r   r   r   r†   -  s    zATestNdarraySubclasses.test_myarray_ufunc_unsupported.<locals>.foor‡   ©r.   )zNo implementation of functionz3add(MyArray(1, float32, C), MyArray(1, float32, C)))	r   r+   r‰   Zfloat32ÚassertRaisesr   ZassertInÚstrÚ	exception)r2   r†   r_   ZraisesÚmsgÚmr   r   r   Útest_myarray_ufunc_unsupported,  s    
z4TestNdarraySubclasses.test_myarray_ufunc_unsupportedc           
      C   s”   t dd„ ƒ}tjdtjd�}t|j|j|ƒ}| |¡}||ƒ}|  ||¡ t	}t
j}t|jƒ}| |¡}	|  |d|d j|	fd|d j|	fg¡ dS )	z:
        Checks that our custom allocator is used
        c                 S   s&   | t j| jt jd� }| d }||fS )Nrš   y              ð?)r+   r‰   r}   Úfloat64)r…   ÚbrS   r   r   r   r†   @  s    zBTestNdarraySubclasses.test_myarray_allocator_override.<locals>.foor‡   rš   rp   r   rƒ   N)r   r+   r‰   r¡   r'   r-   r.   rŠ   r�   r   r   Ztarget_contextr   Zget_preferred_array_alignmentÚassertEqualÚnbytes)
r2   r†   r_   r…   r�   r�   Zlogged_linesZ	targetctxZnb_dtypert   r   r   r   Útest_myarray_allocator_override;  s    



þz5TestNdarraySubclasses.test_myarray_allocator_overrideN)r:   r;   r<   r‘   r’   r”   r˜   ÚunittestZexpectedFailurer™   r    r&   r¥   r   r   r   r   r‚   é   s   

r‚   Ú__main__)?Ú__doc__r{   r¦   Únumbersr   Ú	functoolsr   Únumpyr+   Zllvmliter   Znumbar   r   r   Z
numba.corer	   r
   r   Znumba.core.pythonapir   Znumba.core.errorsr   Znumba.core.registryr   Znumba.extendingr   r   r   r   r   r   r   Znumba.npr   Znumba.tests.supportr   r   r   r    r!   r&   r,   r'   rK   r=   ÚregisterrT   r%   Z	datamodelÚmodelsZStructModelrU   rc   r\   ZDTyperl   ro   rv   rq   r‚   r:   Úmainr   r   r   r   Ú<module>   sN   $
	#









!p
