o
    oi2                     @   s   d dl Z d dlmZmZmZmZ d dlZd dlmZ	 d dl
mZ G dd dejj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G dd deZG dd deZdS )    N)IterableLiteralOptionalTuple)Optimizer2Statec                       s~   e Zd ZdZ							ddeejj d	ed
e	eeef dededede
e de
e f fddZe dddZ  ZS )_ReferenceAdEMAMixz4
    Reference: https://hf.co/papers/2409.03137
    MbP?g?g+?gH.?      @:0yE>{Gz?Nparamslrbetasalphaepsweight_decayt_beta3t_alphac	           
   	      s(   t |||||||d}	t ||	 d S )N)r   r   r   r   r   r   r   )dictsuper__init__)
selfr   r   r   r   r   r   r   r   defaults	__class__ O/home/ubuntu/.local/lib/python3.10/site-packages/bitsandbytes/optim/ademamix.pyr      s   z_ReferenceAdEMAMix.__init__c              	   C   sP  d }|d urt   | }W d    n1 sw   Y  | jD ]}d|v r0|d  d7  < nd|d< |d }|d }|d \}}}|d }	|d }
|d }|d	 }|d
 D ]}|jd u r_qW|j}| j| }t|dkr|dg| R |d< t ||d< |d d |d d |d }}}d||d   }d||d   }|
d urt	|d |	 |
 |	}	|d urt
|}t
|}|d | }t	t
|| d| | ||   |}||j|d| d ||j|d| d ||j||d| d | |d  |}|||	|  | }|j||d || |  qWq |S )Nstep   r   r   r   r   r   r   r   r   r      m1_m2nu)r   )valueg      ?)torchenable_gradparam_groupsgradstatelen	new_zerossize
zeros_likeminmathlogexpmul_add_addcmul_sqrtadddiv)r   closurelossgroupr   r   beta1beta2beta3r   r   r   r   pr'   r(   m1m2r"   bias_correction1bias_correction2ln_beta1ln_beta3
step_scaledenomupdater   r   r   r       s\   


$

 1z_ReferenceAdEMAMix.step)r   r	   r
   r   r   NN)N)__name__
__module____qualname____doc__r   r$   nn	Parameterfloatr   r   intr   no_gradr   __classcell__r   r   r   r   r   
   s8    
	r   c                       s   e Zd Z											dd
eejj dedeeeef dede	e
 de	e
 dededed de
def fddZe dd Ze  fddZejfddZ  ZS )AdEMAMixr   r	   r
   Nr   r          Fr   r   r   r   r   r   r   r   
optim_bits   rR   min_8bit_sizeis_pagedc                    s.   t  jd||||||	d |
dd||||d d S )Nademamixd   Tr   r   r   r   r   rT   argsrW   percentile_clipping
block_wiserX   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   rT   rW   rX   r   r   r   r   k   s"   
zAdEMAMix.__init__c           
      C   sF  |  |||}|d dkrtj}n|d dkrtj}n	td|d  | |d k r/tj}| j| }d|d< |tjkrd| jvrF|   | jd 	|j
 | jd< |d	< | jd
 	|j
 | jd
< |d< | }|d t|d  }	tjd|	ftj|j
d|d< tj|	ftj|j
d|d< | j||d|d< | j||d|d< d S )NrT   rR   rV   z(Amount of optimizer bits not supported: rW   r   r   dynamicqmap1udynamicqmap2   r    dtypedeviceabsmax1absmax2)rf   state1state2)
get_configr$   float32uint8NotImplementedErrornumelr(   	name2qmap	fill_qmaptorg   boolzeros_get_state_double_bufferget_state_buffer)
r   r9   r=   gindexpindexconfigrf   r(   nblocksr   r   r   
init_state   s*   


  zAdEMAMix.init_statec                    s
  |  |||}|d d u r|d d u rt |||| d S |j |_|j |_| j| }|j}|d  d7  < |d }|d \}	}
}|d }|d }|d }|d ur_t|| | |}n|}|d urt	|	}t	|}|| }tt
|| d| | ||   |}n|}|d jtjkrtj| j|||d |	|d ||d	 |d
 |
