o
    + im                     @   s  d dl Zd dlZd dlmZmZmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ d dlmZ ddl m!Z! ej"dddd	d
 Z#ej"ddddd Z$ej"ddddd Z%ej"ddddd Z&ej"ddddd Z'ej"dddej"ddddd Z(ej"dddej"ddddd Z)ej"d ddd!d" Z*ej"d#ddd$d% Z+ej"d&ddej"d'ddd(d) Z,ej"d*ddd+d, Z-ej"d-ddd.d/ Z.ej"d0ddd1d2 Z/ej"d3ddd4d5 Z0ej"d6ddd7d8 Z1ej"d9d:dd;d< Z2ej"d=ddd>d? Z3ej"d@dddAdB Z4ej"dCdddDdE Z5ej"dFdddGdH Z6ej"dIdddJdK Z7ej"dLdddMdN Z8dS )O    N)add_1D_constant_layerbuild_size_tensorbuild_start_tensorcast_tensorfix_negative_indicesgeneric_plugin_converterget_axes_for_reduce_opget_input_constant_valueget_shape_tensor_elementhas_dynamic_shaperesize_to_1dset_layer_nametrt_cast
trt_concat
trt_expandtrt_floor_div
trt_gathertrt_lesstrt_maxtrt_mintrt_prodtrt_reshape	trt_shapetrt_subtrt_sum)converter_registry   )get_trt_version_listzpd_op.reshapeztrt_version_ge=8.0)Ztrt_versionc           	      C   s   |d }d}t ||d}|d ur|}d}nt|d tr*t| |d | dgd}n|d }|s;t| || dgd}| |}|rF||_n|d| t	|| t
|djdks_J d|dS )Nr   F   Tshape_tensornamezWhen convert reshape op to TRT reshape layer, the rank of trt reshape output dims is less than 0, you should modify trt_config(a TensorRTConfig object) and set trt_config.disable_ops = ["pd_op.reshape"] to forbid this op.)r	   
isinstancelistr   r!   r   add_shufflereshape_dims	set_inputr   len
get_outputshape)	network	paddle_opinputsxZis_constant_shaper)   Zreshape_dimr   layer r/   n/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/paddle/tensorrt/impls/manipulation.pyreshape_converter2   s0   


r1   zpd_op.gatherz8.xc                 C   sj   |d }|d }t ||dd }t|}| |}d|_t|| | ||d|}t|| |dS )Nr   r   r   ))r	   intr$   r%   r   
add_gatherr(   )r*   r+   r,   input_tensorindex_tensor
axis_valueZreshape_layergather_layerr/   r/   r0   gather_converterW   s   



r9   zpd_op.gather_ndc                 C   s4   |\}}|  ||tjj}d|_t|| |dS )Nr   )add_gather_v2trt
GatherModeNDZnum_elementwise_dimsr   r(   )r*   r+   r,   r5   indices_tensorZnon_zero_layerr/   r/   r0   gather_nd_converterh   s   


