o
    pidZ                     @  s   d dl mZ d dlZd dlmZ d dlZd dlZddlm	Z	m
Z
 ddlmZmZmZmZmZmZmZ ddlmZmZ ddlmZmZ erJd d	lmZ g ZG d
d dZdS )    )annotationsN)TYPE_CHECKING   )coreunique_name)Variable_current_expected_placedefault_main_programdefault_startup_programin_dygraph_modein_dynamic_or_pir_modein_pir_mode)_global_bias_initializer_global_weight_initializer)	ParamAttrWeightNormParamAttr)_DTypeLiteralc                   @  s   e Zd ZU dZded< dd Zedd Zedd	 Zed
d Z	edd Z
edd Zedd Zd*ddZdd ZddddejjjdfddZ	d+d,ddZ	d+ddZ	d+d d!Zd"d# Zd-d$d%Zd&d' Zd(d) ZdS ).LayerHelperBasefloat32r   _LayerHelperBase__dtypec                 C  s   || _ || _d S N)_layer_type_name)selfname
layer_type r   d/home/app/PaddleOCR-VL/.venv_paddleocr/lib/python3.10/site-packages/paddle/base/layer_helper_base.py__init__.   s   
zLayerHelperBase.__init__c                 C     | j S r   )r   r   r   r   r   r   2      zLayerHelperBase.namec                 C  r   r   )r   r    r   r   r   r   6   r!   zLayerHelperBase.layer_typec                 C     t  S r   )r	   r    r   r   r   main_program:   r!   zLayerHelperBase.main_programc                 C  r"   r   )r
   r    r   r   r   startup_program>   r!   zLayerHelperBase.startup_programc                 C  s
   || _ d S r   r   )clsdtyper   r   r   set_default_dtypeB   s   
z!LayerHelperBase.set_default_dtypec                 C  r   r   r%   )r&   r   r   r   get_default_dtypeF   r!   z!LayerHelperBase.get_default_dtypeNc                 C  s^   t |tjrtj|t dd|r|dS ddS t |ttjjtj	j
fr&|S tdt| )a  
        The API will create a ``Variable`` object from numpy\.ndarray or Variable object.

        Parameters:
            value(ndarray): The numpy\.ndarray object that needs to be converted, it can be multi-dimension, and the data type is one of numpy\.{float16, float32, float64, int16, int32, int64, uint8, uint16}.
            name(str, optional): The default value is None. Normally there is no need for user to set this property. For more information, please refer to :ref:`api_guide_Name`

        Returns:
            Variable: ``Tensor`` created from the specified numpy\.ndarray object, data type and shape is the same as ``value`` .

        Examples:

            .. code-block:: python

                >>> import numpy as np
                >>> import paddle.base as base

                >>> with base.dygraph.guard():
                ...     x = np.ones([2, 2], np.float32)
                ...     y = base.dygraph.to_variable(x)
                ...
        FNTz[The type of input value is invalid, expected type is 'ndarray' or 'Variable', but received )
isinstancenpZndarrayr   eagerZTensorr   r   paddlepirValue	TypeErrortype)r   valuer   r   r   r   to_variableJ   s"   zLayerHelperBase.to_variablec                   s  d dd dj  ffdd	d j  ffdd	d j  ffdd	d d j  ffd	d
	  fdd}t|}|jd |_dgt| }|jd ura||j ||j< t|}|jd |_|}j  jd|d|jdd}	j  jd|d|jdd}
 |
|	|jj  d |	||	j  d j	 jd|d| }	j	 jd|d| }
||	|
|jd}|S )N   Fc           	        s.  |d u r|j jjdjdg dd}|j jjdjdg dd}|jdd| id|id	 |j jjdjd
g dd}|jdd|id|idt|id |j jjdjdg dd}|jdd|id|i|||d u r~dnddd |jdd|id|idd| id |S )N.weight_norm_normFr   r'   persistableZweight_norm_absabsXOut)r1   inputsoutputsZweight_norm_powpowfactorr1   r<   r=   attrsZweight_norm_sumZ
reduce_sumT)dimkeep_dimZ
reduce_allg      ?)
create_varr#   _name_generatorgenerate_with_ignorable_keyjoinr   	append_opfloat)	xoutprB   rC   blockZabs_outZpow_outZsum_outr'   r   r   r   Z	__norm_opt   sl   


