o
    MeS                     @   s   d dl mZ d dlZd dlZddlmZmZmZm	Z	m
Z
mZ ddlmZ ddlmZmZ ddlmZ ddlmZmZ d	gZG d
d	 d	eZdS )    )print_functionN   )Variabledefault_main_programdefault_startup_program_non_static_mode_current_expected_place_in_eager_without_dygraph_check)unique_name)	ParamAttrWeightNormParamAttr)core)_global_weight_initializer_global_bias_initializerLayerHelperBasec                   @   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 Zd&ddZd d! Zd"d# ZdS )'r   Zfloat32c                 C   s   || _ || _d S N)_layer_type_name)selfname
layer_type r   ND:\Projects\ConvertPro\env\Lib\site-packages\paddle/fluid/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   )   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_program1   r   zLayerHelperBase.startup_programc                 C   s
   || _ d S r   _LayerHelperBase__dtype)clsdtyper   r   r   set_default_dtype5   s   
z!LayerHelperBase.set_default_dtypec                 C   r   r   r    )r"   r   r   r   get_default_dtype9   r   z!LayerHelperBase.get_default_dtypeNc                 C   s   t |tjr,t rtj|t dd|r|dS ddS tj||r"|nddt dd}|S t |tjt	tjjfr9|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.fluid as fluid

            with fluid.dygraph.guard():
                x = np.ones([2, 2], np.float32)
                y = fluid.dygraph.to_variable(x)

        FNT )valuer   persistableZplaceZ	zero_copyz]The type of input value is invalid, expected type is 'ndarray' or 'Variable', but received %s)
isinstancenpZndarrayr	   r   eagerZTensorr   ZVarBaser   	TypeErrortype)r   r'   r   Zpy_varr   r   r   to_variable=   s.   

zLayerHelperBase.to_variablec                    s  ddl mmm 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rn||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 )Nr   )elementwise_mulelementwise_divreshape   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#   r(   Zweight_norm_absabsXOut)r-   inputsoutputsZweight_norm_powpowfactorr-   r9   r:   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_opl   sh   

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 )Nr3   Zweight_norm_reshapeFr5   ZXshape)r   r#   reshape2r7   shape)r8   ZXShape)r-   r9   r>   r:   )rA   r
   rB   rC   r   r#   rD   )rF   rL   rG   rI   Zx_shaperJ   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 )
Nr3   Zweight_norm_transposeFr5   	transposer7   r8   axisr=   )rA   r
   rB   rC   r   rD   )rF   rN   rG   rI   rJ   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 dimNr3   r4   Fr5   r?   rI   r   r   )rL   rI   )rG   rL   rI   )rI   rG   rI   )	rA   r
   rB   rC   r   rL   lenlistrange)
rF   rG   r?   rI   Z	out_shaper1   normpermrM   rK   )_LayerHelperBase__norm_op_LayerHelperBase__reshape_op_LayerHelperBase__transpose_opr#   r   r   r   Z__norm_except_dim   sJ     
zCLayerHelperBase._create_weight_normalize.<locals>.__norm_except_dimc                    sZ    ||j  d}| |d}||du r|n	||j| gd|du r'dn|d}|S )z%Calculations for weight normalizationrO   )rF   yN)rF   rL   rP   )rF   rZ   rN   )r   current_blockrL   )gvr?   rU   scalew)!_LayerHelperBase__norm_except_dimr0   r/   r1   r   r   r   Z__weight_normalize   s   zDLayerHelperBase._create_weight_normalize.<locals>.__weight_normalizeZ_g_v)r#   rL   Zwith_initializerT)rF   rG   r?   rI   rQ   )r?   r   )Zlayersr/   r0   r1   r   global_blockcopydeepcopyr   rR   r?   create_parameter
_to_kwargsr   )r   attrrL   r#   Z"_LayerHelperBase__weight_normalizeZg_param_attrZg_param_shapeZv_param_attrZv_param_shapeZg_paramZv_paramZw_paramr   )	r`   rW   rX   rY   r#   r0   r/   r1   r   r   _create_weight_normalizeg   sx   2%


	

z(LayerHelperBase._create_weight_normalizeFc                 C   s  t |}t|}|sdS t|tsJ t|D ]\}}	|	dks)J d||	q|s/| j}|r>d}
t dur;t n|}nd}
t	 durHt	 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rtdn|ds|d	v std|r|  n
|  n|| t|tr| |||}tj| |S t rt |j
}|rt!d
|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   zRExpected every dim's size to be larger than 0, but the size of the {}-th dim is {}br_   r3   zCan not create parameter with default initializer when dtype is not float type. Set default_initializer to fit the parameter dtype!rE   )doubleZuint16zparameter name [{}] 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#   rL   r-   stop_gradientTrb   )r#   rL   r-   r   )'rd   re   r   Z_to_attrr)   	enumerateformatr!   r   r   r   r
   generaterC   initializerr   VarDescVarTypeZFP32ZFP64ZFP16ZBF16r,   
startswithZ_set_default_bias_initializerZ_set_default_param_initializerZ_set_default_initializerr   ri   Zparams_with_weight_normappendr   Zdygraph_parameter_name_checker
ValueErrorr   rc   rf   rg   r   )r   rh   rL   r#   Zis_biasZdefault_initializerrl   r-   isizesuffixparamZis_usedr   r   r   rf   #  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.
        r3   tmpFr   r#   rL   r-   r(   rl   )r!   r   r[   rA   r
   rB   rC   r   r   rq   rr   
LOD_TENSORr   r#   rl   rL   r   r   r   "create_variable_for_type_inference     
z2LayerHelperBase.create_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.
        r3   r{   Fr|   )r!   r   r[   rA   r
   rB   rC   r   r   rq   rr   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[   rA   )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.
        r(   )r   rc   rA   )r   r(   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   rc   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#   rL   r(   rp   N)r)   r   r   r   rc   r   rA   r   r-   r#   rL   )r   r   rp   r   r   r   set_variable_initializer  s   

z(LayerHelperBase.set_variable_initializerr   )FN)F)__name__
__module____qualname__r!   r   propertyr   r   r   r   classmethodr$   r%   r.   ri   r   rq   rr   r}   rf   r   r   r   r   r   r   r   r   r   r   r      sD    






* @
d



)
__future__r   rd   numpyr*   Z	frameworkr   r   r   r   r   r	   r&   r
   Z
param_attrr   r   r   rp   r   r   __all__objectr   r   r   r   r   <module>   s    