o
    !j:v                     @   s   d dl Z d dlZd dlZddlmZm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 Z	d"ddZdd Zdd Zdd Zdd Zd d! ZdS )#    N   )coreunique_namei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OpResultnpndarray).0eler    [/var/www/html/Deteccion_Ine/venv/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_noneL   s   r)   c                 C   s   ddl m} t| tu rdS t| |r@tdd r/t| jdkr/| jd dkr/t	
d dS t| jdkr>| jtjkr>dS dS t| tjjrXt| jdkrX| jtjjjkrXdS dS )Nr   r   TZFLAGS_set_to_1dr   z1-D Tensor will be treat as advanced indexing in future version. Currently, 1-D Tensor means a scalar, not vector, and please modify it to 0-D Tensor. If advanced indexing is needed, please use `export FLAGS_set_to_1d=False` to set the flag.F)r   r   typeintr   r	   Z	get_flagsr   r   warningswarndtypeboolr
   r   base	libpaddleBOOLr   r   r   r   r   is_integer_or_scalar_tensorW   s"   
r4   c                 C   sL   ddl m} t| |r| jtjkrdS t| tjjr$| jtjj	j
kr$dS dS )Nr   r   TF)r   r   r   r.   r	   r/   r
   r   r0   r1   r2   r3   r   r   r   is_bool_tensorn   s   r5   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_attrs{   s   

rA   c                 C   s   t |jt | jkrtdt | j dt |j dd}|j}|t |jk rT|| }|dkrI| j| dkrI|| j| krItd|| j| ||d7 }|t |jk 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   zxThe dimension of bool index doesn't match indexed array along dimension {}, the target dimension is {}, but received {}.r   )r   r   r   formatr	   nonzero	gather_nd)r   r   r(   Z
item_shapeZdim_lenZ
bool_2_idxr   r   r   get_value_for_bool_tensor   s.   $
rF   c                 C   s|   ddl m} t rJ dt||tfr5d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_writer6   r7   )xr(   arrayzEOnly support __setitem__ by Int/Variable in tensor_array, but gets {})r   r   r	   in_dynamic_moder   r+   Z(paddle.jit.dy2static.variable_trans_funcrG   Zpaddle.tensorrH   castNotImplementedErrorrC   r*   )r   r   valuer   rG   rH   r   r   r   _setitem_for_tensor_array   s    
rO   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 )an  
    Transpose origin Tensor and advanced indices to the front.

    Returns:
        transed_tensor (Tensor): transposed tensor, corresbonding with advanced indices
        transed_index (List): advanced indices transed 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 transed 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   $



r]   c              	   C   s^  ddl m} | r|  }nt| do| j tjjj	k}|r!g n	d gd t
| j }g }g }g }g }g }	d}
d}t|tsA|f}t|}t| |}t|\}}d}d}t|D ]\}}d\}}}t|r|st|tr| j| d ur| j| dkr|| j| krtd|||| j| f || |}d}|d	kr|d nt}|d7 }nAt|tr|| |t|gf||< d
}|d7 }n%t|tr|j}|j}|j}|d7 }|d7 }|d u r|d u r|d u rqX|d u rdn|}|d u r|dkrdnt}|d u r
|dkrtnd	}nt|ttfrJ|t|f||< || d jtjkr?t
|| j| kr?td t
|| j| |d
}|d7 }|d7 }nt|tj!j"r|jtjksb|jtj!j#j$kr|j%dkrn|| n|jd | j| krtd |jd | j| |||f||< d
}|d7 }|d7 }nPt|tj&j'r|jtj&jj(j$kr|j%dkr|| n|jd | j| krtd |jd | j| |||f||< d
}|d7 }|d7 }ntd ||d u s#|d u s#|d u s#|| || |	| ||d  t|tj!j"tj&j'fs|dkr!d
n|
}
qX|||	||||||
f	S )Nr   )in_pir_modedesc   Fr   )NNNz<slice_item %d at dim %d should be >= 0 and < x.shape[%d]: %dr   TzKThe shape of boolean index {} did not match indexed tensor {} along axis {}zdValid index accept int / bool / slice / ellipsis / list / Tuple / Ndarray / Tensor, but received {}.))r   r^   is_dense_tensor_array_typehasattrr_   r*   r   VarDescVarTypeLOD_TENSOR_ARRAYr   r   r   tupler%   r   r)   r&   r4   r+   r   r    rP   r/   r	   Z	to_tensorr   startstopstepr   r.   rC   r0   r   r1   r2   rS   r
   r   ZDataType)rI   rV   r^   Zis_tensor_arrayadvanced_indexdecrease_axesaxesstartsendsstepsuse_strided_slicehas_advanced_indexr'   Zestimated_dimr@   r(   r$   rg   endri   r   r   r   parse_index  s  
