z;LayerHelperBase._create_weight_normalize.<locals>.__norm_opc                   sb   |d u r|j jjdjdg dd}|j d| jd}|jdd| id	|i||d
d |S )Nr5   Zweight_norm_reshapeFr7   ZXshape)r   r'   reshape2r:   shape)r;   ZXShape)r1   r<   rA   r=   )rD   r#   rE   rF   rG   r   r'   rH   )rJ   rP   rK   rM   Zx_shaperN   r   r   Z__reshape_op   s    z>LayerHelperBase._create_weight_normalize.<locals>.__reshape_opc                   sP   |d u r|j jjdjdg dd}|jdd| id|id|id	 |S )
Nr5   Zweight_norm_transposeFr7   	transposer:   r;   axisr@   )rD   r#   rE   rF   rG   r   rH   )rJ   rR   rK   rM   rN   r   r   Z__transpose_op   s   z@LayerHelperBase._create_weight_normalize.<locals>.__transpose_opc           
        s  |du r|j jjdjdgdd}|du r% | |||d |S |dkrW| jd gdgt| jd   }| | jd d	g|d
} |dg|d}||||d |S |t| jd krdgt| jd  | jd	 g }| d	| jd	 g|d
} |dg|d}||||d |S tt	t| j}|d|d< ||< | ||d}|jd gdgt|jd   }||jd d	g|d
} |dg|d}|||d
}	|	|||d |S )z0Computes the norm over all dimensions except dimNr5   r6   Fr7   rB   rM   r   r   )rP   rM   )rK   rP   rM   )rM   rK   rM   )
rD   r#   rE   rF   rG   r   rP   lenlistrange)
rJ   rK   rB   rM   Z	out_shapereshapenormpermrQ   rO   )_LayerHelperBase__norm_op_LayerHelperBase__reshape_op_LayerHelperBase__transpose_opr'   r   r   r   Z__norm_except_dim   sH     zCLayerHelperBase._create_weight_normalize.<locals>.__norm_except_dimc                   sd    ||j  d}tj| |d}tjjj||du r|n
tj||j| gd|du r,dn|d}|S )z%Calculations for weight normalizationrS   )rJ   yN)rJ   rP   rT   )rJ   r_   rR   )	r#   current_blockr-   dividetensormathZ_multiply_with_axisrY   rP   )gvrB   rZ   scalew)!_LayerHelperBase__norm_except_dimr   r   r   Z__weight_normalize  s   zDLayerHelperBase._create_weight_normalize.<locals>.__weight_normalizeZ_gr   _vr'   rP   Zwith_initializerT)rJ   rK   rB   rM   rU   )rB   r   )
r$   global_blockcopydeepcopyr   rV   rB   create_parameter
_to_kwargsr#   )r   attrrP   r'   Z"_LayerHelperBase__weight_normalizeZg_param_attrZg_param_shapeZv_param_attrZv_param_shapeZg_paramZv_paramZw_paramr   )rh   r\   r]   r^   r'   r   r   _create_weight_normalizeq   sr   
A
'


	

z(LayerHelperBase._create_weight_normalizeFc	                 C  s  t |}t|}|sdS t|tsJ t|D ]\}	}
|
dks+J d|	 d|
 q|s1| j}t|tjr>t	j
jj| }|rMd}t durJt n|}nd}t durWt n|}|jdu r|t rntd| j|g|_n| jjd| j|g|_|du r|jdu rt|tjjr|tjjjkr|tjjjkr|tjjjkr|tjjjkr|tjjjkrtdn|d	vrtd
|r|  n
|  n| | t|t!r| "|||}t!j#$| |S t% rt&|j}|rt'd|j d| j( j)d||||d|j*dd}|dur|+|}|S t, rFt|tjjr)t	j
jj-| }t	j
jj)d||d|j*dd}|durD|+|}|S | j.( j)d|||d|j*dd | j( j)d|||d|* S )a  Create parameters for this layers.

           Args:
               attr: [ParamAttr] should be the parameter attribute for this parameter
               shape: shape of the parameter
               dtype: data type of this parameter
               is_bias: if this is a bias parameter
               default_initializer: set the default initializer for this parameter
               device: device where this parameter will be placed

        Returns created parameter Variable.
        Nr   zOExpected every dim's size to be larger than or equal to 0, but the size of the z-th dim is brg   r5   zCan not create parameter with default initializer when dtype is not ['float16', 'float32', 'float64', 'bfloat16'] type. Set default_initializer to fit the parameter dtype!)Zfloat16r   Zfloat64Zbfloat16rI   Zint8zCan not create parameter with default initializer when dtype is not ['float16', 'float32', 'float64', 'bfloat16', 'float'] type. Set default_initializer to fit the parameter dtype!zparameter name [z] have be been used. In dygraph mode, the name of parameter can't be same.Please check the parameter attr value passed to self.create_parameter or constructor of dygraph Layers)r'   rP   r1   stop_gradientTrk   rj   )r'   rP   r1   r   )/rm   rn   r   Z_to_attrr*   	enumerater   r   ZDataTyper-   r.   Zdatatype_to_vartyper   r   r   r   r   generaterG   r#   rE   initializerVarDescVarTypeZFP32ZFP64ZFP16ZBF16ZINT8r0   Z_set_default_bias_initializerZ_set_default_param_initializerZ_set_default_initializerr   rr   Zparams_with_weight_normappendr   Zdygraph_parameter_name_checker
