Ë
    éÓ^jì  ã            $       ó  — d 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	 dej                  dej                  d	ej                  d
ej                  dededededej                  dedededededededeeef   def$d„Z G d„ de«      Zy)aÉ   PyTorch MARS Optimizer

Code simplified from https://github.com/AGI-Arena/MARS

Paper: MARS: Unleashing the Power of Variance Reduction for Training Large Models - https://arxiv.org/abs/2411.10438

@article{yuan2024mars,
  title={MARS: Unleashing the Power of Variance Reduction for Training Large Models},
  author={Yuan, Huizhuo and Liu, Yifeng and Wu, Shuang and Zhou, Xun and Gu, Quanquan},
  journal={arXiv preprint arXiv:2411.10438},
  year={2024}
}
é    N)ÚOptionalÚTuple)Ú	Optimizeré   )ÚParamsTÚpÚgradÚexp_avgÚ
exp_avg_sqÚlrÚweight_decayÚbeta1Úbeta2Ú	last_gradÚepsÚstepÚgammaÚ	mars_typeÚ
is_grad_2dÚoptimize_1dÚlr_1d_factorÚbetas_1dÚcautionc                 ól  — |s|�r�d|z
  }|
dk(  r|}nH||z
  j                  |||z  z  «      j                  |«      }t        j                  |«      }|dkD  r||z  }|j                  |«      j                  ||¬«       |rU||z  dkD  j	                  |j
                  «      }|j                  |j                  «       j                  d¬«      «       ||z  }|dk(  r†|j                  |«      j                  ||d|z
  ¬«       d||
z  z
  }d||
z  z
  }|j                  «       t        j                  |«      z  j                  |	«      }| |z  ||z  j                  |«      z   }n|d	k(  r| |z  |j                  «       z   }nJ ‚| j                  || ¬«       ||fS |\  }}|j                  |«      j                  |d|z
  ¬«       |j                  |«      j                  ||d|z
  ¬«       d||
z  z
  }d||
z  z
  }|j                  «       t        j                  |«      z  j                  |	«      }|rU||z  dkD  j	                  |j
                  «      }|j                  |j                  «       j                  d¬«      «       ||z  }| |z  ||z  j                  |«      z   }| j                  |||z   ¬«       ||fS )
Nç      ð?r   )Úalphar   gü©ñÒMbP?)ÚminÚadamw)ÚvalueÚlion)Úmul_Úadd_ÚtorchÚnormÚtoÚdtypeÚdiv_ÚmeanÚclamp_Úaddcmul_ÚsqrtÚmathÚsign)r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Úone_minus_beta1Úc_tÚc_t_normÚmaskÚbias_correction1Úbias_correction2ÚdenomÚupdateÚbeta1_1dÚbeta2_1ds                               úZ/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/optim/mars.pyÚ_mars_single_tensor_stepr9      sº  € ñ* ’jØ˜u™*ˆØ�1Š9à‰Cà˜)Ñ#×)Ñ)¨%°5¸?Ñ3JÑ*KÓL×QÑQÐRVÓWˆCÜ—z‘z #“ˆHØ˜"Š}Ø˜H‘n�Ø�‰�UÓ× Ñ  ¨OÐ Ô<áà˜d‘N QÑ&×*Ñ*¨4¯:©:Ó6ˆDØ�I‰I�d—i‘i“k×(Ñ(¨TÐ(Ó2Ô3Ø ‘nˆGà˜ÒØ�O‰O˜EÓ"×+Ñ+¨C°¸BÀ¹JÐ+ÔGØ" U¨d¡]Ñ2ÐØ" U¨d¡]Ñ2ÐØ—_‘_Ó&¬¯©Ð3CÓ)DÑD×JÑJÈ3ÓOˆEØ˜Ñ%¨Ð3CÑ)C×(IÑ(IÈ%Ó(PÑP‰FØ˜&Ò Ø˜Ñ%¨¯©«Ñ6‰Fà�5Ø	�‰ˆv˜b˜SˆÔ!ð �JÐÐð &Ñˆ�(Ø�‰�XÓ×#Ñ# D°°X±Ð#Ô>Ø�‰˜Ó!×*Ñ*¨4°¸RÀ(¹]Ð*ÔKØ ¨TÑ!1Ñ1ÐØ ¨TÑ!1Ñ1ÐØ—‘Ó"¤T§Y¡YÐ/?Ó%@Ñ@×FÑFÀsÓKˆÙØ˜d‘N QÑ&×*Ñ*¨4¯:©:Ó6ˆDØ�I‰I�d—i‘i“k×(Ñ(¨TÐ(Ó2Ô3Ø ‘nˆGØ�\Ñ! WÐ/?Ñ%?×$EÑ$EÀeÓ$LÑLˆØ	�‰ˆv˜r LÑ0Ð1ˆÔ2Ø�JÐÐó    c                   óº   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 ddededeeef   dedededed	ed
ede	eeef      defˆ fd„Z
ˆ fd„Z ej                  «       dd„«       Zˆ xZS )ÚMarsz• MARS Optimizer

    Paper: MARS: Unleashing the Power of Variance Reduction for Training Large Models
        https://arxiv.org/abs/2411.10438

    Úparamsr   Úbetasr   r   r   r   r   r   r   r   c                 ó¦  •— d|k  st        dj                  |«      «      ‚d|k  st        dj                  |«      «      ‚d|d   cxk  rdk  sn t        dj                  |d   «      «      ‚d|d   cxk  rdk  sn t        dj                  |d   «      «      ‚|d	v sJ d
