Ë
    éÓ^j<  ã                   óN   — d Z ddlZ G d„ dej                  j                  «      Zy)z› AdaHessian Optimizer

Lifted from https://github.com/davda54/ada-hessian/blob/master/ada_hessian.py
Originally licensed MIT, Copyright 2020, David Samuel
é    Nc                   ó®   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 dˆ fd„	Zed„ «       Zd„ Zd„ Z e	j                  «       d„ «       Z e	j                  «       d	d„«       Zˆ xZS )
Ú
Adahessianaî  
    Implements the AdaHessian algorithm from "ADAHESSIAN: An Adaptive Second OrderOptimizer for Machine Learning"

    Arguments:
        params (iterable): iterable of parameters to optimize or dicts defining parameter groups
        lr (float, optional): learning rate (default: 0.1)
        betas ((float, float), optional): coefficients used for computing running averages of gradient and the
            squared hessian trace (default: (0.9, 0.999))
        eps (float, optional): term added to the denominator to improve numerical stability (default: 1e-8)
        weight_decay (float, optional): weight decay (L2 penalty) (default: 0.0)
        hessian_power (float, optional): exponent of the hessian trace (default: 1.0)
        update_each (int, optional): compute the hessian trace approximation only after *this* number of steps
            (to save time) (default: 1)
        n_samples (int, optional): how many times to sample `z` for the approximation of the hessian trace (default: 1)
    c
                 óL  •— d|k  st        d|› �«      ‚d|k  st        d|› �«      ‚d|d   cxk  rdk  sn t        d|d   › �«      ‚d|d   cxk  rdk  sn t        d|d   › �«      ‚d|cxk  rdk  sn t        d	|› �«      ‚|| _        || _        |	| _        d