ValueErrorrl   ro   rp   tor   Zvartype_to_datatyper$   )r   rq   rP   r'   Zis_biasZdefault_initializerrt   r1   ZdeviceisizesuffixparamZis_usedr   r   r   ro   N  s   

















z LayerHelperBase.create_parameterreturnpaddle.Tensorc                 C  B   |s| j }| j j| jjd| jdg||tj	j
jd|dS )aI  Create a temporary variable that should be type inferred layer.

        Note:
            The default type will be set to DENSE_TENSOR. However, when
            the var is used as operator output, its type will be updated
            based on operator's `VarTypeInference` implementation in
            infer_var_type.
        r5   tmpFr   r'   rP   r1   r8   rt   )r   r#   r`   rD   rE   rF   rG   r   r   rx   ry   DENSE_TENSORr   r'   rt   rP   r   r   r   "create_variable_for_type_inference     
z2LayerHelperBase.create_variable_for_type_inferencec                 C  s~   |s| j }| j j| jjd| jdg||tj	j
jd|d}| jj}d| j_tjjj|j|dd|d ||_|| j_|S )aF  Create a global variable that should be type inferred layer.

        Note:
            The default type will be set to DENSE_TENSOR. However, when
            the var is used as operator output, its type will be updated
            based on operator's `VarTypeInference` implementation in
            infer_var_type.
        r5   r   Fr   r   g        )Z	force_cpurK   )r   r#   rl   rD   rE   rF   rG   r   r   rx   ry   r   Zcurrent_block_idxr-   rb   ZcreationZfill_constantrP   rt   )r   r'   rt   rP   outputZsaved_block_idr   r   r   *_create_global_variable_for_type_inference  s(   

z:LayerHelperBase._create_global_variable_for_type_inferencec                 C  r   )aN  Create a temporary sparse variable that should be type inferred layer.

        Note:
            The default type will be set to SPARSE_COO. However, when
            the var is used as operator output, its type will be updated
            based on operator's `VarTypeInference` implementation in
            infer_var_type.
        r5   r   Fr   )r   r#   r`   rD   rE   rF   rG   r   r   rx   ry   Z
SPARSE_COOr   r   r   r   )create_sparse_variable_for_type_inference  r   z9LayerHelperBase.create_sparse_variable_for_type_inferencec                 O  s   | j  j|i |S )zKCreate Variable for this layers.
        Returns created Variable.
        )r#   r`   rD   )r   argskwargsr   r   r   create_variable/  s   zLayerHelperBase.create_variablec                 O  s   | j  j|d|i|S )aM  
        create global variable, note that there is no initializer for this global variable.
        Args:
            persistable(bool): True if it is a checkpoint value.
            *args: See create_var's documentation
            **kwargs: See create_var's documentation

        Returns(Variable): the created variable.
        r8   )r#   rl   rD   )r   r8   r   r   r   r   r   create_global_variable5  s   

z&LayerHelperBase.create_global_variablec                 O  s<   | j  |r| j  |dfS | j|d|i|dfS )z
        Creates a global variable if not exists and returns the variable and
        a boolean flag which is true when it is a new variable.
        Fr   T)r#   rl   Zhas_varvarr   )r   r   r   r   r   r   r   create_or_get_global_variableC  s   z-LayerHelperBase.create_or_get_global_variablec                 C  sP   t |tsJ t r||| j  dS | j j|j|j|j	|j
d|d dS )zSet target Variable's initializer

        Args:
            var: target Variable
            initializer: initializer to use
        T)r   r1   r'   rP   r8   rw   N)r*   r   r   r#   rl   r$   rD   r   r1   r'   rP   )r   r   rw   r   r   r   set_variable_initializerM  s   

z(LayerHelperBase.set_variable_initializerr   )FN)r   r   )F)__name__
__module____qualname__r   __annotations__r   propertyr   r   r#   r$   classmethodr(   r)   r3   rr   r   rx   ry   r   ro   r   r   r   r   r   r   r   r   r   r   r   r   *   sH   
 






' b
 
"


r   )
__future__r   rm   typingr   numpyr+   r-    r   r   Z	frameworkr   r   r	   r
   r   r   r   rw   r   r   Z
param_attrr   r   Zpaddle._typing.dtype_liker   __all__r   r   r   r   r   <module>   s   $	