o
    Me	                     @   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	 ddl
mZ d dlmZmZ ddlmZ ddl
mZ d d	lmZ dd
lmZ ddlmZ G dd deZdS )    )print_functionN   )	Parameterdtype_is_floating_non_static_modeOpProtoHolder_global_flags)unique_name)ConstantXavier)	ParamAttr)core)zip)LayerHelperBase)_append_activation_in_dygraphc                       s   e Zd Z fddZdd Zd ddZd dd	Zed
d Zedd Z	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d Z  ZS )"LayerHelperc                    sJ   || _ | j dd }|d u rt|| j d< tt| j| j d |d d S )Nname)
layer_type)kwargsgetr	   generatesuperr   __init__)selfr   r   r   	__class__ ID:\Projects\ConvertPro\env\Lib\site-packages\paddle/fluid/layer_helper.pyr       s   
zLayerHelper.__init__c                 O   s   | j  j|i |S N)main_programZcurrent_block	append_op)r   argsr   r   r   r   r    ,   s   zLayerHelper.append_opinputc                 C   sX   | j |g }g }t|tst|tr"|D ]
}|| | q|S || | |S r   )r   r   
isinstancelisttupleappendZto_variable)r   input_param_nameinputsretinpr   r   r   multiple_input/   s   zLayerHelper.multiple_inputc                 C   s*   |  |}t|dkrd| j|d S )Nr   z{0} layer only takes one inputr   )r+   lenformatr   )r   r'   r(   r   r   r   r"   9   s   
zLayerHelper.inputc                 C      t | jdd S )N
param_attrr   Z_to_attrr   r   r   r   r   r   r/   ?      zLayerHelper.param_attrc                 C   r.   )N	bias_attrr0   r1   r   r   r   r3   C   r2   zLayerHelper.bias_attrc                 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j|D ]}t	|d ||< q0|}|S )Nr   zparameter number mismatchr   )
r/   r#   r   r,   
ValueErrorsixmovesrangecopydeepcopy)r   lengthr/   tmpir   r   r   multiple_param_attrH   s   

zLayerHelper.multiple_param_attrc                 c   s<    |  |}| t|}t||D ]	\}}||fV  qd S r   )r+   r=   r,   r   )r   r'   r(   Zparam_attrsZiptr/   r   r   r   iter_inputs_and_paramsV   s   
z"LayerHelper.iter_inputs_and_paramsc                 C   sH   |  |}d }|D ]}|d u r|j}q	||jkr!td||jf q	|S )NzData Type mismatch: %d to %d)r+   dtyper4   )r   r'   r(   r?   Zeachr   r   r   input_dtype\   s   

zLayerHelper.input_dtypec                 C   s*   | j  |}t|tstd| |S )Nzno Parameter name %s found)r   Zglobal_blockvarr#   r   r4   )r   r   paramr   r   r   get_parameterg   s   
zLayerHelper.get_parameterr   Nc                 C   sl   t |j|| }| j}|s|S | j|||jdd}| 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shaper?   Zis_biasr?   Zelementwise_add)XYOutZaxistyper(   Zoutputsattrs)r$   rE   r3   Zcreate_parameterr?   "create_variable_for_type_inferencer    )r   	input_varZ	dim_startZdim_endsizer3   br;   r   r   r   append_bias_opn   s$   zLayerHelper.append_bias_opc                 C   s   | j dd }|d u r|S t|tjrd|i}ntt|d d }d| j v r7| j dr7| j d}||d< | j dt dd}|rI||d< |d}t	 rZt
||||}|S | j|jd}| j|d	|gid
|gi|d |S )NactrK   z should be unicode or str	use_cudnn
use_mkldnnZFLAGS_use_mkldnnFrF   rG   rI   rJ   )r   r   r#   r5   string_types	TypeErrorstrr   popr   r   rM   r?   r    )r   rN   rR   rS   rT   Zact_typeresr;   r   r   r   append_activation   s:   

zLayerHelper.append_activationc                 C   s    |d u s
t |du rt S t S )NT)r   r   r
   )r   r?   r   r   r   _get_default_initializer   s   z$LayerHelper._get_default_initializerc                 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#   rV   r   __name__)r   
param_nameclsrB   r   r   r   is_instance   s   

zLayerHelper.is_instance)r"   )r   N)r\   
__module____qualname__r   r    r+   r"   propertyr/   r3   r=   r>   r@   rC   rQ   rZ   r[   r_   __classcell__r   r   r   r   r      s"    







" r   )
__future__r   r8   r5   Z	frameworkr   r   r   r   r    r	   Zpaddle.fluid.initializerr
   r   r/   r   r   Z	six.movesr   Zlayer_helper_baser   Zdygraph_utilsr   r   r   r   r   r   <module>   s   