
    o9i                     |    d dl Z d dlmZ d dlmZ  G d de      Z G d de      Z G d d	e      Z G d
 de      Zy)    N)	Optimizer)Optimizer1Statec                   2     e Zd Z	 	 	 	 	 	 	 	 	 d fd	Z xZS )LARSc                 `    |dk(  rt        d      t        | 	  d||||fd||||	|
|d       y )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__s               a/var/www/html/backtest/airagagent/rag_env/lib/python3.12/site-packages/bitsandbytes/optim/lars.pyr   zLARS.__init__   sY     q=%9  	y! 	 	
    )	r   r   r   F    N   d   {Gz?__name__
__module____qualname__r   __classcell__r   s   @r   r   r      s*    
 
 
r   r   c                   0     e Zd Z	 	 	 	 	 	 	 	 d fd	Z xZS )LARS8bitc                 `    |dk(  rt        d      t        | 	  d||||fd|d|||	|
d       y )Nr   r   r	   r
      Fr   r   r   r   r   r   r   r   r   r   r   r   r   r   s              r   r   zLARS8bit.__init__/   sY     q=%9  	y! 	 	
r   r   r   r   FNr!   r"   r#   r$   r)   s   @r   r+   r+   .   '    
 
 
r   r+   c                   0     e Zd Z	 	 	 	 	 	 	 	 d fd	Z xZS )	LARS32bitc                 `    |dk(  rt        d      t        | 	  d||||fd|d|||	|
d       y )Nr   r   r	   r
   r    Fr   r   r.   s              r   r   zLARS32bit.__init__Q   sY     q=%9  	y! 	 	
r   r/   r$   r)   s   @r   r2   r2   P   r0   r   r2   c                   f     e Zd Z	 	 	 	 	 	 d fd	Z fdZ ej                         dd       Z xZS )PytorchLARSc                     |dk  rt        d|       |dk  rt        d|       |dk  rt        d|       t        ||||||      }|r|dk  s|dk7  rt        d      t        	|   ||       y )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   s
            r   r   zPytorchLARS.__init__s   s     86rd;<<c>7zBCC#.|n=  %
 Q)q.J  	*r   c                 j    t         |   |       | j                  D ]  }|j                  dd        y )Nr   F)r   __setstate__param_groups
setdefault)r   stategroupr   s      r   r;   zPytorchLARS.__setstate__   s5    U#&& 	0EZ/	0r   c                 h   d}|$t        j                         5   |       }ddd       | j                  D ]l  }g }g }g }|d   }|d   }|d   }	|d   }
|d   }|d   }|d   D ]<  }|j                  | j                  |   }|j                  }|d	k7  r|j                  ||
      }|d	k7  ro|j                  dd      }|)t        j                  |      j                         }||d<   n%|j                  |      j                  |d|	z
  
       |
r	|||z  z   }n|}d}|dkD  rg|j                  t         j                  k(  sJ t        j                  |j                               }t        j                        }|||z  kD  r||z  |z  }|j                  | |z  
       ? o |S # 1 sw Y   xY w)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_gradr<   gradr>   addgetclonedetachmul_add_dtypefloat32norm)r   closurelossr?   params_with_gradd_p_listmomentum_buffer_listr   r   r   r   r   r   pr>   d_pbufupdateupdate_scalepnormunorms                        r   stepzPytorchLARS.step   s    ""$ !y! && *	9E!H#%  0LZ(Hk*IZ(Hk*ItB8_ 966>

1ff1$''!<'8Cq=))$5t<C{#kk#.55736/0*//1y=/I!$sX~!5!$"s?77emm333!JJqxxz2E!JJv.Ey500'05'85'@vbS<%78?9*	9X _! !s   F''F1)g{Gz?r   r   r   Fr#   )N)	r%   r&   r'   r   r;   rD   no_gradr\   r(   r)   s   @r   r5   r5   r   s>     +B0
 U]]_8 8r   r5   )	rD   torch.optimr   bitsandbytes.optim.optimizerr   r   r+   r2   r5    r   r   <module>ra      sE   
  ! 8 
?  
F
 
D
 
D`) `r   