o
    zi                     @   s@   d dl Z d dlmZ ddlmZmZmZ dZG dd deZdS )    N)	Optimizer   )OptFloatOptLossClosureParams)QHMc                       sd   e Zd ZdZdZ	 					d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 )r   graddirectMbP?        ffffff?paramslrmomentumnuweight_decayweight_decay_typereturnNc           
         s   |dkrt d||dk rt d||dk r!t d||| j| jfvr4|}d|}t ||||||d}	tt| ||	 d S )Nr   zInvalid learning rate: {}zInvalid momentum value: {}zInvalid weight_decay value: {}z#Invalid weight_decay_type value: {})r   r   r   r   r   )
ValueErrorformatGRADDIRECTsuperr   __init__)
selfr   r   r   r   r   r   _typemsgdefaults	__class__ G/home/ubuntu/.local/lib/python3.10/site-packages/torch_optimizer/qhm.pyr   /   s&   	
zQHM.__init__closurec                 C   s   d}|dur	| }| j D ]}|d |d |d }}}|d |d }}|d D ]c}	|	jdu r1q)|	jj}
| j|	 }|dkrV|| jkrL|
j|	j|d	 n
|	jd
||   t|dkrdt	|	j|d< |d }||j|
d
| d	 |	j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   )alphag      ?momentum_buffer)
param_groupsr   datastater   add_mul_lentorch
zeros_like)r   r"   lossgroupr   r   r   r   r   pd_pparam_stater$   r    r    r!   stepN   s2   



zQHM.step)r
   r   r   r   r   )N)__name__
__module____qualname__r   r   r   floatstrr   r   r   r2   __classcell__r    r    r   r!   r   	   s2    $r   )	r+   torch.optim.optimizerr   typesr   r   r   __all__r   r    r    r    r!   <module>   s
    