r?   zpd_op.flattenc                 C   s`  |d }|  d  j}t|}| d}| d}| |}t|| t|s|dk r7||d 7 }|dk rA||d 7 }d}	g }
t	|D ]'\}}||krZ||krZ|	|9 }	qI||d krk|

|	 |

| qI|

| qI|t|jd kr|

|	 t|
|_t|| n| |}t|| g }|dkr| j|dd|fdd}t|| |
|d | j|d|f|| d fdd}t|| | j|dtjjtddd	d
}t|| |
|d |t|d k r| j|d|d ft|| d fdd}t|| |
|d | |}d|_t|| |d|d |dS )Nr   
start_axis	stop_axisr   )r   )r   )startr)   strideFTaxesZ	keep_dims)operandssourcer)   r'   attrsgetr$   r   r   	enumerateappendtupler%   	add_shape	add_slicer(   
add_reducer;   ReduceOperationPRODr   add_concatenationaxisr&   )r*   r+   r,   	input_valZinput_val_shapedimsr@   rA   Zflatten_layerZflatten_dimZfinal_shapeisZinput_shape_layerZfinal_shapesZprefix_shape_layerZflatten_shape_layerZsuffix_shape_layerZfinal_shape_layerr/   r/   r0   flatten_converters   s   














rX   zpd_op.concatc                 C   sh   |d }|d }| j |d}t||dd }t|}|dk r't|d j| }||_t|| |dS )Nr   r   )r,   )rR   r	   r3   r'   r)   rS   r   r(   )r*   r+   r,   input_tensorsaxis_tensorconcat_layerrS   r/   r/   r0   concat_converter   s   

r\   zpd_op.unsqueezezpd_op.unsqueeze_c                 C   s  |d }|j }t||d}t|dksJ dt| ddgt|t|  }t|}tt|D ]<}|d7 }|| dk rF||  |7  < t|d || dD ]
}	||	d  ||	< qP|| |krhd||d < q2d||| < q2g }
d}tt|D ]}|| r|
t| qy|
| |d7 }qyt| || dgd	}dgt| }t| || d
gd	}||g}t| t	| || dgd	|
| dgd	}| 
|}|d| t|| |dS )Nr   r   z[axes size should be > 0 in when convert unsqueeze op in TensorRT, but received len(axes) = .Fr2   Tr   r    all_one_tensorr   real_shape_tensor)r)   r	   r'   rangerK   r   r!   r   r   r   r$   r&   r   r(   )r*   r+   r,   r-   
input_dimsrE   Zshould_unsqueezeZcur_out_rankrV   jgather_indicesZ	in_rank_ir   Zall_oner^   Zconcat_inputsr_   r.   r/   r/   r0   unsqueeze_converter   sZ   





rd   zpd_op.squeezezpd_op.squeeze_c                 C   sx  |d }|j }t|}t|tjr!| ||}t|| |d}t||d}t|dkrJt	|D ]}|| dkr=t
d|| dkrH|| q1n |D ]}|dk rV||7 }|| dkrit
d| d||  dqLt|}	|	dkryt
d|	 d	g| }
|D ]}d
|
|< qdd t|
D }t| || dgd}t| ||| dgd}| |}|d| t|| |dS )Nr   r   r2   z@The necessary attributes of the squeeze operator axis is missingzCannot squeeze dimension z with size z.. Only dimensions with size 1 can be squeezed.zEaxis.size should be >0 in pd_op.squeeze op in TensorRT, but received FTc                 S   s   g | ]\}}|s|qS r/   r/   ).0rV   Zsqueezer/   r/   r0   
<listcomp>D  s
    z%squeeze_converter.<locals>.<listcomp>r   r    r_   )r)   r'   r"   r;   ZWeightsZadd_constantr   r(   r	   r`   RuntimeErrorrK   rJ   r   r!   r   r$   r&   )r*   r+   r,   rT   input_shapeinput_shape_sizerS   rV   aZ	axes_sizeZshould_squeezerc   r   r_   r.   r/   r/   r0   squeeze_converter  sd   


	





rk   zpd_op.expandc                 C   s   |d }|j }t|}| d  }t||d}|d ur-t| || dgd}t|}	n#|  rG|d }
t|
}	t	| |
| dgd}n	|d }|j d }	t
| ||||	| dgdS )Nr   r   r   r    r   )r)   r'   rF   rG   r	   r   r!   typeZas_vec_typer   r   )r*   r+   r,   inputra   rankZpaddle_shape_tensorr)   r   
shape_rankZshape_tensorsr/   r/   r0   expand_converterY  s4   


rp   zpd_op.expand_asc                 C   s   |d }|j }t|}| d  }| r,|d }t| || dgd}t|j }	n| d}
t	| |
| dgd}t|
}	t
| ||||	| dgdS )Nr   r   r   r    Ztarget_shaper   )r)   r'   rF   rG   Zinitializedr   r!   rH   rI   r   r   )r*   r+   r,   rm   ra   rn   yZy_tr   ro   r)   r/   r/   r0   expand_as_convertery  s.   
rr   z
pd_op.castzpd_op.cast_c                 C   s   |d }t | d}|dkrtj}n/|dkrtj}n'|dkr%tj}n|dkr-tj}n|dkr5tj}n|dkr=tj}ntd	| | 	|}|
d| ||d_t|| |dS )
Nr   dtyper      	   
         z0cast converter currently doesn't support dtype: )r3   rH   rI   r;   boolint32float32Zfloat16rg   Zadd_identityZset_output_typer(   rs   r   )r*   r+   r,   r5   Z	out_dtypeZ
