o
    * i                     @   s   d dl Zd dlZddlmZmZ dZ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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 )&    N   )coreunique_nameii   c                    s   ddl m  t|} fdd|D }|t}|dkr|S |dkr&td|t}|t|d kr9|d d S td gt| j	t| |d  d  |||d < |S )Nr   Variablec                    s.   g | ]}t | tjjtjfs|d ur|qS N)
isinstancepaddlepirValuenpndarray).0eler    f/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/paddle/base/variable_index.py
<listcomp>'   s    z$replace_ellipsis.<locals>.<listcomp>r   z0An index can only have a single ellipsis ('...'))
	frameworkr   listcountEllipsis
IndexErrorindexlensliceshape)varitemZitem_remove_varZ	ell_countZell_idxr   r   r   replace_ellipsis   s"   	


r   c                 C   sT   g }| D ]#}t |tjr|t| qt |tr"|t| q|| q|S r   )r   r   r   appendr	   assignranger   )r   new_item
slice_itemr   r   r   replace_ndarray_and_range?   s   
r%   c                 C   s@   g }g }t | D ]\}}|d u r|| q|| q||fS r   )	enumerater    )r   r#   	none_axesir$   r   r   r   replace_noneK   s   r)   c                 C   sl   ddl m} t| |rt| jdkr| jtjkrdS dS t| tjj	r4t| jdkr4| jtj
jjkr4dS dS )Nr   r   r   TF)r   r   r   r   r   dtyper	   boolr
   r   base	libpaddleBOOL)r   r   r   r   r   is_scalar_tensorV   s   
r/   c           	      C   s   ddl m} tj|r=tjj|dd||< t|D ] \}}t||tjj	fr3| | 
d d||< q| | 
| qd S || |< d S )Nr   r   int64r*   r   )r   r   r	   utils_contain_var_convert_to_tensor_listr&   r   r
   r   r    )	attrsattr	attr_nameZtensor_attr_nameinputsinfer_flagsr   r(   dimr   r   r   
deal_attrsb   s   

r;   c                 C   s   t |jt | jkrtdt | j dt |j dd}|j}|t |jk rY|| }|dkrN| j| dkrN|| j| krNtd| d| j|  d| d|d7 }|t |jk s't |jt | jkrit| |S t|}t| |S )	NzkThe dims of bool index doesn't match indexed array, the dims of bool index except to be equal or less than z, but received .r   r   zHThe dimension of bool index doesn't match indexed array along dimension z, the target dimension is r   )r   r   r   r	   Zmasked_selectnonzero	gather_nd)r   r   r(   Z
item_shapeZdim_lenZ
bool_2_idxr   r   r   get_value_for_bool_tensors   s8   $
r?   c                 C   s   ddl m} t rJ dt||tjjtfr8ddlm	} ddl
m} tj||dd}||}|||| d	S td
t| )a  branches for tensor array setitem operation.
    A item can be a:
    (1) int/Variable, which is a simple number/variable such as [1], [-2]
    (2) Slice, which is represented by bounds such as [2:-1]
    (3) Tuple, which includes the above two cases such as [2:-1, 1]
    If item is case (1), we perform paddle.tensor.array_write,
    in other cases, we raise a NotImplementedError.
    r   r   z=setitem for tensor_array must be called in static graph mode.r   )to_static_variable)array_writer0   r1   )xr(   arrayzCOnly support __setitem__ by Int/Variable in tensor_array, but gets )r   r   r	   in_dynamic_moder   r
   r   intZ&paddle.jit.dy2static.convert_operatorsr@   Zpaddle.tensorrA   castNotImplementedErrortype)r   r   valuer   r@   rA   r   r   r   _setitem_for_tensor_array   s   

rJ   Tc                 C   s8  g }g }t }d}t|D ]<\}	}
|
durH|	dkrd}|	dkr/t|dkr/|d |	d kr/d}nt||	}t||
d j}||	 ||
d  qt| jD ]}	||	 du r[||	 qN|ret	|
 ng }d}|tt| jkry| }|rx|}nd}| |}|r|jdkr|dkr||}n|}|||||||fS )at  
    Transpose origin Tensor and advanced indices to the front.

    Returns:
        transed_tensor (Tensor): transposed tensor, corresponding with advanced indices
        transed_index (List): advanced indices transposed to the front
        trans_back_dim (List): order of axes to transpose back to original order. Only used in __setitem__.
        pos_of_new_dim (int):  axis of new dim in the result. Only used in __getitem__.
        rank_of_new_dim (int): rank of new dim in the result. Only used in __getitem__.
        transed_value_tensor (Tensor): value tensor transposed to the front. Only used in __setitem__.
    r   Nr   r   T)MAX_INTEGERr&   r   minmaxndimr    r"   r   Zargsorttolistr   	transpose)Z