|||d d|d dkr|d nd |d |d d d S |d jtjkrtj| j|||d |d
 |d d |d d |||d ||d	 |d |d |d |d |d d|d d d S d S )Nr   r   r   r   r   r   rj   r   r   rk   r   g      ?	max_unormg        	unorm_vec
skip_zeros)gnorm_scaler   r~   r   r   ra   rc   rh   ri   )r   r   )rl   r   update_stepdata
contiguousr'   r(   r-   r.   r/   r0   rf   r$   rm   Foptimizer_update_32bitoptimizer_namern   optimizer_update_8bit_blockwise)r   r9   r=   rx   ry   rz   r(   r'   r   r:   r;   r<   r   r   r   alpha_trB   rC   rD   beta3_tr   r   r   r      s   


"



zAdEMAMix.update_stepc                 C   sn   | j r	| dk rtjdg| R ||jdS tjdg| R ||jd}t|d | j	j
| |S )Ng     j@r    re   r   )rX   rp   r$   ru   r+   rg   r   	get_pagedfillpage_mngpaged_tensorsappend)r   r=   rf   buffr   r   r   rv     s    z!AdEMAMix._get_state_double_buffer)
r   r	   r
   NNr   r   rR   rS   F)rG   rH   rI   r   r$   rK   rL   rM   r   r   rN   r   rt   r   rO   r}   r   rm   rv   rP   r   r   r   r   rQ   j   sN    
	
 
%TrQ   c                       t   e Zd Z									dd	eejj d
edeeeef dede	e
 de	e
 dedede
def fddZ  ZS )AdEMAMix8bitr   r	   r
   Nr   r   rS   Fr   r   r   r   r   r   r   r   rW   rX   c                    s&   t  j||||||||d|	|
d d S )NrV   
r   r   r   r   r   r   r   rT   rW   rX   r_   r   r   r   r   r   r   r   r   r   rW   rX   r   r   r   r        
zAdEMAMix8bit.__init__	r   r	   r
   NNr   r   rS   FrG   rH   rI   r   r$   rK   rL   rM   r   r   rN   rt   r   rP   r   r   r   r   r     >    
	
r   c                       n   e Zd Z								ddeejj d	ed
eeeef dede	e
 de	e
 dedede
f fddZ  ZS )PagedAdEMAMix8bitr   r	   r
   Nr   r   rS   r   r   r   r   r   r   r   r   rW   c
           
         $   t  j|||||||||	dd
 d S NT)	r   r   r   r   r   r   r   rW   rX   r_   
r   r   r   r   r   r   r   r   r   rW   r   r   r   r   .     
zPagedAdEMAMix8bit.__init__r   r	   r
   NNr   r   rS   rG   rH   rI   r   r$   rK   rL   rM   r   r   rN   r   rP   r   r   r   r   r   -  8    
	
r   c                       sx   e Zd Z									dd	eejj d
edeeeef dede	e
 de	e
 dededed de
f fddZ  ZS )PagedAdEMAMixr   r	   r
   Nr   r   rR   rS   r   r   r   r   r   r   r   r   rT   rU   rW   c                    s&   t  j|||||||||	|
dd d S )NTr   r_   )r   r   r   r   r   r   r   r   r   rT   rW   r   r   r   r   I  r   zPagedAdEMAMix.__init__)	r   r	   r
   NNr   r   rR   rS   )rG   rH   rI   r   r$   rK   rL   rM   r   r   rN   r   r   rP   r   r   r   r   r   H  s>    
	
r   c                       r   )AdEMAMix32bitr   r	   r
   Nr   r   rS   Fr   r   r   r   r   r   r   r   rW   rX   c                    s.   t  jd|||||dd |	dd|
|||d d S )NrY   rR   rZ   Tr[   r_   r   r   r   r   r   f  s"   
zAdEMAMix32bit.__init__r   r   r   r   r   r   r   e  r   r   c                       r   )PagedAdEMAMix32bitr   r	   r
   Nr   r   rS   r   r   r   r   r   r   r   r   rW   c
           
         r   r   r_   r   r   r   r   r     r   zPagedAdEMAMix32bit.__init__r   r   r   r   r   r   r     r   r   )r.   typingr   r   r   r   r$   bitsandbytes.functional
functionalr   bitsandbytes.optim.optimizerr   optim	Optimizerr   rQ   r   r   r   r   r   r   r   r   r   <module>   s    ` '!