o
    * i|                     @  s   d dl mZ d dlZd dlmZmZ d dlZddlmZ ddl	m
Z
 ddlmZmZmZmZ ddlmZ dd	lmZ erNd d
lmZ d dlmZ d dlmZ G dd deZdS )    )annotationsN)TYPE_CHECKINGAny   )unique_name)_append_activation_in_dygraph)	Parameterdtype_is_floatingin_dygraph_modein_pir_mode)LayerHelperBase)	ParamAttr)	Generator)Tensor)Operatorc                      s   e Zd Zd8 fddZd9ddZd:d;ddZd:d<ddZed=ddZed=ddZ	d>ddZ
	d:d?d d!Z	d:d@d#d$ZdAd&d'Z	)dBdCd.d/ZdDd0d1Zd2d3 ZdEd6d7Z  ZS )FLayerHelper
layer_typestrkwargsr   returnNonec                   sb   || _ | j dd }|d u r$t rt|| j d< n
| jj|| j d< t j| j d |d d S )Nname)r   )	r   getr
   r   generatemain_programZ_name_generatorsuper__init__)selfr   r   r   	__class__ d/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/paddle/base/layer_helper.pyr   (   s   zLayerHelper.__init__argsr   c                 O  s   | j  j|i |S N)r   Zcurrent_block	append_op)r   r"   r   r    r    r!   r$   8   s   zLayerHelper.append_opinputinput_param_namelist[Tensor]c                 C  sR   | j |g }g }t|ttfr|D ]
}|| | q|S || | |S r#   )r   r   
isinstancelisttupleappendZto_variable)r   r&   inputsretinpr    r    r!   multiple_input;   s   zLayerHelper.multiple_inputr   c                 C  s*   |  |}t|dkr| j d|d S )Nr   z layer only takes one inputr   )r/   lenr   )r   r&   r,   r    r    r!   r%   E   s   
zLayerHelper.inputr   c                 C     t | jdd S )N
param_attrr   Z_to_attrr   r   r   r    r    r!   r2   K      zLayerHelper.param_attrc                 C  r1   )N	bias_attrr3   r4   r    r    r!   r6   O   r5   zLayerHelper.bias_attrlengthintlist[ParamAttr]c                 C  s|   | j }t|tr|g}t|dkrt||krtdt|dkr<|dkr<d g| }t|D ]}t|d ||< q.|}|S )Nr   zparameter number mismatchr   )r2   r(   r   r0   
ValueErrorrangecopydeepcopy)r   r7   r2   tmpir    r    r!   multiple_param_attrT   s   

zLayerHelper.multiple_param_attr#Generator[tuple[Tensor, ParamAttr]]c                 c  s.    |  |}| t|}t||E d H  d S r#   )r/   r@   r0   zip)r   r&   r,   Zparam_attrsr    r    r!   iter_inputs_and_paramsb   s   
z"LayerHelper.iter_inputs_and_paramsNone | paddle.dtypec                 C  sL   |  |}d }|D ]}|d u r|j}q	||jkr#td| d|j q	|S )NzData Type mismatch: z to )r/   dtyper:   )r   r&   r,   rE   Zeachr    r    r!   input_dtypei   s   

zLayerHelper.input_dtyper   c                 C  s.   | j  |}t|tstd| d|S )Nzno Parameter name z found)r   Zglobal_blockvarr(   r   r:   )r   r   paramr    r    r!   get_parameteru   s   
zLayerHelper.get_parameterr   N	input_var	dim_startdim_end
int | Nonec                 C  sz   t |j|| }| j}|s|S | j|||jdd}t r!|| S | j|jd}| jd|g|gdd|gid|id |S )	a:  
        Append bias operator and return its output. If the user does not set
        bias_attr, append_bias_op will return input_var

        :param input_var: the input variable. The len(input_var.shape) is
        larger or equal than 2.
        :bias_initializer: an instance of a subclass of Initializer used to
        initialize the bias
        :param dim_start:
        :param dim_end: the shape of the bias will be
        input_var.shape[dim_start:dim_end]. The bias is broadcasted to other
        dimensions and added to input_var to get the output
        T)attrshaperE   Zis_biasrE   Zelementwise_add)XYOutZaxistyper,   Zoutputsattrs)r)   rO   r6   Zcreate_parameterrE   r   "create_variable_for_type_inferencer$   )r   rJ   rK   rL   sizer6   br>   r    r    r!   append_bias_op|   s"   
zLayerHelper.append_bias_opc                 C  s   | j dd }|d u r|S t|trd|i}ntt|d d }d| j v r6| j dr6| j d}||d< |d}t rFt|||}|S t rQt	j
|||S | j|jd}| j|d|gid|gi|d |S )	NactrU   z should be unicode or str	use_cudnnrP   rQ   rS   rT   )r   r   r(   r   	TypeErrorpopr
   r   r   paddleZ	pir_utilsZappend_activation_in_pirrW   rE   r$   )r   rJ   r[   r\   Zact_typeresr>   r    r    r!   append_activation   s4   


zLayerHelper.append_activationc                 C  s,   |d u s
t |du rtjj S tjj S )NT)r	   r_   nnZinitializerZXavierUniformConstant)r   rE   r    r    r!   _get_default_initializer   s   z$LayerHelper._get_default_initializer
param_nameclsc                 C  s.   | j |d }t||std|| j|jd S )Nz1The input {0} parameter of method {1} must be {2})r   r   r(   r]   r   __name__)r   re   rf   rH   r    r    r!   is_instance   s   
zLayerHelper.is_instance)r   r   r   r   r   r   )r"   r   r   r   r   r   )r%   )r&   r   r   r'   )r&   r   r   r   )r   r   )r7   r8   r   r9   )r&   r   r   rA   )r&   r   r   rD   )r   r   r   r   )r   N)rJ   r   rK   r8   rL   rM   r   r   )rJ   r   r   r   )re   r   rf   r   r   r   )rg   
__module____qualname__r   r$   r/   r%   propertyr2   r6   r@   rC   rF   rI   rZ   ra   rd   rh   __classcell__r    r    r   r!   r   '   s(    




$ r   )
__future__r   r<   typingr   r   r_    r   Zdygraph_utilsr   Z	frameworkr   r	   r
   r   Zlayer_helper_baser   r2   r   collections.abcr   r   Zpaddle.base.frameworkr   r   r    r    r    r!   <module>   s   