ori_tensorindicesZis_for_setitemvaluesout_is_viewZtransed_dimZtransed_indexpos_of_new_dimrank_of_new_dimr(   indiceZtrans_back_dimZtransed_value_tensortransed_tensorr   r   r   deal_advanced_index   sP   $



rX   c                 C   s   | d u r|d u r|d u rdS t | tjjtjjfrdS t |tjjtjjfr(dS t |tjjtjjfr5dS | dko@|tko@|dkS )NTFr   r   )r   r	   r,   r   r
   r   rK   )startendstepr   r   r   slice_is_same_to_original   s   r\   c                 C   s8   ddl m} | r|  S t| do| j tjjj	kS )Nr   )in_pir_modedesc)
r   r]   is_dense_tensor_array_typehasattrr^   rH   r   ZVarDescZVarTypeZDENSE_TENSOR_ARRAY)rI   r]   r   r   r   is_tensor_array_type   s   
ra   c                 C   s  t | }|rg n	d gd t| j }g }g }g }g }g }d}	d}
t|ts(|f}t|}t| |}t|\}}d}d}t|D ](\}}d\}}}t	|t
u r|sy| j| d ury| j| dkry|| j| krytd| d| d| d| j|  || |}d	}|d
kr|d	 nt}|d	7 }nt|r|| |}d	}|d	 }|d	7 }nt|tr|| |t|gf||< d}
|d	7 }nqt|trK|j}|j}|j}|d u r|d u r|d u r|d	7 }|d	7 }q?|d u rd	n|}|d u r|dkrdnt}|d u r|dkr	tnt}|sBt|tjjtjjfsBt|tjjtjjfsB| j| d
krB|| j| krB|dkr=tn| j| }|d	7 }|d	7 }nt|ttfr|t|f||< || d	 jtjkrt|| j| krtdt| d| j|  d| d}
|d	7 }|d	7 }nt|tjjr|jtjks|jtjjjkr|jdkr|| n|jd | j| krtd|jd  d| j|  d| ||f||< d}
|d	7 }|d	7 }nUt|tjjr.|jtjj j!jkr|jdkr|| n|jd | j| krtd|jd  d| j|  d| ||f||< d}
|d	7 }|d	7 }ntd| dt"|||sh|| || || ||d	  t|tjjtjjfsd|d	krfdn|	}	q?||||||||
|	f	S )N   Fr   )NNNzslice_item z at dim z should be >= 0 and < x.shape[z]: r   r   TzThe shape of boolean index z did not match indexed tensor z along axis zaValid index accept int / bool / slice / ellipsis / list / Tuple / Ndarray / Tensor, but received r<   )#ra   r   r   r   tupler%   r   r)   r&   rH   rE   r   r    rK   r/   r+   r	   Z	to_tensorr   rY   stopr[   MIN_INTEGERr,   r   r
   r   r   r*   r-   r.   rN   r   ZDataTyper\   )rB   rQ   is_tensor_arrayadvanced_indexdecrease_axesaxesstartsendsstepsuse_strided_slicehas_advanced_indexr'   Zestimated_dimr:   r(   r$   rY   rZ   r[   r   r   r   parse_index  s  


 





 

 
 





	ro   c           $      C   s  ddl m} ddlm}m} t| }|rt| ||S t| |\	}}}	}
}}}}}d| i}|
|||	||d}d}d}d}d}d}tj	
|rRtj	|}||d< |d= tj	
|retj	|}||d	< |d
= tj	
|	rxtj	|	}||d< |d= |s| j}||d< ddlm} t|ttttfrt|g||}t|tjrt|j}|  }||d< ||d< nt||tjjfr||}||d< |}n	tdt| | rP| rt|tt frtj	
|rtj	!|}t|tt frtj	
|rtj	!|}t|	tt frtj	
|	rtj	!|	}	|du r-tj"#| |||	|
||||	}ntj"$| ||||	|
||}| rNddl%m&} |'tj() | | |S tj*j+j,	di t- }|j.j/dkrk|j0| jd}n|j1| jd}tj() 2 }|j3d|d|i|ddid tj4j5j67 j8'|j9| j:; | |S t||tjjfst<|| j}t=| |
|||	|||\}}t>||d||\}} }!}"}"}}|j|jkr||j}t? r)t@| dkr| d jtjtj*jAjBfv rt@| d jt@|jkr|j|jkr
|C|j}tj"DtE| d ||}|s| S n|F| |}|s(| S n|G| |}|H|!}#|#|d< | r| rt|tt frUtj	
|rUtj	!|}t|tt frjtj	
|rjtj	!|}t|	tt frtj	
|	rtj	!|	}tj"$| |#|||	|
||}ddl%m&} |'tj() | | |S tj*j+j,	di t- }|j.j/dkr|j0| jd}n|j1| jd}tj() 2 }|j3d|d|i|ddid tj4j5j67 j8'|j9| j:; | |S )a  
    In dynamic mode, this function will modify the value at input tensor, returning same Tensor as input.
    But it will return a new Tensor with assigned value in static mode.

    Args:
        x(Tensor): Tensor to be set value.
        indices(int|slice|None|Tensor|List|Tuple...): Indices, used to indicate the position of the element to be fetched.
        values(Tensor|Number|Ndarray): values to be assigned to the x.
    r   )in_dynamic_or_pir_mode)r   r]   Input)ri   rj   rk   rl   rh   r'   NStartsTensorListrj   EndsTensorListrk   StepsTensorListrl   r*   )convert_dtyperR   r   ZValueTensorzjOnly support to assign an integer, float, numpy.ndarray or paddle.Tensor to a paddle.Tensor, but received r   )_global_inplace_map	set_valuer1   Out)rH   r8   outputsr5   Zinplace_mapT)rw   )I rp   r   r   r]   ra   rJ   ro   r	   r2   r3   r4   r*   Zdata_feederru   r   r+   rE   floatcomplexr   rC   Zastyper   r   r   ZravelrO   r
   r   	TypeErrorrH   rc   get_int_tensor_list_C_opsZ
