o
    0 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   k/home/app/PaddleOCR-VL-test/.venv_paddleocr/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   Zint16Zuint16Z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)   r/   )r    r!   r,   r"   r#   ir.   Z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)r3   r)   lenEllipsis)r    r!   r,   r"   r.   r2   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Z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int32r3   rJ   r    r!   r-   rB   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 NrM   rN   Fr0   )r   rO   rP   rQ   rR   r6   rJ   rS   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 )NTr7   c                 S   s   | d | d< d S )N).r   ).r   r   )rB   vr   r   r   fooz   s   z7TestFancyIndexing.test_ellipsis_getsetitem.<locals>.foor%   r   r   )r   r   rO   r;   )r    rZ   rB   r   r   r   test_ellipsis_getsetitemx   s
   


z*TestFancyIndexing.test_ellipsis_getsetitemc                 C   sD   d}d}t || |f| t j}| |}| || d S rL   )r   rO   rP   rQ   rR   r$   rJ   rS   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 )NTr7   )	r   r   r   
zeros_liker;   r<   r=   r>   r?   )	r    rB   r   rC   rD   rG   srcrH   rI   r   r   r   check_setitem_indices   s   

z'TestFancyIndexing.check_setitem_indicesc                 C   rK   rL   )r   rO   rP   rQ   rR   r3   r_   rS   r   r   r   test_setitem_tuple   s
   "z$TestFancyIndexing.test_setitem_tuplec                 C   rU   rV   )r   rO   rP   rQ   rR   r6   r_   rS   r   r   r   test_setitem_tuple_and_ellipsis   rX   z1TestFancyIndexing.test_setitem_tuple_and_ellipsisc                 C   sH   d}d}t || |f| t jd }| |}| || d S )NrM   rN   
   )r   rO   rP   rQ   rR   r$   r_   rS   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 )NTr7   rN   gQ	@r%   r=   r      z<U3abc)rN   r   )rf   defZghiZWXYZz<U4y       @      @r   )
r   r   r   Zzerosarrayint64Zfloat64complexr9   assertPreciseEqual)r    rC   rD   Zinpsx1rY   Z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 )NTr7   c                    sD   | |} | |} || t|dr |j|jk d S d S )Norder)rk   hasattrr;   rn   )rB   indrH   rI   rD   rC   r    r   r   check   s   


z-TestFancyIndexing.test_np_take.<locals>.checkr   )r   re   r      rN   re   rs   r   re   r   )rt   )rs   rN   r%      rd   )rM   rN   )r   r%   rM   )r   r%   rN   rM   re   g333333?)r   r   appendr   rh   ri   Z
complex128rO   rP   r@   assertRaises
IndexErrorr   disable_leak_check)r    rr   Ztest_indicesdtr   rp   r   r   ZszAZillegal_indicesxr   rq   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 )NTr7   Zinputs)arraysr   r   )r   r%   rN   )rM   re      )      	   )r   r%   r   )r   r%   r   r%   r   r   r   )r   )r   r   )r   r   r&   re   {   )rb   r   rs   r   ru   r      )r   rN   re   r   )r   r   collections
namedtupler   rh   rO   ZasarrayZonesr   rk   )r    rC   rD   ntZtriplesr}   r   r   rh   ZindiceaxrH   rI   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 )	NTr7   r   rN   z0axis 2 is out of bounds for array of dimension 2)r   r   r%   r%   r   )	r   r   r   rO   rP   rh   assertRaisesRegex
ValueErrorry   )r    rD   rB   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  )rM   re   r~   r   r   )r   r%   r   rN   )r   r   rO   rP   r(   Znewaxisrh   r5   py_funcr>   r?   r]   r9   )r    r   r   r   Z	idx_casesZpyfunc_getitemZcfunc_getitemZpyfunc_setitemZcfunc_setitemr   rH   rI   Za_emptyr   r   r   r   test_newaxis>  sB   




zTestFancyIndexing.test_newaxisN)T)__name__
__module____qualname__r$   r/   r3   r6   rJ   rT   rW   r[   r\   r_   r`   ra   rc   rm   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)re   r~   r   r   r   rb   rM   re   rN   )r   r   rN   rM   r%   r   N)TFTFTFF)TFTFTFc                    s   t    tjd| _d S )Nr   )supersetUpr   randomZ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&      re      r@   rM   F)r@   replacerd   )minr<   r(   r1   r   rO   r)   r   Zintegerschoicetolistrv   tupler5   rh   bool)r    r!   Zslice_choicesZinteger_choicesr   K_Z	array_idxZcurr_idxZ
_array_idxZ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   )rh   r   r   r   r   numba_get_item  r   zGTestFancyIndexingMultiDim.check_getitem_indices.<locals>.numba_get_itemr   rs   r   )r   r   r   randintr   r:   ZassertIsNotr;   r<   r=   r>   r?   ZassertFalseZmay_share_memory)	r    	arr_shaperG   r   rB   Zget_itemrF   rH   rI   r   r   r   rJ     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   )rh   r   r   r   r   r   set_item  s   zATestFancyIndexingMultiDim.check_setitem_indices.<locals>.set_itemr   rs   r   )r   r   r   r   r]   r   r;   r<   r=   r>   r?   )r    r   rG   r   rB   r^   rH   rI   r   r   r   r_     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_casesr9   r   subTestrJ   r<   r    r   r   r   r   r   test_getitem     
z&TestFancyIndexingMultiDim.test_getitemc              	   C   r   r   )r   r9   r   r   r_   r<   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   rN   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.rM   )
r   rh   r(   rw   r   rJ   r<   ZassertInstr	exception)r    Zerr_idx_caseserrr   Zraisesr   r   r   %test_unsupported_condition_exceptions	  s&   z?TestFancyIndexingMultiDim.test_unsupported_condition_exceptions)r   r   r   r<   r(   r   rh   r5   r   r   r   rJ   r_   r   r   r   __classcell__r   r   r   r   r   k  s.    
@r   __main__)r   r*   numpyr   ZunittestZnumbar   r   r   Z
numba.corer   Znumba.core.errorsr   Znumba.tests.supportr   r   r   r   r   r   r   r   r   mainr   r   r   r   <module>   s(      T 8