U
    ¯Ê¹jü=  ã                
   @   sÀ  d Z ddlZddlmZ ddlmZmZmZ ddlZddl	m
Z
 ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z  ddl!m"Z" ddl#m$Z$ ddl%m&Z& ddl'm(Z( ddl)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0 e 1e2¡Z3dhZ4d4e
j5dœdd„Z6dd„ Z7d5d!d"„Z8d6e
j5e9ee: e9ee9 e;d&œd'd(„Z<d)d*„ Z=d7d,d-„Z>d8e:ee9 e9e9ee; e;ee9 ee d1œd2d3„Z?dS )9z\ Optimizer Factory w/ Custom Weight Decay
Hacked together by / Copyright 2021 Ross Wightman
é    N)Úislice)ÚOptionalÚCallableÚTuple)Úgroup_parametersé   )Ú	AdaBelief)Ú	Adafactor)Ú
Adahessian)ÚAdamP)ÚAdan)ÚLamb)ÚLars)ÚLion)Ú	Lookahead)ÚMADGRAD)ÚNadam)ÚNAdamW)Ú
NvNovoGrad)ÚRAdam)Ú	RMSpropTF)ÚSGDP)ÚSGDWÚlionçñhãˆµøä>© )Úmodelc                 C   sp   t |ƒ}g }g }|  ¡ D ]B\}}|js(q|jdksD| d¡sD||krP| |¡ q| |¡ q|ddœ||dœgS )Nr   z.biasç        )ÚparamsÚweight_decay)ÚsetÚnamed_parametersÚrequires_gradÚndimÚendswithÚappend)r   r   Úno_weight_decay_listÚdecayÚno_decayÚnameÚparamr   r   úW/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/optim/optim_factory.pyÚparam_groups_weight_decay*   s    þr,   c                    s   t ˆ ƒ‰ t ‡ ‡fdd„dƒS )Nc                      s   t tˆ ˆƒƒS ©N)Útupler   r   ©ÚitÚsizer   r+   Ú<lambda>B   ó    z_group.<locals>.<lambda>r   )Úiterr/   r   r/   r+   Ú_group@   s    r5   é   c                    s´   dd„ }t | di ƒ dd ¡}g }g }|  ¡ D ]&\}}|||ƒrH| |¡n| |¡ q,t|ƒ}	|d k	rp|	|   }tt||ƒƒ}t|ƒ‰ dd„ t|ƒD ƒ}
|
 ‡ fdd„|D ƒ¡ |
S )Nc                    s:   |sdS t |ttfƒr,t‡ fdd„|D ƒƒS ˆ  |¡S d S )NTc                    s   g | ]}ˆ   |¡‘qS r   )Ú
startswith)Ú.0Zhpi©Únr   r+   Ú
<listcomp>J   s     z0_layer_map.<locals>._in_head.<locals>.<listcomp>)Ú
isinstancer.   ÚlistÚanyr7   )r:   Úhpr   r9   r+   Ú_in_headF   s
    z_layer_map.<locals>._in_headZpretrained_cfgÚ