cast_layerr/   r/   r0   cast_converter  s,   


r|   zpd_op.slicec                 C   s  |d }|  d }|  d}t| || dgd}t|j}g }g }	t|D ]%}
|t| d| d|
 gd |	t	| ||
| d|
 gd q)t
||d}|d urt|t|kspJ d	t| d
t| dtt|D ]u}|| dk rt| t| t| || | d| gdt	| ||| | d| gd| dgdt| d| dgd| d||  gd||| < qvt| t| || | d| gdt	| ||| | d| gd||| < qvn |d }tt|D ]}t	| ||| d| gd||| < qt
||d}|d urt|t|ks0J dt| d
t| dtt|D ]x}|| dk rt| t| t| || | d| gdt	| ||| | d| gd| dgdt| d| dgd| d||  gd|	|| < q6t| t| || | d| gdt	| ||| | d| gd|	|| < q6n!|d }tt|D ]}t	| ||| d| gd|	|| < q| |}d|_t|| |d}| |	}d|_t|| |d}t| ||| dgd}| |dg| dg| dg| }|d| |d| t|| |d}t|dkrpg }t|D ]}
|
|v r>q5||
 q5t|dkrU| |}d|_nt| ||}| |}|d| t|| |d}|S )Nr   rE   decrease_axisinput_shape_tensorr    Zstarts_tensor_Zend_tensor_r   zThe size of this starts: z must be equal to the axes: r]   zstarts[idx]_z
axes[idx]_r   zero_tensorzstarts_tensor[axes[idx]]_r   zThe size of this ends: z
ends[idx]_zends_tensor[axes[idx]]_Zends_tensor_size_tensorr/   )rH   rI   r   r!   r'   r)   r`   rK   r   r
   r	   r   r   r   rR   rS   r   r(   r   rN   r&   r$   r%   r   )r*   r+   r,   r5   rE   r}   r~   
input_rankZstarts_tensorZends_tensorrV   startsidxendsZstart_tensor_layerstart_tensorZend_tensor_layerZ
end_tensorr   slice_layeroutput_tensorrc   shuffle_layerZreal_size_tensorr/   r/   r0   slice_converter  sN  
	
+

+













r   zpd_op.split_with_numc              
   C   sb  |d }t |j}t||d}|d urt| || dgd}n|d }t| |tj| dgd}| 	d}t| || dgd}| 
|}	t|	| |	d}	t| || dgd}
t| d| dgd}t| ||| d	gd}t| |tj| d
gd}t| ||
| dgd}t| ||| dgd}| j|	|dd}t|| |d}t| ||| dgd}g }t| d| dgd}t|D ]g}t| || d| gd}t| |||| d| gd}t| ||||	| d| gd}| |dg| dg| dg| }|d| |d| t|| ||d t| ||| dgd}q|S )Nr   r   rZ   r    numnum_splits_tensorinput_shape_size_tensorr   is_negative_axisis_negative_axis_intaxis_adjustmentrS   
split_sizecurrent_offsetidx_tensor_start_tensor_size_tensor_r   )r'   r)   r	   r   r!   r   r;   rz   rH   rI   rM   r   r(   r   r   r   r4   r   r`   r   r   rN   r&   rK   )r*   r+   r,   r5   ri   r7   rZ   Z
num_splitsr   r~   r   r   r   r   r   Zinput_axis_sizer   outputsr   r   
idx_tensorr   r   r   r/   r/   r0   split_with_num_converters  s   















r   zpd_op.splitc              
   C   s~  |d }|j }t|}t||d}|d ur!t| || dgd}n|d }t| |tj| dgd}t||d}|d urFdd |D }	d}