| _        t        j                  «       j                  | j                  «      | _        t        |||||¬«      }
t        t        | �3  ||
«       | j                  «       D ]  }d|_        d| j                  |   d<   Œ y )Nç        zInvalid learning rate: zInvalid epsilon value: r   ç      ð?z#Invalid beta parameter at index 0: é   z#Invalid beta parameter at index 1: zInvalid Hessian power value: iÿÿÿ)ÚlrÚbetasÚepsÚweight_decayÚhessian_powerúhessian step)Ú
ValueErrorÚ	n_samplesÚupdate_eachÚavg_conv_kernelÚseedÚtorchÚ	GeneratorÚmanual_seedÚ	generatorÚdictÚsuperr   Ú__init__Ú
get_paramsÚhessÚstate)ÚselfÚparamsr	   r
   r   r   r   r   r   r   ÚdefaultsÚpÚ	__class__s               €ú`/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/optim/adahessian.pyr   zAdahessian.__init__   sA  ø€ ð �bŠyÜÐ6°r°dÐ;Ó<Ð<Ø�cŠzÜÐ6°s°eÐ<Ó=Ð=Ø�e˜A‘hÔ$ Ô$ÜÐBÀ5ÈÁ8À*ÐMÓNÐNØ�e˜A‘hÔ$ Ô$ÜÐBÀ5ÈÁ8À*ÐMÓNÐNØ�mÔ* sÔ*ÜÐ<¸]¸OÐLÓMÐMà"ˆŒØ&ˆÔØ.ˆÔð ˆŒ	ÜŸ™Ó*×6Ñ6°t·y±yÓAˆŒäØØØØ%Ø'ô
ˆô 	Œj˜$Ñ(¨°Ô:à—‘Ó"ò 	.ˆAØˆAŒFØ,-ˆD�J‰J�q‰M˜.Ò)ñ	.ó    c                  ó   — y)NT© ©r   s    r#   Úis_second_orderzAdahessian.is_second_orderF   s   € àr$   c                 ó(   — d„ | j                   D «       S )zH
        Gets all parameters in all param_groups with gradients
        c              3   óN   K  — | ]  }|d    D ]  }|j                   sŒ|–— Œ Œ y­w)r   N)Úrequires_grad)Ú.0Úgroupr!   s      r#   ú	<genexpr>z(Adahessian.get_params.<locals>.<genexpr>O   s&   è ø€ Ò]�e¸%À¹/Ò]°QÈQÏ_Ë_”Ð]�Ñ]ùs   ‚%œ	%)Úparam_groupsr'   s    r#   r   zAdahessian.get_paramsJ   s   € ñ
 ^˜t×0Ñ0Ô]Ð]r$   c                 óÞ   — | j                  «       D ]Z  }t        |j                  t        «      rŒ| j                  |   d   | j
                  z  dk(  sŒA|j                  j                  «        Œ\ y)z;
        Zeros out the accumulated hessian traces.
        r   r   N)r   Ú
isinstancer   Úfloatr   r   Úzero_)r   r!   s     r#   Úzero_hessianzAdahessian.zero_hessianQ   sV   € ð
 —‘Ó"ò 	ˆAÜ˜aŸf™f¤eÕ,°·±¸A±¸~Ñ1NÐQU×QaÑQaÑ1aÐefÓ1fØ—‘—‘•ñ	r$   c                 óÂ  — g }t        d„ | j                  «       «      D ]O  }| j                  |   d   | j                  z  dk(  r|j	                  |«       | j                  |   dxx   dz  cc<   ŒQ t        |«      dk(  ry| j                  j                  |d   j                  k7  r@t        j                  |d   j                  «      j                  | j                  «      | _        |D �cg c]  }|j                  ‘Œ }}t        | j                  «      D ]À  }|D �cg c]D  }t        j                  dd|j!                  «       | j                  |j                  ¬«      dz  d	z
  ‘ŒF }}t        j"                  j                  |||d
|| j                  dz
  k  ¬«      }t%        |||«      D ]+  \  }}}|xj&                  ||z  | j                  z  z  c_        Œ- ŒÂ yc c}w c c}w )z}
        Computes the Hutchinson approximation of the hessian trace and accumulates it for each trainable parameter.
        c                 ó   — | j                   d uS ©N)Úgrad)r!   s    r#   ú<lambda>z(Adahessian.set_hessian.<locals>.<lambda>a   s   €  !§&¡&°Ð"4€ r$   r   r   r   Né   )r   Údeviceg       @r   T)Úgrad_outputsÚonly_inputsÚretain_graph)Úfilterr   r   r   ÚappendÚlenr   r;   r   r   r   r   r8   Úranger   ÚrandintÚsizeÚautogradÚzipr   )	r   r   r!   ÚgradsÚiÚzsÚh_zsÚh_zÚzs	            r#   Úset_hessianzAdahessian.set_hessianZ   s­  € ð ˆÜÑ4°d·o±oÓ6GÓHò 	/ˆAØ�z‰z˜!‰}˜^Ñ,¨t×/?Ñ/?Ñ?À1ÒDØ—‘˜aÔ Ø�J‰J�q‰M˜.Ó)¨QÑ.Ô)ð	/ô
 ˆv‹;˜!ÒØà�>‰>× Ñ  F¨1¡I×$4Ñ$4Ò4Ü"Ÿ_™_¨V°A©Y×-=Ñ-=Ó>×JÑJÈ4Ï9É9ÓUˆDŒNà!'Ö(˜A�—“Ð(ˆÐ(ä�t—~‘~Ó&ò 	3ˆAàpvÖwÐkl”%—-‘-  1 a§f¡f£h¸$¿.¹.ÐQR×QYÑQYÔZÐ]`Ñ`ÐcfÓfÐwˆBÐwÜ—>‘>×&Ñ&Ø�v¨B¸DÈqÐSW×SaÑSaÐdeÑSeÑOeð 'ó gˆDä   r¨6Ó2ò 3‘	��Q˜Ø—’˜# ™' D§N¡NÑ2Ñ2–ñ3ñ	3ùò )ùò xs   Ã)GÄA	Gc                 óv  — d}|� |«       }| j                  «        | j                  «        | j                  D �]ý  }|d   D �]ñ  }|j                  �|j                  €Œ| j
                  rq|j                  «       dk(  r^t        j                  |j                  «      j                  ddgd¬«      j                  |j                  «      j                  «       |_        |j                  d|d	   |d
   z  z
  «       | j                  |   }t        |«      dk(  r5d|d<   t        j                  |«      |d<   t        j                  |«      |d<   |d   |d   }}|d   \  }}	|dxx   dz  cc<   |j                  |«      j!                  |j                  d|z
  ¬«       |j                  |	«      j#                  |j                  |j                  d|	z
  ¬«       d||d   z  z
  }
d|	|d   z  z
  }|d   }||z  j%                  |dz  «      j!                  |d   «      }|d	   |
z  }|j'                  ||| ¬«       �Œô �Œ  |S )z¿
        Performs a single optimization step.
        Arguments:
            closure (callable, optional) -- a closure that reevaluates the model and returns the loss (default: None)
        Nr   é   r:   é   T)ÚdimÚkeepdimr   r	   r   r   ÚstepÚexp_avgÚexp_hessian_diag_sqr
   )Úalpha)Úvaluer   r   )r4   rM   r/   r8   r   r   rQ   r   ÚabsÚmeanÚ	expand_asÚcloneÚmul_r   rA   Ú
zeros_likeÚadd_Úaddcmul_Úpow_Úaddcdiv_)r   ÚclosureÚlossr-   r!   r   rT   rU   Úbeta1Úbeta2Úbias_correction1Úbias_correction2ÚkÚdenomÚ	step_sizes                  r#   rS   zAdahessian.stepv   s@  € ð ˆØÐÙ“9ˆDà×ÑÔØ×ÑÔà×&Ñ&ó %	=ˆEØ˜8‘_ó $=�Ø—6‘6�> Q§V¡V ^Øà×'Ò'¨A¯E©E«G°qªLÜ"ŸY™Y q§v¡vÓ.×3Ñ3¸¸A¸ÈÐ3ÓM×WÑWÐXY×X^ÑX^Ó_×eÑeÓg�A”Fð —‘�q˜5 ™;¨¨~Ñ)>Ñ>Ñ>Ô?àŸ
™
 1™�ô �u“: ’?Ø$%�E˜&‘Mä',×'7Ñ'7¸Ó':�E˜)Ñ$ä38×3CÑ3CÀAÓ3F�EÐ/Ñ0à/4°YÑ/?ÀÐG\ÑA]Ð,�Ø$ W™~‘��uØ�f“ Ñ"“ð —‘˜UÓ#×(Ñ(¨¯©°q¸5±yÐ(ÔAØ#×(Ñ(¨Ó/×8Ñ8¸¿¹ÀÇÁÈqÐSXÉyÐ8ÔYà#$ u°°f±Ñ'=Ñ#=Ð Ø#$ u°°f±Ñ'=Ñ#=Ð à˜/Ñ*�Ø,Ð/?Ñ?×EÑEÀaÈ!ÁeÓL×QÑQÐRWÐX]ÑR^Ó_�ð " $™KÐ*:Ñ:�	Ø—
‘
˜7 E°)°�
Ö<òI$=ð%	=ðN ˆr$   )gš™™™™™¹?)gÍÌÌÌÌÌì?g+‡ÙÎ÷ï?g:Œ0âŽyE>r   r   r   r   Fr7   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úpropertyr(   r   r4   r   Úno_gradrM   rS   Ú__classcell__)r"   s   @r#   r   r   	   s   ø„ ñð& ØØØØØØØ!õ*.ðX ñó ðò^òð €U‡]�]ƒ_ñ3ó ð3ð6 €U‡]�]ƒ_ò5ó ô5r$   r   )rn   r   ÚoptimÚ	Optimizerr   r&   r$   r#   ú<module>rt      s'   ðñó
 ôc�—‘×&Ñ&õ cr$   