set_value_Zset_value_with_tensor_Z+paddle.jit.pir_dy2static.parameter_recorderrv   addstaticdefault_main_programr,   Zlayer_helperZLayerHelperlocalsZmain_programZcurrent_block_idxZ*_create_global_variable_for_type_inferenceZ"create_variable_for_type_inferencecurrent_block	append_opZjitapiZProgramTranslatorZget_instanceZ_inplace_mapprogramr^   idr!   get_tensor_with_basic_indexingrX   rD   r   r-   r.   expandZwhere_Zlogical_notZ
index_put_Z	index_putrP   )$rB   rQ   rR   rp   r   r]   rf   rj   rk   rl   ri   r'   rh   rg   rn   rm   r8   r5   Zvalue_tensorrr   rs   rt   r   r*   ru   outputrv   helperZ	cur_blockZ
sub_tensorZis_viewZtransed_sub_tensoradjusted_advanced_indexZtransback_dim_Ztransback_sub_tensorr   r   r   _setitem_static  s  
	




	



	r   c              	      sX  ddl m} d}	| rt| drd| _t|dkr| }
nQd}	|r#dnd}d	| gi}|g g |d
}|r7g |d< dgt| }t||dd|| t||dd|| t||dd|| ||d< ddlm}m} | rId|	 v rt|d }n|d }d|	 v r|d }n|d }d|	 v r|d }n|d }|r| rt
|ttfrtj|rtj|}t
|ttfrtj|rtj|}t
|ttfrtj|rtj|}tj| ||||}
t|dkrtj|
|}
n| r9t
|ttfrtj|rtj|}t
|ttfrtj|rtj|}|  r9t|dkr/tj| |dfS tj| ||dfS tj| ||||d |d }
n%tj  }|jt| jd | | j d}|j!||d|gi|d |}
t|dkrd}	t"|D ]\} t fdd|D } | }|||< q{tj#|
|d}
| rt|
drd|
_|
|	fS )Nr   )in_to_static_modeFis_view_varTr   strided_slicer   rq   )ri   rj   rk   decrease_axisstridesrj   rr   rk   rs   ZStridesTensorListr9   )rp   r]   r   r   )namer*   rx   )rH   r8   ry   r5   c                    s   g | ]}| k r|qS r   r   )r   r(   Zaxisr   r   r   ?  s    z2get_tensor_with_basic_indexing.<locals>.<listcomp>r   )$Zdygraph.baser   r`   r   r   r;   rz   rp   r]   keysr   r   rc   r	   r2   r3   r~   r   r   Zsqueezer_   Z_pir_opsZslice_array_denseZslice_arrayr   r   r   r   Z
create_varr   Zgenerate_with_ignorable_keyr   r*   r   r&   	unsqueeze)rB   ri   rj   rk   rl   rh   r'   rm   r   rS   outZop_typer8   r5   r9   rp   r]   strZ   ZstrideZtarget_blockZslice_out_varidxlZnew_axisr   r   r   r     s   




	r   c              	   C   s  t | |\	}}}}}}}}	}
t| |||||||
\}}|	rt||dd\}}}}}}}t|dkrF|d jtjtjjj	fv rFt
||d }nt|}t|dkrXtj|dd}n|d d}t||}|dkrtt||| ttd| tt|| |j }||}|S )z
    Args:
        x(Tensor): Tensor to be indexing.
        indices(int|slice|None|Tensor|List|Tuple...): Indices, used to indicate the position of the element to be fetched.
    FNr   r   r   r   )ro   r   rX   r   r*   r	   r+   r,   r-   r.   r?    parse_bool_and_broadcast_indicesstackr   r>   r   r"   rN   rP   )rB   rQ   rj   rk   rl   ri   r'   rh   rg   rn   rm   r   r   rW   r   rT   rU   Zadvanced_index_tensorpermr   r   r   _getitem_staticJ  sr   	
r   c                 C   sb   t | D ]\}}|jtjks|jtjjjkr#t|d d df | |< qt| dkr/t	| } | S )Nr   r   )
r&   r*   r	   r+   r,   r-   r.   r=   r   Zbroadcast_tensors)rQ   r(   rV   r   r   r   r     s   
r   )T)numpyr   r	   rz   r   r   rK   re   r   r%   r)   r/   r;   r?   rJ   rX   r\   ra   ro   r   r   r   r   r   r   r   r   <module>   s0   %
D +  !}M