n|d }d	}
| |}t	|| |
d}t| || d
gd}t| d| dgd}t| ||| dgd}t| |tj| dgd}t| ||| dgd}t| ||| dgd}g }t| d| dgd}|
s%|	D ]n}t| || d| gd}t| |||| d| gd}t| ||||| d| gd}| |dg| dg| dg| }|d| |d| t	|| ||
d | ||tjj}t	|| |
d}q|S |j d }|dkr3tdt|}t|D ]}t| || d| gd}| j||dd}t	|| |
d}t| |||| d| gd}t| ||||| d| gd}| |dg| dg| dg| }|d| |d| t	|| ||
d | ||tjj}t	|| |
d}q;|S )Nr   r   rZ   r    r   c                 S   s   g | ]}t |qS r/   )r3   )re   rW   r/   r/   r0   rf     s    z#split_converter.<locals>.<listcomp>FTr   r   r   r   r   offsetZsection_size_tensor_r   r   r2   zdynamic sections not supportr   r   )r)   r'   r	   r   r!   r   r;   rz   rM   r   r(   r   r   r   r   r   rN   r&   rK   Zadd_elementwiseZElementWiseOperationZSUMNotImplementedErrorr3   r`   r4   )r*   r+   r,   r5   rh   ri   r7   rZ   Zsections_valueZsection_listZdynamic_sectionsZsections_tensorr~   r   r   r   r   r   r   r   Zsection_sizeZsection_size_tensorr   r   r   Znum_sectionsr   r   r/   r/   r0   split_converter  s  








		


;



	



r   zpd_op.stackc              
   C   s  |d }t |}g }t|D ]	}|||  qt |d j}|d }| d}|dk r2||7 }| |d }	t|	| |	d}	g }
t|D ]C}||k rb|
t	| |	||
 d| gd qI||kr{|
t	| |	|d |
 d| gd qI|
t| d|
 d| gd qI| |
}t|| |d}t|D ]$}| || }|d| t||
 d| g |d}|||< q| |}||_t|| |d}t | d jdkr| d jd dkrt| ||
 dgd}|S )	Nr   r   rS   Zshape_tensor_vec_r    Zshuffle_layer_r2   r   )r'   r`   rK   r)   rH   rI   rM   r   r(   r
   r!   r   rR   r$   r&   rS   resultsr   )r*   r+   r,   rY   Z	input_numrV   r   Zoutput_rankrS   r   Zshape_tensor_vecZafter_shape_tensorr   Zreshaped_tensorr[   r   r/   r/   r0   stack_converter  sr   

	







r   z
pd_op.tilec                 C   s  |d }|j }| |}t|| |d}t|}t||d}|d ur4t| || dgd}t|}	n1|d }t|t	rMt|}	t
| || dgd}nt| || dgd}| d  j }
|
d }	||	krt| dg||	  | dgd}t
| ||g| dgd}n3||	k rt| dg|	|  | dgd}t
| ||g| dgd}t| ||| dgdd	}|}n|}dgt||	 }dgt||	 }dgt||	 }t| ||| d
gd}| ||||}|d| t|| t }|g dkrtjj|_ntjj|_|dS )Nr   r   repeat_tensorr    one_rank_tensorrepeat_expand_tensorr~   Tr!   Zis_shape_tensoroutput_shape_tensorr   )      r   )r)   rM   r   r(   r'   r	   r   r!   r"   r#   r   r   rF   rG   r   maxr   rN   r&   r   r;   
SampleModeZWRAPmodeZ	SliceMode)r*   r+   r,   rm   rh   r~   rn   Zrepeat_timesr   Zrepeat_rankZrepeat_shaper   r   rB   rC   Zoutput_shaper   r   version_listr/   r/   r0   tile_converter  s   













r   zpd_op.take_along_axisztrt_version_ge=8.2c           	      C   sj   |  dd}|d }|d }|j}|dk r|t|7 }| ||tjj}||_t	|| |
d}|S )NrS   r   r   )rH   rI   r)   r'   r:   r;   r<   ZELEMENTrS   r   r(   )	r*   r+   r,   rS   r5   r6   ra   r8   r   r/   r/   r0   take_along_axis_converterL  s   


r   zpd_op.strided_slicec              
   C   s  |d }|  d }t||d}t||d}t||d}|j}t|}	dg|	 }
