o
    ۾iM                     @   s   d dl Z d dlZd dlZd dl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mZ dd Zdd	 Zd
d Zdd ZG dd deeZG dd deeZedkrZe  dS dS )    N)jittypeofnjit)types)TypingError)MemoryLeakMixinTestCasec                 C      | | S N )abr   r   S/home/ubuntu/.local/lib/python3.10/site-packages/numba/tests/test_fancy_indexing.pygetitem_usecase   s   r   c                 C      || |< d S r
   r   )r   idxr   r   r   r   setitem_usecase      r   c                 C   s   t | |S r
   nptake)Aindicesr   r   r   np_take   r   r   c                 C   s   t j| ||dS )Naxisr   )r   r   r   r   r   r   np_take_kws   s   r   c                   @   s   e Zd Zd'ddZd'ddZd'ddZd'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 d! Zd"d# Zd$d% Zd&S )(TestFancyIndexingTc                 C   sD   t d|d dgg}|r |t dd|d gt g dg7 }|S )Nr      )r   r   r   r   )r   int16uint16bool_)selfNmanychoicesr   r   r   generate_advanced_indices   s   z+TestFancyIndexing.generate_advanced_indicesc              	   c   s    |r,t dddt d|d dt dddt |d ddt | d ddt d| dg}nt d|d dt d| dg}t|d D ]}tj||dD ]}|V  qJqAdS )zG
        Generate basic index tuples with 0 to *maxdim* items.
        Nr   r      r   )repeat)slicerange	itertoolsproduct)r#   r$   maxdimr%   r&   ndimtupr   r   r   generate_basic_index_tuples"   s"   

z-TestFancyIndexing.generate_basic_index_tuplesc                 c   sl    t | j||d}t|d D ]#}| ||d |D ]}|D ]}|d| |f ||d  V  qqqdS )z
        Generate advanced index tuples by generating basic index tuples
        and adding a single advanced index item.
        r%   r   N)listr'   r,   r2   )r#   r$   r/   r%   r&   ir1   advr   r   r   generate_advanced_index_tuples9   s   "z0TestFancyIndexing.generate_advanced_index_tuplesc                 c   sP    |  |||D ]}tt|d D ]}|d| tf ||d  V  qqdS )zr
        Same as generate_advanced_index_tuples(), but also insert an
        ellipsis at various points.
        r   N)r7   r,   lenEllipsis)r#   r$   r/   r%   r1   r5   r   r   r   ,generate_advanced_index_tuples_with_ellipsisF   s   "z>TestFancyIndexing.generate_advanced_index_tuples_with_ellipsisc           
      C   s   t }tdd|}| }|jp|}|D ]9}|||}|j|us"J |||}	| |	j|j | |	j|j tj	|	| |	j
rM|	d tj	|| qd S )NTnopython*   )r   r   copybaseassertEqualshapedtyper   testingassert_equalsizefill)
r#   arrr   pyfunccfuncorig	orig_baseindexexpectedgotr   r   r   check_getitem_indicesO   s    



z'TestFancyIndexing.check_getitem_indicesc                 C   F   d}d}t || |f| t j}| ||}| || d S N      )r   arangereshapeastypeint32r7   rO   r#   r$   r0   rG   r   r   r   r   test_getitem_tuplee   s
   "z$TestFancyIndexing.test_getitem_tuplec                 C   J   d}d}t || |f| t j}| j||dd}| || d S NrR   rS   Fr3   )r   rT   rU   rV   rW   r:   rO   rX   r   r   r   test_getitem_tuple_and_ellipsisn      "z1TestFancyIndexing.test_getitem_tuple_and_ellipsisc                 C   s>   t dddd }td}||d | |d |d  d S )NTr;   c                 S   s   | d | d< d S )N).r   ).r   r   )rG   vr   r   r   fooz   s   z7TestFancyIndexing.test_ellipsis_getsetitem.<locals>.foor(   r   r   )r   r   rT   r@   )r#   r_   rG   r   r   r   test_ellipsis_getsetitemx   s
   


z*TestFancyIndexing.test_ellipsis_getsetitemc                 C   sD   d}d}t || |f| t j}| |}| || d S rQ   )r   rT   rU   rV   rW   r'   rO   rX   r   r   r   test_getitem_array   s
   "
z$TestFancyIndexing.test_getitem_arrayc           	      C   s   t }tdd|}|D ]3}|| }t|}t|}|||| |||| | |j|j | |j|j tj|| qd S )NTr;   )	r   r   r   
zeros_liker@   rA   rB   rC   rD   )	r#   rG   r   rH   rI   rL   srcrM   rN   r   r   r   check_setitem_indices   s   

