o
     j                     @   sl   d dl 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 G dd	 d	eZdS )
    N   )unique_name)_append_activation_in_dygraph)	Parameter_global_flagsdtype_is_floatingin_dygraph_mode)LayerHelperBase)	ParamAttrc                       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                    sF   || _ | j dd }|d u rt|| j d< t j| j d |d d S )Nname)
layer_type)kwargsgetr   generatesuper__init__)selfr   r   r   	__class__ Y/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/base/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   sR   | j |g }g }t|ttf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| j d|d S )Nr   z layer only takes one inputr   )r%   lenr   )r   r!   r"   r   r   r   r   8   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_attrr)   r*   r   r   r   r,   B   r+   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|D ]}t|d ||< q.|}|S )Nr   zparameter number mismatchr   )r(   r   r
   r&   
ValueErrorrangecopydeepcopy)r   lengthr(   tmpir   r   r   multiple_param_attrG   s   

zLayerHelper.multiple_param_attrc                 c   s.    |  |}| t|}t||E d H  d S r   )r%   r4   r&   zip)r   r!   r"   Zparam_attrsr   r   r   iter_inputs_and_paramsU   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%   dtyper-   )r   r!   r"   r7   Zeachr   r   r   input_dtypeZ   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   r-   )r   r   paramr   r   r   get_parameterf   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shaper7   Zis_biasr7   Zelementwise_add)XYOutZaxistyper"   Zoutputsattrs)r   r=   r,   Zcreate_parameterr7   "create_variable_for_type_inferencer   )r   	input_varZ	dim_startZdim_endsizer,   br2   r   r   r   append_bias_opm   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< | j dt dd}|rH||d< |d}t rYt||||}|S | j	|j
d}| j|d	|gid
|gi|d |S )NactrC   z should be unicode or str	use_cudnn
use_mkldnnZFLAGS_use_mkldnnFr>   r?   rA   rB   )r   r   r   str	TypeErrorr   popr   r   rE   r7   r   )r   rF   rJ   rK   rL   Zact_typeresr2   r   r   r   append_activation   s:   


zLayerHelper.append_activationc                 C   s,   |d u s
t |du rtjj S tjj S )NT)r   paddlennZinitializerZXavierUniformConstant)r   r7   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   rN   r   __name__)r   
param_nameclsr:   r   r   r   is_instance   s   
zLayerHelper.is_instance)r   )r   N)rV   
__module____qualname__r   r   r%   r   propertyr(   r,   r4   r6   r8   r;   rI   rQ   rU   rY   __classcell__r   r   r   r   r      s"    







 #r   )r/   rR    r   Zdygraph_utilsr   Z	frameworkr   r   r   r   Zlayer_helper_baser	   r(   r
   r   r   r   r   r   <module>   s   