o
    "j                     @   s@   d dl Z d dlZd dlmZ ddlmZ g ZG dd deZdS )    N)Adam   )MetaOptimizerBasec                       sn   e Zd Z fddZ fddZdd Zdd Zd	d
 Z				dddZdd Z	dd Z
	dddZ  ZS )LambOptimizerc                    s(   t  | || _d | _g | _g | _d S N)super__init__	inner_optlamb_optZmeta_optimizers_white_listZmeta_optimizers_black_list)self	optimizer	__class__ x/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/distributed/fleet/meta_optimizers/lamb_optimizer.pyr      s
   
zLambOptimizer.__init__c                    s   t  |||| | j}t|tsd S | jj t d dkr"d }n fdd}|}tj	j
|j d |j|j|j|j|j||jd	| _d S )Nexclude_from_weight_decayr   c                    s(    d }|D ]}| j |r dS qdS )Nr   TF)nameendswith)paramZexclude_listr   Zconfigsr   r   
exclude_fn1   s   z1LambOptimizer._set_basic_info.<locals>.exclude_fnlamb_weight_decay)	Zlearning_rater   Zbeta1Zbeta2epsilon
parametersZ	grad_clipZexclude_from_weight_decay_fnr   )r   _set_basic_infor	   
isinstancer   user_defined_strategylamb_configslenpaddler   ZLambZ_learning_rateZ_beta1Z_beta2Z_epsilonZ_parameter_listZ
_grad_clip_namer
   )r   loss
role_makerZuser_defined_optimizerr   optZ_exclude_from_weight_decay_fnr   r   r   r   r   !   s,   
zLambOptimizer._set_basic_infoc                 C   s@   | j jsdS | jjrt| jtstd	| jj
 dS dS dS )NFzGlamb need the inner optimizer to be AdamOptimizer optimizer but got {}.T)r"   Z_is_collectiver   lambr   r	   r   loggingwarnformattype)r   r   r   r   
_can_applyF   s   zLambOptimizer._can_applyc                 C   s   d|_ i |_d S )NFr$   r   )r   dist_strategyr   r   r   _disable_strategyU   s   
zLambOptimizer._disable_strategyc                 C   s   d|_ dg d|_d S )NTg{Gz?)r   r   r*   )r   r+   contextr   r   r   _enable_strategyY   s   zLambOptimizer._enable_strategyNc                 C   s   | j |||||S r   )r
   backward)r   r!   startup_programparameter_listno_grad_set	callbacksr   r   r   r/   `   s   
zLambOptimizer.backwardc                 C   s   | j j|dS )N)params_grads)r
   apply_gradients)r   r4   r   r   r   r5   m   s   zLambOptimizer.apply_gradientsc                 C   s   | j j|||dS )N)r0   r4   )r
   Z_apply_optimize)r   r!   r0   r4   r   r   r   apply_optimizep   s   zLambOptimizer.apply_optimizec                 C   s   | j ||||\}}||fS r   )r
   Zminimize)r   r!   r0   r1   r2   Zoptimize_opsr4   r   r   r   minimize_implu   s   zLambOptimizer.minimize_impl)NNNN)NNN)__name__
__module____qualname__r   r   r)   r,   r.   r/   r5   r6   r7   __classcell__r   r   r   r   r      s    %

r   )r%   r   Zpaddle.optimizerr   Zmeta_optimizer_baser   __all__r   r   r   r   r   <module>   s   