z'TestFancyIndexing.check_setitem_indicesc                 C   rP   rQ   )r   rT   rU   rV   rW   r7   rd   rX   r   r   r   test_setitem_tuple   s
   "z$TestFancyIndexing.test_setitem_tuplec                 C   rZ   r[   )r   rT   rU   rV   rW   r:   rd   rX   r   r   r   test_setitem_tuple_and_ellipsis   r]   z1TestFancyIndexing.test_setitem_tuple_and_ellipsisc                 C   sH   d}d}t || |f| t jd }| |}| || d S )NrR   rS   
   )r   rT   rU   rV   rW   r'   rd   rX   r   r   r   test_setitem_array   s
   &
z$TestFancyIndexing.test_setitem_arrayc                 C   s  t }tdd|}tdtdftdtdftjdtjdtjdtjdftjdtjdtjdtjdftjdd	dtd
ftjdd	dtdftjg dd	dtjdddftjdtdtjdtdfg}|D ]\}}| }||d| ||d| | 	|| qod S )NTr;   rS   gQ	@r(   rB   r      z<U3abc)rS   r   )rk   defghiWXYZz<U4y       @      @r   )
r   r   r   zerosarrayint64float64complexr>   assertPreciseEqual)r#   rH   rI   inpsx1r^   x2r   r   r   test_setitem_0d   s&   z!TestFancyIndexing.test_setitem_0dc              	      s  t tdd  fdd}g }|d |tg d |tdgdggdgdggg |g d |d	 |d
 tjtjfD ]}tjd|dd}|D ]}||| qYqKg d}tg d}||| |j	}|| d t|t| d |g| d gg}	|	D ]}

t  ||
 W d    n1 sw   Y  q
t  |dg W d    n1 sw   Y    d S )NTr;   c                    sD   | |} | |} || t|dr |j|jk d S d S )Norder)rt   hasattrr@   ry   )rG   indrM   rN   rI   rH   r#   r   r   check   s   


z-TestFancyIndexing.test_np_take.<locals>.checkr   )r   rj   r      rS   rj   r~   r   rj   r   )r   )r~   rS   r(      ri   )rR   rS   )r   r(   rR   )r   r(   rS   rR   rj   g333333?)r   r   appendr   rp   rq   
complex128rT   rU   rE   assertRaises
IndexErrorr   disable_leak_check)r#   r}   test_indicesdtr   r{   r   r   szAillegal_indicesxr   r|   r   test_np_take   s>   
$


 zTestFancyIndexing.test_np_takec              	   C   s  t }tdd|}tdg d}|tg dg dg dgftg dtg d	td
gdddfdd|tdtdgfd
dtd
gfdd|tdfdddf}|D ])\}}}|D ]!}|D ]}	|D ]}
tj	||	|
d}|||	|
d}| 
|| qkqgqcq\d S )NTr;   inputs)arraysr   r   )r   r(   rS   )rR   rj      )      	   )r   r(   r   )r   r(   r   r(   r   r   r   )r   )r   r   )r   r   r)   rj   {   )rg   r   r~   r   r   r      )r   rS   rj   r   )r   r   collections
namedtupler   rp   rT   asarrayonesr   rt   )r#   rH   rI   nttriplesr   r   r   rp   indiceaxrM   rN   r   r   r   test_np_take_axis   sV   


&z#TestFancyIndexing.test_np_take_axisc                 C   sx   t ddt}tddd}d}tg d}| t| |||dd W d    n1 s1w   Y  |   d S )	NTr;   r   rS   z0axis 2 is out of bounds for array of dimension 2)r   r   r(   r(   r   )	r   r   r   rT   rU   rp   assertRaisesRegex
ValueErrorr   )r#   rI   rG   msgr   r   r   r   test_np_take_axis_exception4  s   z-TestFancyIndexing.test_np_take_axis_exceptionc                 C   s  t dd }t dd }tdd}td tjftjtd ftdtjtg dftjtg dtd ftdttjtg dftg dtjtftjtdtjtg dftg dtd tjftjtdttjtg dftg dtjtjtftjtg dtjtftd	tg dtjd ftjtg dtd fg}|j}|}|j}|}|D ]3}	|||	}
|||	}tj	
|
| t|}||	 }|| |	|}
|| |	|}tj	
|
| qd S )
Nc                 S   r	   r
   r   )r   r   r   r   r   np_new_axis_getitem?     z;TestFancyIndexing.test_newaxis.<locals>.np_new_axis_getitemc                 S   s   || |< | S r
   r   )r   r   itemr   r   r   np_new_axis_setitemC  s   z;TestFancyIndexing.test_newaxis.<locals>.np_new_axis_setitemiH  )rR   rj   r   r   r   )r   r(   r   rS   )r   r   rT   rU   r+   newaxisrp   r9   py_funcrC   rD   rb   r>   )r#   r   r   r   	idx_casespyfunc_getitemcfunc_getitempyfunc_setitemcfunc_setitemr   rM   rN   a_emptyr   r   r   r   test_newaxis>  sB   




