o
    "ja2                     @   s   d dl Z d dl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mZmZ dd	lmZ dd
lmZmZ G dd deZG dd dZG dd dZdS )    N)defaultdict)not_to_static	to_static)StaticFunction)as_not_paddle_func)Layer)	Parameterglobal_scopeprogram_guard   )	Converter)
get_loggerto_listc                       s   e Zd ZdZ fddZdd Zdd Zdd	 Zed
d Z	dd Z
dd Zd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  ZS ) 
ProxyLayerz
    ProxyLayer implements all logic for converting dygraph model into
    static Program IR. Meanwhile, it provides conviential interfaces for
    auto parallel to visit feed/fetch/loss/metric variables.
    c                    sl   t    || _|| _|| _d | _tt| _tt| _	tt| _
tt| _tt| _tttjd  d S )Nz.ProxyLayer)super__init__inner_layer	loss_funcmetricsmoder   list_input_vars_label_vars_output_vars
_loss_vars_metric_varsr   inspect	getmoduler   __name__)selflayerr   r   	__class__ o/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/distributed/auto_parallel/static/helper.pyr   $   s   





zProxyLayer.__init__c                 C   Z   d}|| j |< || j|< | j| | j|< | | j|}| || j|< | || j	|< dS )zN
        Train process of inner_layer with forward/loss/metric logic.
        trainN
r   r   r   r   _prepareoutput_vars	call_lossr   call_metricsr   r   inputslabelsr   Z
new_inputsr#   r#   r$   _train:   s   

zProxyLayer._trainc                 C   r%   )zQ
        Evaluate process of inner_layer with forward/loss/metric logic.
        evalNr'   r,   r#   r#   r$   _evalM   s   

zProxyLayer._evalc                 C   s,   d}|| j |< || j|< | j| | j|< dS )zD
        Predict process of inner_layer with forward logic.
        predictN)r   r   r   r   )r   r-   r.   r   r#   r#   r$   _predictc   s   

zProxyLayer._predictc                 C   s   t |t | S )z}
        Concat outputs and labels as a single list

        NOTE(dev): We use @not_to_static to avoid AST Analysis.
        )r   )r   Zoutputsr.   r#   r#   r$   r(   o   s   zProxyLayer._preparec                 C   s   g }| j dur| j | }|S )z
        Apply Loss Function on outputs and labels.

        Args:
            inputs: List[Variable]

        Returns: List[Variable]
        N)r   )r   r-   resr#   r#   r$   r*   x   s   	

zProxyLayer.call_lossc                 C   s(   g }| j D ]}|t|j|  q|S )z
        Apply Metrics Function on outputs and labels.

        Args:
            inputs: List[Variable]

        Returns: List[Variable]
        )r   appendr   Zcompute)r   r-   ZoutsZmetricr#   r#   r$   r+      s   	
zProxyLayer.call_metricsc                 C   s   || _ |dk| _d S )Nr&   )r   Ztrainingr   r   r#   r#   r$   set_mode   s   zProxyLayer.set_modec                 C   s   t | j| j| jS N)r   r   r   r   r   r#   r#   r$   clone   s   zProxyLayer.clonec                 C      | j | j S r8   )r   r   r9   r#   r#   r$   
input_vars      zProxyLayer.input_varsc                 C   r;   r8   )r   r   r9   r#   r#   r$   
label_vars   r=   zProxyLayer.label_varsc                 C   r;   r8   )r   r   r9   r#   r#   r$   r)      r=   zProxyLayer.output_varsc                 C   r;   r8   )r   r   r9   r#   r#   r$   	loss_vars   r=   zProxyLayer.loss_varsc                 C   r;   r8   )r   r   r9   r#   r#   r$   metric_vars   r=   zProxyLayer.metric_varsc                 C   s
   | j  S r8   )r   Z_startup_programr9   r#   r#   r$   startup_program      
zProxyLayer.startup_program)r   
__module____qualname____doc__r   r/   r1   r3   r   r(   r*   r+   r7   r:   propertyr<   r>   r)   r?   r@   rA   __classcell__r#   r#   r!   r$   r      s0    





r   c                   @   s.   e Zd Zdd ZdddZdd Zdd	 Zd
S )	BuildInfoc                 C   s   |    d S r8   )clearr9   r#   r#   r$   r      s   zBuildInfo.__init__Fc                 C   s   | j | }|r| | |S r8   )statescache)r   r   updateZis_cacher#   r#   r$   	has_cache   s   

zBuildInfo.has_cachec                 C   s   d| j |< d S )NT)rJ   r6   r#   r#   r$   rK         zBuildInfo.cachec                 C   s   t t| _d S r8   )r   boolrJ   r9   r#   r#   r$   rI      rN   zBuildInfo.clearN)F)r   rC   rD   r   rM   rK   rI   r#   r#   r#   r$   rH      s
    
rH   c                   @   s   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
d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ed d! Zed"d# Zd$d% Zd&S )'ProgramHelperz`
    A Helper class for Engine to provides different Program IR according specified 'mode'.
    c                 C   s8   t |||| _|| _|| _t | _ttj| _	d| _
d S )NF)r   proxy_layerinputs_speclabels_specrH   
build_infor   loggingINFO_logger	lazy_init)r   r    r   r   rR   rS   r#   r#   r$   r      s   
zProgramHelper.__init__c                 C   s   | j   | j | _dS )z4
        Reset all state of current Object.
        N)rT   rI   rQ   r:   r9   r#   r#   r$   reset   s   
