o
    h                     @   sd   d dl Z d dlmZ d dlmZ G dd deZG dd deZG dd	 d	eZG d
d deZdS )    N)	Optimizer)Optimizer1Statec                       s0   e Zd Z									d
 fdd		Z  ZS )LARSr   F    N   d   {Gz?c                    s<   |dkrt dt jd||||fd||||	|
|dd d S )Nr   'LARS without momentum is not supported!lars        F	max_unorm
block_wiseNotImplementedErrorsuper__init__)selfparamslrmomentum	dampeningweight_decaynesterov
optim_bitsargsmin_8bit_sizepercentile_clippingr   	__class__ M/var/www/html/ai/venv/lib/python3.10/site-packages/bitsandbytes/optim/lars.pyr      s$   
zLARS.__init__)	r   r   r   Fr   Nr   r   r   __name__
__module____qualname__r   __classcell__r    r    r   r!   r      s    r   c                       .   e Zd Z								d	 fdd	Z  ZS )
LARS8bitr   FNr   r   r   c                    <   |dkrt dt jd||||fd|d|||	|
dd d S )Nr   r	   r
   r      Fr   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r   /   $   
zLARS8bit.__init__r   r   r   FNr   r   r   r"   r    r    r   r!   r(   .       r(   c                       r'   )
	LARS32bitr   FNr   r   r   c                    r)   )Nr   r	   r
   r   r   Fr   r   r+   r   r    r!   r   Q   r,   zLARS32bit.__init__r-   r"   r    r    r   r!   r/   P   r.   r/   c                       sH   e Zd Z						d fdd	Z fddZe dd
dZ  ZS )PytorchLARS{Gz?r   Fr   c           	         s   |dk rt d| |dk rt d| |dk r!t d| t||||||d}|r9|dks5|dkr9t dt || d S )Nr   zInvalid learning rate: zInvalid momentum value: zInvalid weight_decay value: )r   r   r   r   r   r   r   z8Nesterov momentum requires a momentum and zero dampening)
ValueErrordictr   r   )	r   r   r   r   r   r   r   r   defaultsr   r    r!   r   s   s*   
zPytorchLARS.__init__c                    s(   t  | | jD ]}|dd q	d S )Nr   F)r   __setstate__param_groups
setdefault)r   stategroupr   r    r!   r5      s   
zPytorchLARS.__setstate__Nc                 C   s  d}|durt   | }W d   n1 sw   Y  | jD ]}g }g }g }|d }|d }|d }	|d }
|d }|d }|d D ]|}|jdu rLqD| j| }|j}|d	kr_|j||d
}|d	kr|dd}|du ryt | }||d< n|	|j
|d|	 d
 |
r|||  }n|}d}|dkr|jt jksJ t | }t |}||| kr|| | }|j
|| | d
 qDq |S )zPerforms a single optimization step.

        Args:
            closure (callable, optional): A closure that reevaluates the model
                and returns the loss.
        Nr   r   r   r   r   r   r   r   )alphamomentum_buffer   g      ?r   )torchenable_gradr6   gradr8   addgetclonedetachmul_add_dtypefloat32norm)r   closurelossr9   params_with_gradd_p_listmomentum_buffer_listr   r   r   r   r   r   pr8   d_pbufupdateupdate_scalepnormunormr    r    r!   step   sR   





!zPytorchLARS.step)r1   r   r   r   Fr   )N)	r#   r$   r%   r   r5   r=   no_gradrU   r&   r    r    r   r!   r0   r   s    !r0   )	r=   torch.optimr   bitsandbytes.optim.optimizerr   r   r(   r/   r0   r    r    r    r!   <module>   s   #""