«       ‚t        ||||||||	|
xs ||¬«
      }t        t        | �  ||«       y )Nç        zInvalid learning rate: {}zInvalid epsilon value: {}r   r   z%Invalid beta parameter at index 0: {}r   z%Invalid beta parameter at index 1: {})r   r    zMARS type not supported)
r   r>   r   r   r   r   r   r   r   r   )Ú
ValueErrorÚformatÚdictÚsuperr<   Ú__init__)Úselfr=   r   r>   r   r   r   r   r   r   r   r   ÚdefaultsÚ	__class__s                €r8   rE   zMars.__init__b   sð   ø€ ð �bŠyÜÐ8×?Ñ?ÀÓCÓDÐDØ�cŠzÜÐ8×?Ñ?ÀÓDÓEÐEØ�e˜A‘hÔ$ Ô$ÜÐD×KÑKÈEÐRSÉHÓUÓVÐVØ�e˜A‘hÔ$ Ô$ÜÐD×KÑKÈEÐRSÉHÓUÓVÐVØÐ-Ñ-ÐHÐ/HÓHÐ-äØØØØ%ØØØ#Ø%ØÒ& Øô
ˆô 	Œd�DÑ" 6¨8Õ4r:   c                 ór   •— t         t        | �  |«       | j                  D ]  }|j	                  dd«       Œ y )Nr   F)rD   r<   Ú__setstate__Úparam_groupsÚ
setdefault)rF   ÚstateÚgrouprH   s      €r8   rJ   zMars.__setstate__ˆ   s7   ø€ ÜŒd�DÑ& uÔ-Ø×&Ñ&ò 	/ˆEØ×Ñ˜Y¨Õ.ñ	/r:   c                 óÔ  — d}|�$t        j                  «       5   |«       }ddd«       | j                  D �]"  }|d   D �]  }|j                  €Œ|j                  }|j                  rt        d«      ‚| j                  |   }t        |«      dk  rMd|d<   t        j                  |«      |d<   t        j                  |«      |d<   t        j                  |«      |d	<   |dxx   dz  cc<   |d   }|d   }|d	   }	|d   }
|d
   }|d   }|d   \  }}|j                  dk\  }t        ||||	|||||
|d   ||d   |d   ||d   |d   |d   |d   ¬«       ||d<   �Œ �Œ% |S # 1 sw Y   �Œ>xY w)z¶Performs a single optimization step.

        Arguments:
            closure (callable, optional): A closure that reevaluates the model
                and returns the loss.
        Nr=   zJAdam does not support sparse gradients, please consider SparseAdam insteadr   r   r   r
   r   r   r   r   r>   é   r   r   r   r   r   r   r   )r   r   r   r   r   r   )r#   Úenable_gradrK   r	   Ú	is_sparseÚRuntimeErrorrM   ÚlenÚ
zeros_likeÚndimr9   )rF   ÚclosureÚlossrN   r   r	   rM   r   r
   r   r   r   Úwdr   r   r   s                   r8   r   z	Mars.step�   sÂ  € ð ˆØÐÜ×"Ñ"Ó$ñ !Ù“y�÷!ð ×&Ñ&ó 3	*ˆEØ˜8‘_ó 2*�Ø—6‘6�>ØØ—v‘v�Ø—>’>Ü&Ð'sÓtÐtàŸ
™
 1™�ä�u“: ’?Ø$%�E˜&‘Mä',×'7Ñ'7¸Ó':�E˜)Ñ$ä).×)9Ñ)9¸!Ó)<�E˜+Ñ&ä*/×*:Ñ*:¸1Ó*=�E˜,Ñ'à�f“ Ñ"“Ø˜V‘}�Ø 	Ñ*�Ø" <Ñ0�
Ø! +Ñ.�	Ø˜4‘[�Ø˜>Ñ*�Ø$ W™~‘��uØ!ŸY™Y¨!™^�
ô )ØØØØØØØØØØ˜%‘LØØ˜'‘NØ# KÑ0Ø)Ø % mÑ 4Ø!& ~Ñ!6Ø" :Ñ.Ø! )Ñ,õ%ð* &*��kÓ"òe2*ð3	*ðj ˆ÷q!ñ !ús   ™EÅE')
gú~j¼t“h?)gÍÌÌÌÌÌì?g®Gáz®ï?g:Œ0âŽyE>r@   gš™™™™™™?r   Fr   NF)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úfloatr   ÚstrÚboolr   rE   rJ   r#   Úno_gradr   Ú__classcell__)rH   s   @r8   r<   r<   [   sÔ   ø„ ñð Ø)4ØØ"$Ø Ø$Ø %Ø"%Ø6:Ø!ñ$5àð$5ð ð$5ð ˜ ˜Ñ&ð	$5ð
 ð$5ð  ð$5ð ð$5ð ð$5ð ð$5ð  ð$5ð ˜u U¨E \Ñ2Ñ3ð$5ð õ$5ôL/ð
 €U‡]�]ƒ_òAó ôAr:   r<   )r]   r,   Útypingr   r   r#   Útorch.optim.optimizerr   Ú_typesr   ÚTensorr^   Úintr_   r`   r9   r<   © r:   r8   ú<module>ri      sü   ðñó ß "ã Ý +å ð?Ø�<‰<ð?à�l‰lð?ð —‘ð?ð —L‘Lð	?ð
 ð?ð ð?ð ð?ð ð?ð —<‘<ð?ð ð?ð ð?ð ð?ð ð?ð ð?ð ð?ð  ð!?ð" ˜˜u˜Ñ%ð#?ð$ ó%?ôDtˆ9õ tr:   