o
    zi.                     @   s<   d dl Z d dlmZ ddlmZmZmZ G dd deZdS )    N)	Optimizer   )OptFloatOptLossClosureParamsc                       sd   e Zd ZdZ						ddeded	ed
ededededdf fddZddedefddZ	  Z
S )PIDa  Implements PID optimization algorithm.

    It has been proposed in `A PID Controller Approach for Stochastic
    Optimization of Deep Networks`__.

    Arguments:
        params: iterable of parameters to optimize or dicts defining
            parameter groups
        lr: learning rate (default: 1e-3)
        momentum: momentum factor (default: 0.0)
        weight_decay: weight decay (L2 penalty) (default: 0.0)
        dampening: dampening for momentum (default: 0.0)
        derivative: D part of the PID (default: 10.0)
        integral: I part of the PID (default: 5.0)

    Example:
        >>> import torch_optimizer as optim
        >>> optimizer = optim.PID(model.parameters(), lr=0.001, momentum=0.1)
        >>> optimizer.zero_grad()
        >>> loss_fn(model(input), target).backward()
        >>> optimizer.step()

    __ http://www4.comp.polyu.edu.hk/~cslzhang/paper/CVPR18_PID.pdf

    Note:
        Reference code: https://github.com/tensorboy/PIDOptimizer
    MbP?        r         @      $@paramslrmomentum	dampeningweight_decayintegral
derivativereturnNc           	         s   t ||||||d}|dkrtd||dk r td||dk r+td||dk r6td||dk rAtd|tt| || d S )N)r   r   r   r   r   r   r	   zInvalid learning rate: {}zInvalid momentum value: {}zInvalid weight_decay value: {}zInvalid PID integral value: {}z Invalid PID derivative value: {})dict
ValueErrorformatsuperr   __init__)	selfr   r   r   r   r   r   r   defaults	__class__ G/home/ubuntu/.local/lib/python3.10/site-packages/torch_optimizer/pid.pyr   $   s.   
zPID.__init__closurec                 C   s  d}|dur	| }| j D ]}|d }|d }|d }|d }|d }|d D ]}	|	jdu r.q&|	jj}
|dkr>|
j|	j|d	 |dkr| j|	 }d
|vr]t|	 }|d
< |||
 n|d
 }||j|
d| d	 d|vrt|	 }|d< |
}t|	 }|d< |||
|  n|d }|d }||j|
| d| d	 |
 | j|	 d< |
j||d	j||d	}
|	jj|
|d  d	 q&q|S )zPerforms a single optimization step.

        Arguments:
            closure: A closure that reevaluates the model and returns the loss.
        Nr   r   r   r   r   r   r   )alphai_bufferr   grad_bufferd_bufferr   )	param_groupsgraddataadd_statetorch
zeros_likemul_clone)r   r   lossgroupr   r   r   r   r   pd_pparam_statei_bufg_bufd_bufr   r   r   stepG   sR   



"zPID.step)r   r	   r   r	   r
   r   )N)__name__
__module____qualname____doc__r   floatr   r   r   r5   __classcell__r   r   r   r   r      s4    	#r   )r)   torch.optim.optimizerr   typesr   r   r   r   r   r   r   r   <module>   s    