dg|	 }dg|	 }dg|	 }d}t|D ]$\}}|| |
|< || ||< || ||< || dk s_|| dk rad}q=t| || dgd	}t| |
| d
gd	}|rt| ||| d
gd	}g }t	t|D ]}|
t| ||| d| gd	 qt|D ]>\}}|| dkrt| || | d| gd	||< qt| || t| || | d| gd	| d| gd	||< qt| |t| t| || dgd	|| dgd	| dgd	}t| d| dgd	}t| || dgd	}t| |t| ||| dgd	| dgd	}| ||
||}|d| |d| |d| t|| |dS )Nr   rE   r   r      FTr   r    r   end_vec_tensorr   r   r   zero_tstep_tensorr   )rH   r	   r)   r'   rJ   r   r!   r   r   r`   rK   r
   r   r   r   r   r   rN   r&   r   r(   )r*   r+   r,   r5   rE   r   r   stridesrh   Znchw_input_dimsZtrt_start_dimsZtrt_end_dimsZtrt_size_dimsZtrt_step_dimsZhas_neg_indicesrV   Ztrt_axisr   r   r   r   r   r   r.   r/   r/   r0   strided_slice_converterc  s   




	





r   z
pd_op.rollc           !   	   C   s  |d }|  d }t||d}|d u r|d }t|}t| || dgd}t|D ]}|| }	t|tjrJt	| ||| d| gd}
|
}n|| }
t
| |
| d| gd}t	| ||	| d| gd}t| ||| d	| gd}t| ||| d
| gd}t| ||| d| gd}t| ||| d| gd}t| ||| d| gd}t| ||| d| gd}t| ||| d| gd}t| ||| d| gd}t
| d| d| gd}t
| d| d| gd}t| ||| d| gd}t| ||| d| gd}t	| |dd| d| gd}| jdtjjd}|d| |d| |d| t|| |d}t| ||| d| gd}t| ||| d| gd}t
| dd| d| gd}| jdtjjd}|d| |d| |d| t|| |d}||g}t| || dgd}|dkr| j|||	d} n| j| d||	d} t| | q+| dS )Nr   rS   r   r~   r    Zshift_Zinput_shift_Zinput_axis_Zinput1_Ztmp_div_res_Ztmp_prod_res_Zstart_Ztmp_div_res1_Ztmp_prod_res1_Zzero_tensor_Zstep_Zsub_qutient_Zquotient_tensor_TZstart1_)Z	is_scalarr!   r/   )r)   opr   Zsub_qutient_tensor_Zstart2_concat_input_tensor)rm   indicesrS   )rH   r	   r'   r   r!   r`   r"   r;   ZITensorr
   r   r   r   r   r   Zadd_fillZFillOperationZLINSPACEr&   r   r(   r   r4   )!r*   r+   r,   r5   rS   ZshiftsZ	axis_sizer~   rV   ZaxishiftZinput_shiftZ
input_axisZinput1Ztmp_div_resZtmp_prod_resrB   Ztmp_div_res1Ztmp_prod_res1r   stepZsub_qutientZquotient_tensorZstart1Zfill_layer0Zindex_tensor0Zsub_qutient_tensorZstart2Zfill_layer1Zindex_tensor1Zitensorsr   r.   r/   r/   r0   roll_converter  s  





r   z	pd_op.padc           	      C   sn   |d }|  d }t|}||d  ||d  g}||d  ||d  g}| |||}t|| |dS )Nr   paddings   r   r   r   )rH   r'   Zadd_padding_ndr   r(   )	r*   r+   r,   r5   r   pad_sizepre_padpost_padr.   r/   r/   r0   pad_converter`  s   

r   zpd_op.pad3dc                    s*  |\}  dd}  dd}  d}|dks#|dkr=  }t|d}||d	< t ||}	|	d
S t|j}
jd
 }|
d d |ks^J d|
d d  d| dg d fddt|D }t |	 d	gdt
 d
d
g	 dgd}d
g}dg}dg}dg} |||}t| |d
}t ||g	 dgd} |||}t| |d
}t ||g	 dgd}t
 d