classifierc                 S   s    i | ]\}}|D ]
}||“qqS r   r   )r8   ÚiÚlr:   r   r   r+   Ú
<dictcomp>[   s
        z_layer_map.<locals>.<dictcomp>c                    s   i | ]
}|ˆ “qS r   r   )r8   r:   ©Znum_trunk_groupsr   r+   rD   \   s      )	ÚgetattrÚgetr!   r%   Úlenr=   r5   Ú	enumerateÚupdate)r   Zlayers_per_groupZ
num_groupsr@   Zhead_prefixZnames_trunkZ
names_headr:   Ú_Znum_trunk_layersÚ	layer_mapr   rE   r+   Ú
_layer_mapE   s     rM   çš™™™™™©?ç      è?F)r   r   r&   Úlayer_decayÚend_layer_decayÚverbosec                    sJ  t |ƒ}i }i }t| dƒr2t| | jdd�dd�}nt| ƒ}t| ¡ ƒd }	|	d ‰t‡ ‡fdd„t|	ƒD ƒƒ}
|  	¡ D ] \}}|j
s†qv|jdks˜||kr¢d	}d
}nd}|}| |ˆ¡}d||f }||krò|
| }||g dœ||< ||g dœ||< || d  |¡ || d  |¡ qv|�r>ddl}t d|j|dd� ¡ t| ¡ ƒS )z�
    Parameter groups for layer-wise lr decay & weight decay
    Based on BEiT: https://github.com/microsoft/unilm/blob/master/beit/optim_factory.py#L58
    Úgroup_matcherF)ZcoarseT)Úreverser   c                 3   s   | ]}ˆ ˆ|  V  qd S r-   r   )r8   rB   ©rP   Z	layer_maxr   r+   Ú	<genexpr>x   s     z+param_groups_layer_decay.<locals>.<genexpr>r(   r   r'   zlayer_%d_%s)Úlr_scaler   Úparam_names)rW   r   r   rX   r   r   Nzparameter groups: 
%sé   )Úindent)r    Úhasattrr   rS   rM   ÚmaxÚvaluesr=   Úranger!   r"   r#   rG   r%   ÚjsonÚ_loggerÚinfoÚdumps)r   r   r&   rP   rQ   rR   Zparam_group_namesZparam_groupsrL   Z
num_layersZlayer_scalesr)   r*   Zg_decayZ
this_decayZlayer_idÚ
group_nameZ
this_scaler_   r   rU   r+   Úparam_groups_layer_decay`   sF    
ý
ý
rd   c                 C   s    t | j| j| j| jd�}t| ddƒdk	r2| j|d< t| ddƒdk	rL| j|d< t| ddƒdk	rf| j|d< t| ddƒdk	r‚| 	| j
¡ t| d	dƒdk	rœ| j|d
< |S )z‰ cfg/argparse to kwargs helper
    Convert optimizer args in argparse args or cfg like object to keyword args for updated create fn.
    )ÚoptÚlrr   ÚmomentumÚopt_epsNÚepsÚ	opt_betasÚbetasrP   Úopt_argsÚopt_foreachÚforeach)Údictre   rf   r   rg   rF   rh   rj   rP   rJ   rl   rm   )ÚcfgÚkwargsr   r   r+   Úoptimizer_kwargs    s"    ü



rr   Tc                 C   s   t |ft| d�d|i—ŽS )zk Legacy optimizer factory for backwards compatibility.
    NOTE: Use create_optimizer_v2 for new code.
    )rp   Úfilter_bias_and_bn)Úcreate_optimizer_v2rr   )Úargsr   rs   r   r   r+   Úcreate_optimizer·   s    ÿþýrv   Úsgdr   çÍÌÌÌÌÌì?)re   rf   r   rg   rn   rs   rP   Úparam_group_fnc	                 K   s&	  t | tjƒrri }
t| dƒr"|  ¡ }
|r0|| ƒ}qv|dk	rNt| |||
d�}d}qv|rh|rht| ||
ƒ}d}qv|  ¡ }n| }| ¡ }| 	d¡}|d }| 
d¡rêz dd	lm}m}m}m} d
}W n tk
rÒ   d}Y nX |râtj ¡ sêtdƒ‚| 
d¡�r<zddl}d
}W n tk
�r    d}Y nX |�r4tj ¡ �s<tdƒ‚tf d|i|	—Ž}|dk	�rd| d|¡ |dk�r†|tk�rŽ| dd
¡ n||d< |dk�s¢|dk�rÊ| dd¡ tj|f|d
dœ|—Ž}�n4|dk�rü| dd¡ tj|f|ddœ|—Ž}�n|dk�r t|f|d
dœ|—Ž}�nÞ|dk�s4|dk�rZ| dd¡ t|f|d
dœ|—Ž}�n¤|dk�rŠ| dd¡ t|f|ddœ|—Ž}�nt|dk�r¦tj|f|Ž}�nX|dk�rÂtj|f|Ž}�n<|dk�ræt |fdd
dœ|—Ž}�n|d k�r*ztj!|f|Ž}W n" t"k
�r$   t!|f|Ž}Y nX �nÔ|d!k�rDt#|f|Ž}�nº|d"k�r^t$|f|Ž}�n |d#k�rztj%|f|Ž}�n„|d$k�rœt&|fd%di|—Ž}�nb|d&k�r¾t&|fd%d
i|—Ž}�n@|d'k�rÚtj'|f|Ž}�n$|d(k�r| dd)¡ tj(|f|Ž}�nü|d*k�rt)|f|Ž}�nâ|d+k�r>t*|fd,di|—Ž}�nÀ|d-k�r`t*|fd,d
i|—Ž}�nž|d.k�rzt+|f|Ž}�n„|d/k�rœt+|fd0d
i|—Ž}�nb|d1k�rÀt,|f|d
d2œ|—Ž}�n>|d3k�rât,|fd|i|—Ž}�n|d4k�rt,|f|d
d
d5œ|—Ž}�nö|d6k�r,t,|f|d
dœ|—Ž}�nÒ|d7k�rNt-|fd|i|—Ž}�n°|d8k�rrt-|f|d
d9œ|—Ž}�nŒ|d:k�s†|d;k�r–t.|f|Ž}�nh|d<k�r¼tj/|fd=|d>œ|—Ž}�nB|d?k�ràt0|fd=|d>œ|—Ž}�n|d@k�r| dd¡ t1|f|Ž}�nø|dAk�r t2|f|Ž}�nÞ|dBk�rP| dd¡ ||f|d
dœ|—Ž}�n®|dCk�r€| dd¡ ||f|ddœ|—Ž}�n~|dDk�r¢||fdEdi|—Ž}�n\|dFk�rÄ||fdEd
i|—Ž}�n:|dGk�rÞ||f|Ž}�n |dHk�r| dIdJ¡ ||f|Ž}�nú|dKk�r8| dd¡ |jj|f|d
dœ|—Ž}�nÆ|dLk�rl| dd¡ |jj3|f|d
dœ|—Ž}�n’|dMk�rž| dd¡ |jj|fd|i|—Ž}�n`|dNk�rÐ| dd¡ |jj3|fd|i|—Ž}�n.|dOk�rî|jj|f|Ž}�n|dPk�r
|jj4|f|Ž}nô|dQk�r&|jj|f|Ž}nØ|dRk�rB|jj5|f|Ž}n¼|dSk�r^|jj6|f|Ž}n |dTk�rz|jj7|f|Ž}n„|dUk�r–|jj8|f|Ž}nh|dVk�r²|jj7|f|Ž}nL|dWk�rÎ|jj1|f|Ž}n0|dXk�rê|jj9|f|Ž}nd�rödY�sút‚t:‚t;|ƒdZk�	r"|d d[k�	r"t<|ƒ}|S )\añ   Create an optimizer.

    TODO currently the model is passed in and all parameters are selected for optimization.
    For more general use an interface that allows selection of parameters to optimize and lr groups, one of:
      * a filter fn interface that further breaks params into groups in a weight_decay compatible fashion
      * expose the parameters interface and leave it up to caller

    Args:
        model_or_params (nn.Module): model containing parameters to optimize
        opt: name of optimizer to create
        lr: initial learning rate
        weight_decay: weight decay to apply in optimizer
        momentum:  momentum for momentum based optimizers (others may use betas via kwargs)
        foreach: Enable / disable foreach (multi-tensor) operation if True / False. Choose safe default if None
        filter_bias_and_bn:  filter out bias, bn and other 1d params from weight decay
        **kwargs: extra optimizer specific kwargs to pass through

    Returns:
        Optimizer
    Úno_weight_decayN)r   rP   r&   r   rK   éÿÿÿÿZfusedr   )ÚFusedNovoGradÚ	FusedAdamÚ	FusedLAMBÚFusedSGDTFz+APEX and CUDA required for fused optimizersÚbnbz1bitsandbytes and CUDA required for bnb optimizersr   rf   rn   rw   Únesterovri   )rg   r�   rg   ÚsgdpÚsgdwZ	nesterovwZ	momentumwZadamZadamwÚadampg{®Gáz„?)Zwd_ratior�   ÚnadamÚnadamwÚradamZadamaxÚ	adabeliefZrectifyZ
radabeliefZadadeltaZadagradg:Œ0âŽyE>Ú	adafactorZadanpZno_proxZadanwÚlambZlambcÚ
trust_clipZlarc)rg   r‹   ÚlarsZnlarc)rg   r‹   r�   ZnlarsÚmadgradZmadgradw)rg   Zdecoupled_decayZnovogradÚ
nvnovogradZrmsproprx   )Úalpharg   Z	rmsproptfr   Ú
adahessianZfusedsgdZfusedmomentumZ	fusedadamZadam_w_modeZ
fusedadamwZ	fusedlambZfusednovogradrk   )gffffffî?g\�Âõ(\ï?ZbnbsgdZ
bnbsgd8bitZbnbmomentumZbnbmomentum8bitZbnbadamZbnbadam8bitZbnbadamwZbnbadamw8bitZbnblambZbnblamb8bitZbnblarsZbnblarsb8bitZbnblionZbnblion8bitzInvalid optimizerr   Ú	lookahead)=r<   ÚnnÚModuler[   rz   rd   r,   Ú
parametersÚlowerÚsplitr7   Zapex.optimizersr|   r}   r~   r   ÚImportErrorÚtorchÚcudaZis_availableÚAssertionErrorZbitsandbytesro   Ú
setdefaultÚ_DEFAULT_FOREACHÚpopÚoptimZSGDr   r   ZAdamZAdamWr   r   ÚAttributeErrorr   r   ZAdamaxr   ZAdadeltaZAdagradr	   r   r   r   r   r   ZRMSpropr   r   r
   ZSGD8bitZAdam8bitZ	AdamW8bitZLAMBZLAMB8bitZLARSZLion8bitÚ
ValueErrorrH   r   )Zmodel_or_paramsre   rf   r   rg   rn   rs   rP   ry   rq   rz   r”   Z	opt_lowerZ	opt_splitr|   r}   r~   r   Zhas_apexr€   Zhas_bnbrl   Z	optimizerr   r   r+   rt   Â   sR    

ü
























































rt   )r   r   )r6   N)rN   r   rO   NF)T)rw   Nr   rx   NTNN)@Ú__doc__ÚloggingÚ	itertoolsr   Útypingr   r   r   r˜   Ztorch.nnr’   Ztorch.optimrž   Ztimm.modelsr   rˆ   r   r‰   r	   r�   r
   r„   r   Zadanr   rŠ   r   rŒ   r   r   r   r‘   r   r�   r   r…   r   r†   r   rŽ   r   r‡   r   Z
rmsprop_tfr   r‚   r   rƒ   r   Ú	getLoggerÚ__name__r`   rœ   r“   r,   r5   rM   ÚfloatÚstrÚboolrd   rr   rv   rt   r   r   r   r+   Ú<module>   s†   
ÿ  ýÿ
     úú@
        ÷÷