zProgramHelper.resetc                 C   s   |dv sJ | j | | j|dr| jd|  dS | jd|  | j| jg}t| 	 |dd}d| }t
| j || t| j |j |   dS )z?
        Convert dygraph model into static Program IR.
        r&   r0   r2   Tz9Already build program with mode = %s, use cached program.Nz%start to build program for mode = %s.)
input_specZ
full_graph_)rQ   r7   rT   rM   rW   inforR   rS   r   static_funcsetattrgetattrconcrete_program_build_startup_program)r   r   r[   r^   	func_namer#   r#   r$   build_program   s$   
zProgramHelper.build_programc              
   C   sV   t | j jdkrd| _dS | jjD ]}t|j||j	|j
|j|j| j d qdS )zB
        Create and Sync parameters into startup program.
        r   TN)namedesctypeshapedtypestop_gradientblock)lenrA   global_blockopsrX   ra   
parametersr   re   rg   rh   ri   rj   )r   paramr#   r#   r$   rb      s   z$ProgramHelper._build_startup_programc                 C   sr   |  | | jdt|j |j}d|_t| j| j |	| j
d }W d   n1 s/w   Y  ||_|S )zD
        Append backward and generate optimizer operations.
        zstart to apply optimizer: %s Nr   )_verify_optimizerrW   r]   rg   r   Z_parameter_listr
   main_programrA   minimizer?   )r   	optimizerZoriginal_paramsr4   r#   r#   r$   apply_optimizer  s   

zProgramHelper.apply_optimizerc                 C   s^   |d usJ t |dsJ d| jjdksJ d| jj t| jdks-J dt| j d S )Nrs   z&Optimizer must have minimize() method.r&   z+Required mode == 'train', but received '%s'r   z>Required len(loss_vars) == 1, but received len(loss_vars) = %s)hasattrrQ   r   rl   r?   )r   rt   r#   r#   r$   rq     s    zProgramHelper._verify_optimizerc                 C   s>   |dv sJ t | jd| }t|tsJ d| j| dS )zC
        Switch underly proxy layer mode into target mode.
        rZ   r\   (Please call build_program(mode) firstly.N)r`   rQ   
isinstancer   r7   )r   r   funcr#   r#   r$   to-  s   zProgramHelper.toc                 C   s,   | j jdv s
J dd| j j }t| j |S )zJ
        Return StaticFunction instance with underly target mode.
        rZ   rw   r\   )rQ   r   r`   )r   rc   r#   r#   r$   r^   8  s
   zProgramHelper.static_funcc                 C   s   | j rd S | jjD ]U}|j| jvrq	| rH| j|j }||}|j|j	j
|j	jd}t |j }t| |}	||	| q	| r^t |j }
|
|   q	d S )N)dims_mappingZprocess_shapeZprocess_group)rX   ra   ro   re   rm   varsZis_denseZ get_tensor_dist_attr_for_programr{   Zprocess_meshrh   Zprocess_idsr	   varZ
get_tensorr   Zslice_with_dist_attrnumpysetZis_distZ_share_data_with)r   rr   ZplaceZdist_contextrp   r}   Zvar_dist_attrZ	dist_attrZparam_tensorZsliced_paramZdense_tensorr#   r#   r$   initD  s0   zProgramHelper.initc                 C   s
   |   jS r8   )r^   ra   r9   r#   r#   r$   ra   a  rB   zProgramHelper.concrete_programc                 C   s   | j jS r8   )ra   rr   r9   r#   r#   r$   rr   e  s   zProgramHelper.main_programc              
   C   sR   z| j jW S  ty( } z| jd t|tr"| jjW  Y d }~S |d }~ww )Nz`lazy init` failed.)rQ   rA   	ExceptionrW   warningrx   AssertionErrorra   )r   errr#   r#   r$   rA   i  s   

zProgramHelper.startup_programc                 C      t | jjS r8   )r   rQ   r<   r9   r#   r#   r$   r<   s  r=   zProgramHelper.input_varsc                 C   r   r8   )r   rQ   r)   r9   r#   r#   r$   r)   w  r=   zProgramHelper.output_varsc                 C   r   r8   )r   rQ   r>   r9   r#   r#   r$   r>   {  r=   zProgramHelper.label_varsc                 C   r   r8   )r   rQ   r?   r9   r#   r#   r$   r?     r=   zProgramHelper.loss_varsc                 C   r   r8   )r   rQ   r@   r9   r#   r#   r$   r@     r=   zProgramHelper.metric_varsc                 C   s,   |   }|| j| jd }dd |jD S )Nc                 S   s   i | ]}|j |qS r#   )re   ).0rp   r#   r#   r$   
<dictcomp>  s    z2ProgramHelper.named_parameters.<locals>.<dictcomp>)r^   Zget_concrete_programrR   rS   _params)r   r^   Zpartial_programr#   r#   r$   named_parameters  s   zProgramHelper.named_parametersN)r   rC   rD   rE   r   rY   rd   rb   ru   rq   rz   r^   r   rF   ra   rr   rA   r<   r)   r>   r?   r@   r   r#   r#   r#   r$   rP      s8    


	




rP   )r   rU   collectionsr   Z
paddle.jitr   r   Z'paddle.jit.dy2static.program_translatorr   Zpaddle.jit.dy2static.utilsr   Z	paddle.nnr   Zpaddle.staticr   r	   r
   	converterr   utilsr   r   r   rH   rP   r#   r#   r#   r$   <module>   s    