zTestFancyIndexing.test_newaxisN)T)__name__
__module____qualname__r'   r2   r7   r:   rO   rY   r\   r`   ra   rd   re   rf   rh   rx   r   r   r   r   r   r   r   r   r      s&    



		


45
r   c                       s  e Zd ZdZedddeg ddfdeg dededfedeg dfeg ddefedeg ddeddfeg ddeeddfedddeg ddfdeg d	ededfgZ fd
dZ	dd Z
dd Zdd Zdd Zdd Zdd Z  ZS )TestFancyIndexingMultiDim)rj   r   r   r   r   rg   rR   rj   rS   )r   r   rS   rR   r(   r   N)TFTFTFF)TFTFTFc                    s   t    tjd| _d S )Nr   )supersetUpr   randomdefault_rngrng)r#   	__class__r   r   r     s   
zTestFancyIndexingMultiDim.setUpc                 C   s  t | j}td d d td|d d tdd dt|d d dt| d dd td| dtd|d d td| dg}tt|}g }d}t|D ]&}| jjdddd	}| jj	|d
d	
 }| j	d
}	|||	< |t| qIt|D ]&}| jjdddd	}| jj	|d
d	
 }| j	d
}	|||	< |t| qtt|D ]1}| jjdddd	}| jj	|d
d	
 }| jj	d
ddd}	|||	d < t||	d < |t| qt|D ]6}| jjdddd	}| jj	|d
d	
 }| j	d
}	| j|	 }
tj| jj	d|
d	td||	< |t| q|S )Nr   r   r(   r   r)      rj      rE   rR   F)rE   replaceri   )minrA   r+   r4   r   rT   r,   r   integerschoicetolistr   tupler9   rp   bool)r#   r$   slice_choicesinteger_choicesr   K_	array_idxcurr_idx
_array_idxbool_arr_shaper   r   r   generate_random_indices  sV   


	

z1TestFancyIndexingMultiDim.generate_random_indicesc           	      C   s   t dd }tjjdd|d}|j}|jp|}|||}|||}| |j| | |j|j | |j	|j	 tj
|| | t|| d S )Nc                 S   r	   r
   r   )rp   r   r   r   r   numba_get_item  r   zGTestFancyIndexingMultiDim.check_getitem_indices.<locals>.numba_get_itemr   r~   r   )r   r   r   randintr   r?   assertIsNotr@   rA   rB   rC   rD   assertFalsemay_share_memory)	r#   	arr_shaperL   r   rG   get_itemrK   rM   rN   r   r   r   rO     s   



z/TestFancyIndexingMultiDim.check_getitem_indicesc                 C   s   t dd }tjjdd|d}|| }t|}t|}|||| |||| | |j|j | |j|j tj	
|| d S )Nc                 S   r   r
   r   )rp   r   r   r   r   r   set_item  s   zATestFancyIndexingMultiDim.check_setitem_indices.<locals>.set_itemr   r~   r   )r   r   r   r   rb   r   r@   rA   rB   rC   rD   )r#   r   rL   r   rG   rc   rM   rN   r   r   r   rd     s   


z/TestFancyIndexingMultiDim.check_setitem_indicesc              	   C   ^   | j  }||  7 }|D ]}| j|d | | j| W d    n1 s'w   Y  qd S N)r   )indexing_casesr>   r   subTestrO   rA   r#   r   r   r   r   r   test_getitem     
z&TestFancyIndexingMultiDim.test_getitemc              	   C   r   r   )r   r>   r   r   rd   rA   r   r   r   r   test_setitem  r   z&TestFancyIndexingMultiDim.test_setitemc              	   C   s   dddt ddgddggffdddt ddgt ddgffddt ddgtd ddffg}|D ])\}}| t}| | j| W d    n1 sNw   Y  | |t|j	 q3d S )	Nz,Multi-dimensional indices are not supported.r   rS   r   r(   z:Using more than one non-scalar array index is unsupported.zUsing more than one indexing subspace is unsupported. An indexing subspace is a group of one or more consecutive indices comprising integer or array types.rR   )
r   rp   r+   r   r   rO   rA   assertInstr	exception)r#   err_idx_caseserrr   raisesr   r   r   %test_unsupported_condition_exceptions	  s&   z?TestFancyIndexingMultiDim.test_unsupported_condition_exceptions)r   r   r   rA   r+   r   rp   r9   r   r   r   rO   rd   r   r   r   __classcell__r   r   r   r   r   k  s.    
@r   __main__)r   r-   numpyr   unittestnumbar   r   r   
numba.corer   numba.core.errorsr   numba.tests.supportr   r   r   r   r   r   r   r   r   mainr   r   r   r   <module>   s(      T 8