g|
 	 dgd}t ||	 dgd}t ||	 dgd}t |	 dgd}t ||	 dgd}dg|
 }|} ||||}|d| |d| t| |dkrstjj|_|dkrr|jtjjtjjtjjfv r[t
 |tj	 dgd}nt|}t
 |tj	 dgd}|d| n|dkr~tjj|_n|d krtjj|_nt d!| |d
S )"NZ	pad_valueg        r   Zconstantdata_formatZcircularZNDHWCr   r   r   r   r   zExpected paddings size is z, but received r]   )r   r   r      r   r   c              	      s.   g | ]}t  |  d | gdqS )Zshuffle_inputs_r    )r
   r!   re   rV   r*   r   r+   Zshuffle_indexr/   r0   rf     s    z#pad3d_converter.<locals>.<listcomp>r    	pre_zerosr   r   r   zerosrB   total_paddingrh   size
fill_value)rs   r!   ZreflectZ	replicatezUnsupported padding mode: )!rH   rI   r	   r   r(   r'   r)   r`   r   r!   r   rN   r   r   r   r   r&   r;   r   ZFILLr   rs   ZDataTypeFLOATZHALFZINT8npr{   r3   rz   ZREFLECTCLAMP
ValueError)r*   r+   r,   r5   valueZpadding_moder   rH   Z
value_attrr.   Z	input_dimr   Zshuffle_inputsr   Zstart_slice1Zstart_slice2Z
size_sliceZstride_slicer   r   r   rB   r   rh   r   rC   dummyr   r   Z	value_intr/   r   r0   pad3d_converterl  s   


	













r   zpd_op.numelc                 C   sP   |d }|  |}t|| |d}| j|tjjddd}t|| |dS )Nr   r   FrD   )rM   r   r(   rO   r;   rP   rQ   )r*   r+   r,   r5   r   r.   r/   r/   r0   numel_converter  s   




r   zpd_op.index_putc                    s  |\}}}|d }t | dgd}|j}|j t|}	 fddt|	D }
fddt|	D }fddt|	D }t|t|
 dgd d	gd
d}t| dgd}t| dgd}dg|	 }t|t	j
 d	gd|||}|d| |d| |d| t	jj|_t| t|dt	j dgd}|}t| |d}t	ddg}|}||_t| |d}t | dgd}t|d dgd}dg}||||}|dtd dgd |d| |dtd dgd t	jj|_t| |d}|||t	jj}t| |dS )Nr   r~   r    c                    s<   g | ]}t |t k r | nd  d| gdqS )r   Zindices_shape_vec_r    )r   r'   r!   r   Zindices_dimsr*   r+   r/   r0   rf     s    z'index_put_converter.<locals>.<listcomp>c                    (   g | ]}t  d  d| gdqS )r   Zstart_tensor_vec_r    r   r!   r   r*   r+   r/   r0   rf         c                    r   )r   Zstride_tensor_vec_r    r   r   r   r/   r0   rf     r   indices_shape_vecindices_tensor_tempTr   r   stride_tensorr   r   r   bool_indices_tensorindices_new_shape_tensorindices_count_tensorZvalue_slice_layer_startZvalue_slice_layer_stride)r   r!   r)   r'   r`   r   r   rN   r   r;   r{   r&   r   r   r   r   r(   ry   Zadd_non_zeroZPermutationr$   Zfirst_transposer
   r   Zadd_scatterZScatterModer=   )r*   r+   r,   r5   Zindices_listZvalue_tensorr>   r~   ra   rn   r   Zstart_tensor_vecZstride_tensor_vecr   r   r   rC   Zindices_slice_layerr   Znonzero_layerZpermutationZtrans_layerr   r   Zvalue_strideZvalue_slice_layerr.   r/   r   r0   index_put_converter  s   




















r   )9numpyr   Ztensorrtr;   Zpaddle.tensorrt.converter_utilsr   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zpaddle.tensorrt.registerr   utilr   registerr1   r9   r?   rX   r\   rd   rk   rp   rr   r|   r   r   r   r   r   r   r   r   r   r   r   r   r/   r/   r/   r0   <module>   s   l
$



V
8?


 >
 
 6
I
T

k
 

s