rs   c           "      C   st  ddl m} ddlm}m} | jtjjj	j
jkrt| ||S t| |\	}}}}	}
}}}}d| i}|	|||||
d}d}d}d}d}d}tj|rVtj|}||d< |d= tj|ritj|}||d	< |d
= tj|r|tj|}||d< |d= |sB| 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| | r|du rtj$%| ||||	||
||	S tj$&| |||||	||
S tjj'j(	di t) }|j*j+dkr|j,| jd}n|j-| jd}| . }|j/d|d|i|ddid tj0j1j23 j45|j6| j78 | |S t||tj!j"tj!j9fsXt:|| j}t;| |	|||||
|\}}t<||d||\}}}} } }}|j|jkr||j}t= rt>|dkr|d jtjtjj?j@fv rt>|d jt>|jkr|j|jkr|A|j}tj$BtC|d ||}|s| S n|D||}|s| S n|E||}|F|}!|!|d< | r| G  | }n"tjj'j(	di t) }|j*j+dkr	|j,| jd}n|j-| jd}| . }|j/d|d|i|ddid | s8tj0j1j23 j45|j6| j78 | |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   default_main_programInput)rl   rm   rn   ro   rk   r'   NStartsTensorListrm   EndsTensorListrn   StepsTensorListro   r.   )convert_dtyperW   r   ZValueTensorzjOnly support to assign an integer, float, numpy.ndarray or paddle.Tensor to a paddle.Tensor, but received 	set_valuer   r7   Out)r*   r>   outputsr;   Zinplace_mapT)r{   )H rt   r   r   ru   r*   r	   r0   r   rc   rd   re   rO   rs   r8   r9   r:   r.   Zdata_feederrz   r   r/   r+   floatcomplexr   rJ   Zastyper   r   r   ZravelrT   r
   Value	TypeError_C_opsZ
set_value_Zset_value_with_tensor_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addprogramr_   idr   r!   get_tensor_with_basic_indexingr]   rK   r   r1   r2   expandZwhere_Zlogical_notZ
index_put_Z	index_putrU   Z_bump_inplace_version)"rI   rV   rW   rt   r   ru   rm   rn   ro   rl   r'   rk   rj   rq   rp   r>   r;   Zvalue_tensorrw   rx   ry   r   r.   rz   helperoutputZ	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              	      s  ddl m} d}	| rt| drd| _t|dkr| }
nd}	|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} | rd|	 v rs|d }n|d }d|	 v r|d }n|d }d|	 v r|d }n|d }|rt
j| ||||}
t|dkrt
j|
|}
no| rt|ttfrt
j|rt
j|}t|ttfrt
j|rt
j|}|  rt
j| |dfS t
j| ||||d |d }
n)ddlm} |  }|jt| jd | | jd}|j ||d|gi|d |}
t|dkrKd}	t!|D ]\} t fdd|D } | }|||< q+t
j"|
|d}
| rXt|
drXd|
_|
|	fS )Nr   )in_to_static_modeFis_view_varTr   strided_slicer   rv   )rl   rm   rn   decrease_axisstridesrm   rw   rn   rx   ZStridesTensorListr?   )rt   r^   r   )ru   r   )namer.   r|   )r*   r>   r}   r;   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   rb   r   r   rA   r~   rt   r^   keysr	   r   r   Zsqueezer   r   rf   r8   r9   Zget_int_tensor_listra   Z_pir_opsZslice_array_denser   r   ru   r   Z
create_varr   Zgenerate_with_ignorable_keyr   r.   r   r&   	unsqueeze)rI   rl   rm   rn   ro   rk   r'   rp   r   rX   outZop_typer>   r;   r?   rt   r^   strr   Zstrideru   Z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   )rs   r   r]   r   r.   r	   r/   r0   r1   r2   rF    parse_bool_and_broadcast_indicesstackr   rE   r   r"   rS   rU   )rI   rV   rm   rn   ro   rl   r'   rk   rj   rq   rp   r   r   r\   r   rY   rZ   Zadvanced_index_tensorpermr   r   r   _getitem_static  sr   	
r   c                 C   sR   t | D ]\}}|jtjkrt|d d df | |< qt| dkr't| } | S )Nr   r   )r&   r.   r	   r/   rD   r   Zbroadcast_tensors)rV   r(   r[   r   r   r   r   \  s   
r   )T)r,   numpyr   r	   r~   r   r   rP   r   r%   r)   r4   r5   rA   rF   rO   r]   rs   r   r   r   r   r   r   r   r   <module>   s,   %
D - skM