o
    3wi2                     @   s   d dl mZ d dlZd dl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 )    )IterableN)LiteralOptional)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__ X/home/ubuntu/sommelier/.venv/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floattupler   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   l   s"   
zAdEMAMix.__init__c                 C   sJ  |  |||}|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|	|  }
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   r8   r<   gindexpindexconfigrf   r'   	blocksize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.   r/   rf   r#   rm   Foptimizer_update_32bitoptimizer_namern   optimizer_update_8bit_blockwise)r   r8   r<   rx   ry   rz   r'   r&   r   r9   r:   r;   r   r   r   alpha_trA   rB   rC   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)rF   rG   rH   r   r#   rJ   rK   rL   rM   r   rN   r   rt   r   rO   r~   r   rm   rv   rP   r   r   r   r   rQ   k   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rF   rG   rH   r   r#   rJ   rK   rL   rM   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   0     
zPagedAdEMAMix8bit.__init__r   r   r	   NNr
   r   rS   rF   rG   rH   r   r#   rJ   rK   rL   rM   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   K  r   zPagedAdEMAMix.__init__)	r   r   r	   NNr
   r   rR   rS   )rF   rG   rH   r   r#   rJ   rK   rL   rM   r   rN   r   r   rP   r   r   r   r   r   J  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   h  s"   
zAdEMAMix32bit.__init__r   r   r   r   r   r   r   g  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   )collections.abcr   r-   typingr   r   r#   bitsandbytes.functional
functionalr   bitsandbytes.optim.optimizerr   optim	Optimizerr   rQ   r   r   r   r   r   r   r   r   r   <module>   s    ` (!