o
     jU                     @   s~   d dl 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 ddlmZmZ ddlmZmZ g ZG dd dZdS )	    N   )coreunique_name)Variable_current_expected_placedefault_main_programdefault_startup_programin_dygraph_modein_pir_mode)_global_bias_initializer_global_weight_initializer)	ParamAttrWeightNormParamAttrc                   @   s   e Zd ZdZ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fddZ	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float32c                 C   s   || _ || _d S N)_layer_type_name)selfname
layer_type r   ^/var/www/html/Deteccion_Ine/venv/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   ,      zLayerHelperBase.namec                 C   r   r   )r   r   r   r   r   r   0   r   zLayerHelperBase.layer_typec                 C      t  S r   )r   r   r   r   r   main_program4   r   zLayerHelperBase.main_programc                 C   r   r   )r   r   r   r   r   startup_program8   r   zLayerHelperBase.startup_programc                 C   s
   || _ d S r   _LayerHelperBase__dtype)clsdtyper   r   r   set_default_dtype<   s   
z!LayerHelperBase.set_default_dtypec                 C   r   r   r    )r"   r   r   r   get_default_dtype@   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 %s)
isinstancenpZndarrayr   eagerZTensorr   r   paddlepirZOpResult	TypeErrortype)r   valuer   r   r   r   to_variableD   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 tdjdg dd}|j tdjdg dd}|jdd| id|id	 |j tdjd
g dd}|jdd|id|idt|id |j tdjdg dd}|jdd|id|i|||d u rvd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)r,   inputsoutputsZweight_norm_powpowfactorr,   r7   r8   attrsZweight_norm_sumZ
reduce_sumT)dimkeep_dimZ
reduce_allg      ?)
create_varr   generate_with_ignorable_keyjoinr   	append_opfloat)	xoutpr=   r>   blockZabs_outZpow_outZsum_outr#   r   r   r   Z	__norm_opq   sl   


z;LayerHelperBase._create_weight_normalize.<locals>.__norm_opc                    s^   |d u r|j tdjdg dd}|j d| jd}|jdd| id	|i||d
d |S )Nr0   Zweight_norm_reshapeFr2   ZXshape)r   r#   reshape2r5   shape)r6   ZXShape)r,   r7   r<   r8   )r?   r   r@   rA   r   r#   rB   )rD   rJ   rE   rG   Zx_shaperH   r   r   Z__reshape_op   s    z>LayerHelperBase._create_weight_normalize.<locals>.__reshape_opc                    sL   |d u r|j tdjdg dd}|jdd| id|id|id	 |S )
Nr0   Zweight_norm_transposeFr2   	transposer5   r6   axisr;   )r?   r   r@   rA   r   rB   )rD   rL   rE   rG   rH   r   r   Z__transpose_op   s   z@LayerHelperBase._create_weight_normalize.<locals>.__transpose_opc           
         s  |du r|j tdjdgdd}|du r# | |||d |S |dkrU| 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 dimNr0   r1   Fr2   r=   rG   r   r   )rJ   rG   )rE   rJ   rG   )rG   rE   rG   )	r?   r   r@   rA   r   rJ   lenlistrange)
rD   rE   r=   rG   Z	out_shapereshapenormpermrK   rI   )_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 normalizationrM   )rD   yN)rD   rJ   rN   )rD   rY   rL   )	r   current_blockr)   dividetensormathZ_multiply_with_axisrS   rJ   )gvr=   rT   scalew)!_LayerHelperBase__norm_except_dimr   r   r   Z__weight_normalize   s   	zDLayerHelperBase._create_weight_normalize.<locals>.__weight_normalizeZ_gr   _vr#   rJ   Zwith_initializerT)rD   rE   r=   rG   rO   )r=   r   )
r   global_blockcopydeepcopyr   rP   r=   create_parameter
_to_kwargsr   )r   attrrJ   r#   Z"_LayerHelperBase__weight_normalizeZg_param_attrZg_param_shapeZv_param_attrZv_param_shapeZg_paramZv_paramZw_paramr   )rb   rV   rW   rX   r#   r   r   _create_weight_normalizen   sr   
A
'


	

z(LayerHelperBase._create_weight_normalizeFc                 C   sD  t |}t|}|sdS t|tsJ t|D ]\}}	|	dks+J d| d|	 q|s1| j}|r@d}
t dur=t n|}nd}
t durJt n|}|j	du r]t
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 rt
|j	}|rt d|j	 d| j!" j#d||||d|j$ddS t% rt&j'jj#d||d|j$dd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

        Returns created parameter Variable.
        Nr   zCExpected every dim's size to be larger than 0, but the size of the z-th dim is bra   r0   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bfloat16rC   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#   rJ   r,   stop_gradientTre   rd   )r#   rJ   r,   r   ))rg   rh   r   Z_to_attrr&   	enumerater!   r   r   r   r   generaterA   initializerr   VarDescVarTypeZFP32ZFP64ZFP16ZBF16ZINT8r+   Z_set_default_bias_initializerZ_set_default_param_initializerZ_set_default_initializerr   rl   Zparams_with_weight_normappendr	   Zdygraph_parameter_name_checker
ValueErrorr   rf   ri   rj   r
   r)   r*   r   )r   rk   rJ   r#   Zis_biasZdefault_initializerrn   r,   isizesuffixparamZis_usedr   r   r   ri   I  s   













z LayerHelperBase.create_parameterc                 C   >   |s| j }| j jtd| jdg||tj	j
jd|dS )aG  Create a temporary variable that should be type inferred layer.

        Note:
            The default type will be set to LOD_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.
        r0   tmpFr   r#   rJ   r,   r3   rn   )r!   r   rZ   r?   r   r@   rA   r   r   rr   rs   
LOD_TENSORr   r#   rn   rJ   r   r   r   "create_variable_for_type_inference     
z2LayerHelperBase.create_variable_for_type_inferencec                 C   sz   |s| j }| j jtd| jdg||tj	j
jd|d}| jj}d| j_tjjj|j|dd|d ||_|| j_|S )aD  Create a global variable that should be type inferred layer.

        Note:
            The default type will be set to LOD_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.
        r0   r{   Fr|   r   g        )Z	force_cpurE   )r!   r   rf   r?   r   r@   rA   r   r   rr   rs   r}   Zcurrent_block_idxr)   r\   ZcreationZfill_constantrJ   rn   )r   r#   rn   rJ   outputZsaved_block_idr   r   r   *_create_global_variable_for_type_inference  s(   

z:LayerHelperBase._create_global_variable_for_type_inferencec                 C   rz   )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.
        r0   r{   Fr|   )r!   r   rZ   r?   r   r@   rA   r   r   rr   rs   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   rZ   r?   )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.
        r3   )r   rf   r?   )r   r3   r   r   r   r   r   create_global_variable  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   rf   Zhas_varvarr   )r   r   r   r   r   r   r   create_or_get_global_variable-  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   r,   r#   rJ   r3   rq   N)r&   r   r	   r   rf   r   r?   r   r,   r#   rJ   )r   r   rq   r   r   r   set_variable_initializer7  s   

z(LayerHelperBase.set_variable_initializerr   )FN)F)__name__
__module____qualname__r!   r   propertyr   r   r   r   classmethodr$   r%   r.   rl   r   rr   rs   r}   ri   r   r   r   r   r   r   r   r   r   r   r   r   $   sD    






* `
~

"


r   )rg   numpyr'   r)    r   r   Z	frameworkr   r   r   r   r	   r
   rq   r   r   Z
param_attrr   r   __all__r   r   r   r   r   <module>   s    