U
    ¯Ê¹jO ã                3   @   sÖ  d Z ddlZddlmZmZmZ ddlmZ ddlm	Z	m
Z
mZmZmZmZmZmZ ddlZddlmZ ddlmZmZ ddlmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z# dd	l$m%Z% dd
l&m'Z'm(Z( ddl)m*Z*m+Z+ dddddgZ,eG dd„ dƒƒZ-eG dd„ dƒƒZ.�dAdd„Z/�dBdd„Z0�dCe	e1e1f ee2e
e2 f e3e	e- dœdd„Z4ee-ee- f e
e- dœd d!„Z5d"d#„ Z6eG d$d%„ d%ƒƒZ7G d&d'„ d'ej8ƒZ9e1e2e2e2e	e2e2f e7d(œd)d*„Z:G d+d,„ d,ej8ƒZ;G d-d.„ d.ej8ƒZ<G d/d0„ d0ej8ƒZ=G d1d2„ d2ej8ƒZ>G d3d4„ d4ej8ƒZ?G d5d6„ d6ej8ƒZ@G d7d8„ d8ej8ƒZAeBe;e<e=e>e?e@eAd9�ZCe1ej8d:œd;d<„ZDee1ej8f d=œd>d„ZEG d?d@„ d@ejFƒZG�dDe2e2e1e1e1e7dCœdDd„ZH�dEdFdG„ZIdHdI„ ZJee1ef e-e.dJœdKdL„ZKddeKfe.eLe2ee1ef ee2 ee7 ee dMœdNdO„ZMe.dPœdQdR„ZNG dSd„ dej8ƒZO�dFdTdU„ZPeBe.e-dVddWdEddXdY�e-dVdEdZdEddXdY�e-d[d\d]dEdd^dY�e-d[d_d]dEdd`dY�e-d[dad]ddd`dY�fdbddcdd�e.e-dVddWdEddXdY�e-dVdEdZdEddXdY�e-d[d\d]dEdd^dY�e-d[dad]dEdd`dY�e-d[dd]ddd`dY�fdbddcdd�e.e-dVddedEddXdY�e-dVdfdedEddXdY�e-d[dgdhdEdd^dY�e-d[dEdidEdd`dY�e-d[ddjddd`dY�fdkddldd�e.e/dmdndo�dpdedq�e.e/dmdrdo�dpdsdq�e.e/dmdtdo�dpdsdq�e.e/dudv�dpdsdq�e.e/dwdv�dpdsdq�e.e/dwdadx�dpdsdq�e.e/dydv�dpdsdq�e.e/dydadx�dpdsdq�e.e/dzdv�dpdsdq�e.e/dzdadx�dpdsdq�e.e/d{dydo�dpdsd|eBd}dd~�d�e.e-d[dEdjddbd^dY�e-d[dad€dEdbd^dY�e-d[d\d�dEdbd^dY�e-d[dad�dEddXdY�fdWd‚ddƒd„d…�e.e-d†ddjdddXeBƒ d‡�e-d[dad€dEdbd^dY�e-d[d\d�dEdbd^dY�e-d[dad�dEddXdY�fdWdˆddƒd„eBd‰dŠ�d‹�e.e-d[dEdjddbd^dY�e-d[dEd€dEdbd^dY�e-d[dEdŒdEdbd^dY�e-d[dEdƒdEdbd^dY�fdsd�dŽd„d��e.e-d[dEdjddbd^dY�e-d[dEd€dEdbd^dY�e-d[dEdŒdEdbd^dY�e-d[dEdƒdEdbd^dY�fdsd�dŽd„d�d‘�e.e-d[dEdjddbd^dY�e-d[dEd€dEdbd^dY�e-d[dEdŒdEdbd^dY�e-d[dEdƒdEdbd^dY�fdsd�dŽd„d|d‘�e.e-d[dEdjddbd^dY�e-d[dEd€dEdbd^dY�e-d[dEdŒdEdbd^dY�e-d[dEdƒdEdbd^dY�fdsd�dŽd„d’d‘�e.e-d[dEdjddbd^dY�e-d[dEd€dEdbd^dY�e-d[dEdŒdEdbd^dY�e-d[dEdƒdEdbd^dY�fdsd�dŽd„d“eBd”d•�d–�e.e-d[dEdjddd^dY�e-d[dfd€dEdd^dY�e-d[dfd�dEdd^dY�e-d[dEd�dEdd^dY�fdsd�dAdd„d…�e.e-d[dEdjddd^dY�e-d[dfd€dEdd^dY�e-d[dfd�dEdd^dY�e-d[dEd�dEdd^dY�fdsd�dAd—d„d…�e.e-d[dEdjddd^dY�e-d[dfd€dEdd^dY�e-d[dfd�dEdd^dY�e-d[dEd�dEdd^dY�fdsd�dAd—d„d�d˜�e.e-d[dEdjddd^dY�e-d[dfd€dEdd^dY�e-d[dfd�dEdd^dY�e-d[dEd�dEdd^dY�fdsd�dAd—d„d|d˜�e.e-d[dEdjddd^dY�e-d[dfd€dEdd^dY�e-d[dfd�dEdd^dY�e-d[dEd�dEdd^dY�fdsd�dAd—d„d’d˜�e.e-d[dfdjdd^d™�e-d[dad€dEd^d™�e-d[d\dŒdEd^d™�e-d[dfdƒdEd^d™�fdsd�dAd�dš�e.e-d[dfdjddbd^dY�e-d[dad€dEdbd^dY�e-d[d\dŒdEdbd^dY�e-d[dfdƒdEdbd^dY�fdsd�dŽd„d�d‘�e.e-d[dEdedEd›dfdY�e-d[d\dœdEd›dfdY�e-d[d�dZdEd›dfdY�e-d[dEdždEd›dfdY�fdbdAdAd�d„d|eBd^dŸ�eBd‰d‰d �d¡�	e.e-d[dEdedEd›dadY�e-d[d\dœdEd›dadY�e-d[d�dZdEd›dadY�e-d[dEdždEd›dadY�fdbdAdAd�d„d|eBd^dŸ�eBd‰d‰d �d¡�	e.e-d[dfdsddbdadY�e-d[d\dWdEdbdadY�e-d[d�djdEdbdadY�e-d[dfdhdEdbdadY�fdsd�dAdAd¢d„d|eBd^dŸ�eBd‰d‰d �d£�
e.e-d[dfdsdd”dadY�e-d[d\dWdEd”dadY�e-d[d�djdEd”dadY�e-d[dfdhdEd”dadY�fdsd�dAdAd¢d„d|eBd^dŸ�eBd‰d‰d �d£�
e.e-d[dfdœdd”dadY�e-d[d”dZdEd”dadY�e-d[d›dhdEd”dadY�e-d[dfd€dEd”dadY�fdsd�dAdAdƒd„d|eBd^dŸ�eBd‰d‰d �d£�
e.e-d[dEdedEd›dfdY�e-d[d\dœdEd›dfdY�e-d[d�dZdEd›dfdY�e-d[dEdždEd›dfdY�fdbdAdAd�d„ee#d›d¤�d|eBd^dŸ�eBd‰d‰d �d¥�
e.e-d[dEdedEd›dadY�e-d[d\dœdEd›dadY�e-d[d�dZdEd›dadY�e-d[dEdždEd›dadY�fdbdAdAd�d„ee#d›d¤�d|eBd^dŸ�eBd‰d‰d �d¥�
e.e-d[dfdsdd”dadY�e-d[d\dWdEd”dadY�e-d[d�djdEd”dadY�e-d[dfdhdEd”dadY�fdsd¦dAdAd¢d„ee#d›d¤�d|eBd^dŸ�eBd‰d‰d �d§�e.e0d¨dad©�dªdedq�e.e0d«dv�dªdsdq�e.e0d¬dv�dªdsdq�e.e0d­dv�dªdsdq�e.e0d®d¯d°�dªdsdq�d±�)ZQ�dGd²d³„ZR�dHd´dµ„ZS�dId¶d·„ZTe*eSd¸d¹�eSd¸d¹�eSd¸dºd»d¼�eSd¸d½d¾d¿�eSd¸d½d¾d¿�eSd¸d½d¾d¿�eSd¸d½d¾d¿�eSd¸d½d¾d¿�eSd¸d½d¾d¿�eSd¸d½d¾d¿�eSd¸d½d¾d¿�eSd¸d½d¾d¿�eSd¸d½d¾d¿�eSd¸d½d¾dÀdÁdXdÂ�eSd¸dÃdÄdºd»dÅdXdÆ�eTd¸dÇdÅdXdÈ�eTd¸dÉdÅdXdÈ�eTd¸dÊdÅdXdÈ�eTd¸dËdÅdXdÈ�eTd¸dÌdÅdXdÈ�eTd¸dÍdºdÎ�eTd¸dÏdÅdXdÈ�eTd¸dÐdÅdXdÈ�eTd¸dÑdÅdXdÈ�eTd¸dÒdÅdXdÈ�eTd¸dÓdÅdXdÈ�eTd¸dÔdÅdXdÈ�eTd¸dÕdÅdXdÈ�eTd¸dÖd×dØdØdÙdÚdÛdÅdXdÜ�
eTd¸dÝd×dØdØdÛdÀdXdÞ�eTd¸dßdØdØdàdÀdá�eTd¸dâdØdØdÛdÀdXdã�eTd¸dädØdØdÛdÀdXdã�eTd×dØdØdÙdÚdàdÅdå�eTd¸dæd×dØdØdàdÀdç�eTd¸dèdØdØdàdÀdXdã�eSd¸dédêdë�eSd¸dìdêdë�eSd¸dìdêdë�eSd¸dìdêdë�eSd¸dìdêdë�díœ)ƒZUe+�dJeOdîœdïdð„ƒZVe+�dKeOdîœdñdò„ƒZWe+�dLeOdîœdódô„ƒZXe+�dMeOdîœdõdö„ƒZYe+�dNeOdîœd÷dø„ƒZZe+�dOeOdîœdùdú„ƒZ[e+�dPeOdîœdûdü„ƒZ\e+�dQeOdîœdýdþ„ƒZ]e+�dReOdîœdÿ�d „ƒZ^e+�dSeOdîœ�d�d„ƒZ_e+�dTeOdîœ�d�d„ƒZ`e+�dUeOdîœ�d�d„ƒZae+�dVeOdîœ�d�d„ƒZbe+�dWeOdîœ�d	�d
„ƒZce+�dXeOdîœ�d�d„ƒZde+�dYeOdîœ�d�d„ƒZee+�dZeOdîœ�d�d„ƒZfe+�d[eOdîœ�d�d„ƒZge+�d\eOdîœ�d�d„ƒZhe+�d]eOdîœ�d�d„ƒZie+�d^eOdîœ�d�d„ƒZje+�d_eOdîœ�d�d„ƒZke+�d`eOdîœ�d�d„ƒZle+�daeOdîœ�d�d„ƒZme+�dbeOdîœ�d�d „ƒZne+�dceOdîœ�d!�d"„ƒZoe+�ddeOdîœ�d#�d$„ƒZpe+�deeOdîœ�d%�d&„ƒZqe+�dfeOdîœ�d'�d(„ƒZre+�dgeOdîœ�d)�d*„ƒZse+�dheOdîœ�d+�d,„ƒZte+�dieOdîœ�d-�d.„ƒZue+�djeOdîœ�d/�d0„ƒZve+�dkeOdîœ�d1�d2„ƒZwe+�dleOdîœ�d3�d4„ƒZxe+�dmeOdîœ�d5�d6„ƒZye+�dneOdîœ�d7�d8„ƒZze+�doeOdîœ�d9�d:„ƒZ{e+�dpeOdîœ�d;�d<„ƒZ|e+�dqeOdîœ�d=�d>„ƒZ}e+�dreOdîœ�d?�d@„ƒZ~dS (s  a¾   Bring-Your-Own-Blocks Network

A flexible network w/ dataclass based config for stacking those NN blocks.

This model is currently used to implement the following networks:

GPU Efficient (ResNets) - gernet_l/m/s (original versions called genet, but this was already used (by SENet author)).
Paper: `Neural Architecture Design for GPU-Efficient Networks` - https://arxiv.org/abs/2006.14090
Code and weights: https://github.com/idstcv/GPU-Efficient-Networks, licensed Apache 2.0

RepVGG - repvgg_*
Paper: `Making VGG-style ConvNets Great Again` - https://arxiv.org/abs/2101.03697
Code and weights: https://github.com/DingXiaoH/RepVGG, licensed MIT

MobileOne - mobileone_*
Paper: `MobileOne: An Improved One millisecond Mobile Backbone` - https://arxiv.org/abs/2206.04040
Code and weights: https://github.com/apple/ml-mobileone, licensed MIT

In all cases the models have been modified to fit within the design of ByobNet. I've remapped
the original weights and verified accuracies.

For GPU Efficient nets, I used the original names for the blocks since they were for the most part
the same as original residual blocks in ResNe(X)t, DarkNet, and other existing models. Note also some
changes introduced in RegNet were also present in the stem and bottleneck blocks for this model.

A significant number of different network archs can be implemented here, including variants of the
above nets that include attention.

Hacked together by / copyright Ross Wightman, 2021.
é    N)Ú	dataclassÚfieldÚreplace)Úpartial)ÚTupleÚListÚDictÚOptionalÚUnionÚAnyÚCallableÚSequence©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)ÚClassifierHeadÚConvNormActÚBatchNormAct2dÚDropPathÚAvgPool2dSameÚcreate_conv2dÚget_act_layerÚget_norm_act_layerÚget_attnÚmake_divisibleÚ	to_2tupleÚEvoNorm2dS0aé   )Úbuild_model_with_cfg)Únamed_applyÚcheckpoint_seq)Úgenerate_default_cfgsÚregister_modelÚByobNetÚByoModelCfgÚByoBlockCfgÚcreate_byob_stemÚcreate_blockc                   @   sÈ   e Zd ZU eeejf ed< eed< eed< dZ	eed< dZ
eeeef  ed< dZeed	< dZee ed
< dZeeeef  ed< dZee ed< dZeeeef  ed< dZeeeef  ed< dS )r%   ÚtypeÚdÚcé   ÚsNÚgsç      ð?ÚbrÚ
attn_layerÚattn_kwargsÚself_attn_layerÚself_attn_kwargsÚblock_kwargs)Ú__name__Ú
__module__Ú__qualname__r
   ÚstrÚnnÚModuleÚ__annotations__Úintr,   r-   r	   r   r/   Úfloatr0   r1   r   r   r2   r3   r4   © r>   r>   úR/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/byobnet.pyr%   1   s   
c                   @   s  e Zd ZU eeeeedf f df ed< dZeed< dZ	eed< dZ
ee ed< d	Zeed
< dZeed< dZeed< dZeed< dZeed< dZeed< dZeed< dZee ed< edd„ d�Zeed< dZee ed< edd„ d�Zeed< ed d„ d�Zeeef ed!< dS )"r$   .ÚblocksÚconv1x1Ú
downsampleÚ3x3Ú	stem_typeÚmaxpoolÚ	stem_poolé    Ústem_chsr.   Úwidth_factorr   Únum_featuresTÚzero_init_lastFÚfixed_input_sizeZreluÚ	act_layerZ	batchnormÚ
norm_layerNr0   c                   C   s   t ƒ S ©N©Údictr>   r>   r>   r?   Ú<lambda>S   ó    zByoModelCfg.<lambda>)Údefault_factoryr1   r2   c                   C   s   t ƒ S rO   rP   r>   r>   r>   r?   rR   U   rS   r3   c                   C   s   t ƒ S rO   rP   r>   r>   r>   r?   rR   V   rS   r4   )r5   r6   r7   r   r
   r%   r;   rB   r8   rD   rF   r	   rH   r<   rI   r=   rJ   rK   ÚboolrL   rM   rN   r0   r   r1   rQ   r2   r3   r4   r   r   r>   r>   r>   r?   r$   B   s    
 ©é   é   é   r   ©r.   r.   r.   r.   c                    s>   d}d‰ ˆdkr‡fdd„‰ t ‡ fdd„t| ||ƒD ƒƒ}|S )N©é@   é€   é   é   r   c                    s   |d d dkr| ˆ  S dS )Nr   r+   r   r>   )ZchsÚidx)Úgroupsr>   r?   rR   ]   rS   z_rep_vgg_bcfg.<locals>.<lambda>c                    s&   g | ]\}}}t d ||| ˆ d�‘qS )Úrep)r(   r)   r*   r-   )r%   )Ú.0r)   r*   Úwf©Ú
group_sizer>   r?   Ú
<listcomp>^   s     z!_rep_vgg_bcfg.<locals>.<listcomp>)ÚtupleÚzip)r)   rd   ra   r*   Úbcfgr>   )rf   ra   r?   Ú_rep_vgg_bcfgY   s    rk   ©r+   é   é
   r   r>   c                 C   sæ   d}t d|d |d  ƒ}|p(dt| ƒ }g }t| |||ƒD ]¤\} }}}g }	t| ƒD ]€}
|| }t|d�}i }|
| | kr‚d|d< |	tf dd	|d	|d
œ|—Žg7 }	|	tf dd	|dtf dd	i|—Žd
œ|—Žg7 }	|}qT||	g7 }q<|S )Nr[   r\   r   )r   )Únum_conv_branchesÚser0   Úoner   )r(   r)   r*   r-   r4   Úkernel_size)ÚminÚlenri   ÚrangerQ   r%   )r)   rd   Ú	se_blocksro   r*   Zprev_crj   Úwrp   ZscfgÚiZout_cZbkZakr>   r>   r?   Ú_mobileone_bcfgb   s2    
     ÿÿ
ry   F)ÚtypesÚeveryÚfirstÚreturnc                 K   s˜   t | ƒdkst‚t|tƒrDtt|r&dn|||d ƒƒ}|sD|d g}t|ƒ g }t|ƒD ]6}||krl| d n| d }|tf |ddœ|—Žg7 }qXt|ƒS )z' interleave 2 block types in stack
    r+   r   r   )r(   r)   )	rt   ÚAssertionErrorÚ
isinstancer<   Úlistru   Úsetr%   rh   )rz   r)   r{   r|   Úkwargsr@   rx   Ú
block_typer>   r>   r?   Úinterleave_blocksw   s    

r„   )Ústage_blocks_cfgr}   c                    sF   t | tƒs| f} g }t| ƒD ]$\}‰ |‡ fdd„tˆ jƒD ƒ7 }q|S )Nc                    s   g | ]}t ˆ d d�‘qS )r   ©r)   )r   )rc   Ú_©Úcfgr>   r?   rg   ‘   s     z%expand_blocks_cfg.<locals>.<listcomp>)r   r   Ú	enumerateru   r)   )r…   Ú
block_cfgsrx   r>   rˆ   r?   Úexpand_blocks_cfgŒ   s    
rŒ   c                 C   s$   | sdS ||  dkst ‚||  S d S )Nr   r   )r~   )rf   Zchannelsr>   r>   r?   Ú
num_groups•   s    r�   c                   @   sT   e Zd ZU eZeed< eZeed< e	j
Zeed< dZee ed< dZee ed< dS )ÚLayerFnÚconv_norm_actÚnorm_actÚactNÚattnÚ	self_attn)r5   r6   r7   r   r�   r   r;   r   r�   r9   ZReLUr‘   r’   r	   r“   r>   r>   r>   r?   rŽ   ž   s
   
rŽ   c                       s6   e Zd Zd	eeeeeedœ‡ fdd„Zdd„ Z‡  ZS )
ÚDownsampleAvgr   FN)Úin_chsÚout_chsÚstrideÚdilationÚ	apply_actÚlayersc           	         sˆ   t t| ƒ ¡  |ptƒ }|dkr$|nd}|dks8|dkrf|dkrL|dkrLtntj}|d|ddd�| _n
t ¡ | _|j	||d|d�| _
dS )z0 AvgPool Downsampling as in 'D' ResNet variants.r   r+   TF)Z	ceil_modeZcount_include_pad©r™   N)Úsuperr”   Ú__init__rŽ   r   r9   Z	AvgPool2dÚpoolÚIdentityr�   Úconv)	Úselfr•   r–   r—   r˜   r™   rš   Z
avg_strideZavg_pool_fn©Ú	__class__r>   r?   r�   ¨   s    


zDownsampleAvg.__init__c                 C   s   |   |  |¡¡S rO   )r    rž   ©r¡   Úxr>   r>   r?   Úforward¼   s    zDownsampleAvg.forward)r   r   FN)	r5   r6   r7   r<   rU   rŽ   r�   r¦   Ú__classcell__r>   r>   r¢   r?   r”   §   s       ùùr”   )Údownsample_typer•   r–   r—   r˜   rš   c                 K   s†   | dkst ‚||ks,|dks,|d |d krz| s4d S | dkrXt||f||d dœ|—ŽS |j||fd||d dœ|—ŽS nt ¡ S d S )N)ÚavgrA   Ú r   r   r©   ©r—   r˜   )rr   r—   r˜   )r~   r”   r�   r9   rŸ   )r¨   r•   r–   r—   r˜   rš   r‚   r>   r>   r?   Úcreate_shortcutÀ   s    	 "r¬   c                       sd   e Zd ZdZdeeeeeeef ee eee	e	e
eedœ‡ fdd„Zde	dœdd„Zdd„ Z‡  ZS )Ú
BasicBlockz$ ResNet Basic Block - kxk + kxk
    é   r   ©r   r   Nr.   r©   TFç        )r•   r–   rr   r—   r˜   rf   Úbottle_ratiorB   Ú	attn_lastÚ
linear_outrš   Ú
drop_blockÚdrop_path_ratec              	      sú   t t| ƒ ¡  |ptƒ }t|| ƒ}t||ƒ}t|||||d|d�| _|j|||||d d�| _	|	sn|j
d krvt ¡ n| 
|¡| _
|j||||d ||dd�| _|	r®|j
d kr¶t ¡ n| 
|¡| _|dkrÒt|ƒnt ¡ | _|
rèt ¡ n
|jdd	�| _d S )
NF©r—   r˜   r™   rš   r   r«   r   )r˜   ra   Ú
drop_layerr™   r°   T©Zinplace)rœ   r­   r�   rŽ   r   r�   r¬   Úshortcutr�   Ú	conv1_kxkr’   r9   rŸ   Ú	conv2_kxkr²   r   Ú	drop_pathr‘   )r¡   r•   r–   rr   r—   r˜   rf   r±   rB   r²   r³   rš   r´   rµ   Úmid_chsra   r¢   r>   r?   r�   Ù   s6    

     þ"     þ"zBasicBlock.__init__©rK   c                 C   s\   |r4| j d k	r4t| jjdd ƒd k	r4tj | jjj¡ | j| j	fD ]}t
|dƒr@| ¡  q@d S ©NÚweightÚreset_parameters©r¹   Úgetattrr»   Úbnr9   ÚinitÚzeros_rÀ   r’   r²   ÚhasattrrÁ   ©r¡   rK   r’   r>   r>   r?   Úinit_weightsý   s
    "
zBasicBlock.init_weightsc                 C   sN   |}|   |¡}|  |¡}|  |¡}|  |¡}| jd k	rD||  |¡ }|  |¡S rO   )rº   r»   r’   r¼   r¹   r‘   ©r¡   r¥   r¹   r>   r>   r?   r¦     s    




zBasicBlock.forward)r®   r   r¯   Nr.   r©   TFNNr°   )F)r5   r6   r7   Ú__doc__r<   r   r	   r=   r8   rU   rŽ   r   r�   rÉ   r¦   r§   r>   r>   r¢   r?   r­   Õ   s:              ò
ò$r­   c                       sh   e Zd ZdZdeeeeeeef eee ee	e	e	e	e
eed
œ‡ fdd„Zde	dœdd„Zdd„ Z‡  ZS )ÚBottleneckBlockz4 ResNet-like Bottleneck Block - 1x1 - kxk - 1x1
    r®   r   r¯   r.   Nr©   Fr°   )r•   r–   rr   r—   r˜   r±   rf   rB   r²   r³   Ú
extra_convÚ	bottle_inrš   r´   rµ   c              	      s:  t t| ƒ ¡  |ptƒ }t|r"|n|| ƒ}t||ƒ}t|||||d|d�| _| ||d¡| _	|j|||||d ||d�| _
|rœ|j||||d |d�| _n
t ¡ | _|	s´|jd kr¼t ¡ n| |¡| _|j||ddd�| _|	rê|jd kròt ¡ n| |¡| _|dk�rt|ƒnt ¡ | _|
�r(t ¡ n
|jd	d
�| _d S )NFr¶   r   r   ©r—   r˜   ra   r·   )r˜   ra   r›   r°   Tr¸   )rœ   rÌ   r�   rŽ   r   r�   r¬   r¹   r�   Ú	conv1_1x1r»   Ú
conv2b_kxkr9   rŸ   r’   Ú	conv3_1x1r²   r   r¼   r‘   )r¡   r•   r–   rr   r—   r˜   r±   rf   rB   r²   r³   rÍ   rÎ   rš   r´   rµ   r½   ra   r¢   r>   r?   r�     sJ    

     þ     þ    ÿ

""zBottleneckBlock.__init__r¾   c                 C   s\   |r4| j d k	r4t| jjdd ƒd k	r4tj | jjj¡ | j| j	fD ]}t
|dƒr@| ¡  q@d S r¿   )r¹   rÃ   rÒ   rÄ   r9   rÅ   rÆ   rÀ   r’   r²   rÇ   rÁ   rÈ   r>   r>   r?   rÉ   ?  s
    "
zBottleneckBlock.init_weightsc                 C   sl   |}|   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}| jd k	rb||  |¡ }|  |¡S rO   )	rÐ   r»   rÑ   r’   rÒ   r²   r¼   r¹   r‘   rÊ   r>   r>   r?   r¦   F  s    







zBottleneckBlock.forward)r®   r   r¯   r.   Nr©   FFFFNNr°   )F©r5   r6   r7   rË   r<   r   r=   r	   r8   rU   rŽ   r   r�   rÉ   r¦   r§   r>   r>   r¢   r?   rÌ     sB                ð
ð,rÌ   c                       sd   e Zd ZdZdeeeeeeef eee ee	e	e
eedœ‡ fdd„Zde	dœdd„Zdd„ Z‡  ZS )Ú	DarkBlocka
   DarkNet-like (1x1 + 3x3 w/ stride) block

    The GE-Net impl included a 1x1 + 3x3 block in their search space. It was not used in the feature models.
    This block is pretty much a DarkNet block (also DenseNet) hence the name. Neither DarkNet or DenseNet
    uses strides within the block (external 3x3 or maxpool downsampling is done in front of the block repeats).

    If one does want to use a lot of these blocks w/ stride, I'd recommend using the EdgeBlock (3x3 /w stride + 1x1)
    for more optimal compute.
    r®   r   r¯   r.   Nr©   TFr°   ©r•   r–   rr   r—   r˜   r±   rf   rB   r²   r³   rš   r´   rµ   c              
      sò   t t| ƒ ¡  |ptƒ }t|| ƒ}t||ƒ}t|||||d|d�| _| ||d¡| _	|	sd|j
d krlt ¡ n| 
|¡| _
|j|||||d ||dd�| _|	r¦|j
d kr®t ¡ n| 
|¡| _|dkrÊt|ƒnt ¡ | _|
ràt ¡ n
|jdd�| _d S )	NFr¶   r   r   ©r—   r˜   ra   r·   r™   r°   Tr¸   )rœ   rÔ   r�   rŽ   r   r�   r¬   r¹   r�   rÐ   r’   r9   rŸ   r»   r²   r   r¼   r‘   ©r¡   r•   r–   rr   r—   r˜   r±   rf   rB   r²   r³   rš   r´   rµ   r½   ra   r¢   r>   r?   r�   _  s8    

     þ"      þ"zDarkBlock.__init__r¾   c                 C   s\   |r4| j d k	r4t| jjdd ƒd k	r4tj | jjj¡ | j| j	fD ]}t
|dƒr@| ¡  q@d S r¿   rÂ   rÈ   r>   r>   r?   rÉ   ƒ  s
    "
zDarkBlock.init_weightsc                 C   sX   |}|   |¡}|  |¡}|  |¡}|  |¡}|  |¡}| jd k	rN||  |¡ }|  |¡S rO   )rÐ   r’   r»   r²   r¼   r¹   r‘   rÊ   r>   r>   r?   r¦   Š  s    





zDarkBlock.forward)r®   r   r¯   r.   Nr©   TFNNr°   )FrÓ   r>   r>   r¢   r?   rÔ   T  s:              ò
ò$rÔ   c                       sd   e Zd ZdZdeeeeeeef eee ee	e	e
eed
œ‡ fdd„Zde	dœdd„Zdd„ Z‡  ZS )Ú	EdgeBlocka§   EdgeResidual-like (3x3 + 1x1) block

    A two layer block like DarkBlock, but with the order of the 3x3 and 1x1 convs reversed.
    Very similar to the EfficientNet Edge-Residual block but this block it ends with activations, is
    intended to be used with either expansion or bottleneck contraction, and can use DW/group/non-grouped convs.

    FIXME is there a more common 3x3 + 1x1 conv block to name this after?
    r®   r   r¯   r.   Nr©   Fr°   rÕ   c              	      sô   t t| ƒ ¡  |ptƒ }t|| ƒ}t||ƒ}t|||||d|d�| _|j|||||d ||d�| _	|	sr|j
d krzt ¡ n| 
|¡| _
|j||ddd�| _|	r¨|j
d kr°t ¡ n| 
|¡| _|dkrÌt|ƒnt ¡ | _|
rât ¡ n
|jdd	�| _d S )
NFr¶   r   rÏ   r   r›   r°   Tr¸   )rœ   rØ   r�   rŽ   r   r�   r¬   r¹   r�   rº   r’   r9   rŸ   Ú	conv2_1x1r²   r   r¼   r‘   r×   r¢   r>   r?   r�      s6    

     þ     þ""zEdgeBlock.__init__r¾   c                 C   s\   |r4| j d k	r4t| jjdd ƒd k	r4tj | jjj¡ | j| j	fD ]}t
|dƒr@| ¡  q@d S r¿   )r¹   rÃ   rÙ   rÄ   r9   rÅ   rÆ   rÀ   r’   r²   rÇ   rÁ   rÈ   r>   r>   r?   rÉ   Ä  s
    "
zEdgeBlock.init_weightsc                 C   sX   |}|   |¡}|  |¡}|  |¡}|  |¡}|  |¡}| jd k	rN||  |¡ }|  |¡S rO   )rº   r’   rÙ   r²   r¼   r¹   r‘   rÊ   r>   r>   r?   r¦   Ë  s    





zEdgeBlock.forward)r®   r   r¯   r.   Nr©   FFNNr°   )FrÓ   r>   r>   r¢   r?   rØ   –  s:              ò
ò$rØ   c                       sž   e Zd ZdZdeeeeeeef eee ee	e
eed
œ‡ fdd„Zdedœdd„Zdd„ Zdd„ Zeejejf dœdd„Zeejejf dœdd„Z‡  ZS )ÚRepVggBlockzQ RepVGG Block.

    Adapted from impl at https://github.com/DingXiaoH/RepVGG
    r®   r   r¯   r.   Nrª   r°   F)r•   r–   rr   r—   r˜   r±   rf   rB   rš   r´   rµ   Úinference_modec              
      s  t t| ƒ ¡  t||ƒ | _}|	p&tƒ }	|rHtj||||||dd�| _n”d | _||kol|dkol|d |d k}|r€|	j	|dd�nd | _
|	j|||||d ||
dd�| _|	j||d||dd�| _|d	krÒ|rÒt|ƒnt ¡ | _|	jd krît ¡ n|	 |¡| _|	jdd
�| _d S )NT©Úin_channelsÚout_channelsrr   r—   r˜   ra   Úbiasr   r   Fr›   rÖ   )r—   ra   r™   r°   r¸   )rœ   rÚ   r�   r�   ra   rŽ   r9   ÚConv2dÚreparam_convr�   Úidentityr�   Úconv_kxkÚconv_1x1r   rŸ   r¼   r’   r‘   )r¡   r•   r–   rr   r—   r˜   r±   rf   rB   rš   r´   rµ   rÛ   ra   Ú	use_identr¢   r>   r?   r�   Ý  s<    
ù

       þzRepVggBlock.__init__r¾   c                 C   sX   |   ¡ D ]4}t|tjƒrtj |jdd¡ tj |jdd¡ qt| j	dƒrT| j	 
¡  d S )Ngš™™™™™¹?r   rÁ   )Úmodulesr   r9   ÚBatchNorm2drÅ   Únormal_rÀ   rß   rÇ   r’   rÁ   )r¡   rK   Úmr>   r>   r?   rÉ     s    zRepVggBlock.init_weightsc                 C   s„   | j d k	r |  |  |   |¡¡¡S | jd kr@|  |¡|  |¡ }n0|  |¡}|  |¡|  |¡ }|  |¡}||7 }|  |¡}|  |¡S rO   )rá   r‘   r’   râ   rä   rã   r¼   )r¡   r¥   râ   r>   r>   r?   r¦     s    




zRepVggBlock.forwardc              
   C   sÄ   | j dk	rdS |  ¡ \}}tj| jjj| jjj| jjj| jjj	| jjj
| jjj| jjjdd�| _ || j j_|| j j_|  ¡ D ]\}}d|krŽq|| ¡  q||  d¡ |  d¡ |  d¡ |  d¡ dS )	á   Following works like `RepVGG: Making VGG-style ConvNets Great Again` -
        https://arxiv.org/pdf/2101.03697.pdf. We re-parameterize multi-branched
        architecture used at training time to obtain a plain CNN-like structure
        for inference.
        NT©rÝ   rÞ   rr   r—   Úpaddingr˜   ra   rß   rá   rã   rä   râ   r¼   ©rá   Ú_get_kernel_biasr9   rà   rã   r    rÝ   rÞ   rr   r—   rì   r˜   ra   rÀ   Údatarß   Znamed_parametersZdetach_Ú__delattr__©r¡   Úkernelrß   ÚnameÚparar>   r>   r?   Úreparameterize  s.    
ø






zRepVggBlock.reparameterize©r}   c           
      C   sž   d}d}| j dk	rL|  | j ¡\}}| jjjd d }tjj |||||g¡}d}d}| j	dk	rn|  | j	¡\}}|  | j¡\}}|| | }|| | }	||	fS ©z‹ Method to obtain re-parameterized kernel and bias.
        Reference: https://github.com/DingXiaoH/RepVGG/blob/main/repvgg.py#L83
        r   Nr+   )
rä   Ú_fuse_bn_tensorrã   r    rr   Útorchr9   Ú
functionalÚpadrâ   )
r¡   Z
kernel_1x1Zbias_1x1rû   Úkernel_identityÚbias_identityÚkernel_convÚ	bias_convÚkernel_finalÚ
bias_finalr>   r>   r?   rî   @  s    

zRepVggBlock._get_kernel_biasc                 C   s  t |tƒr<|jj}|jj}|jj}|jj}|jj}|jj}n¤t |t	j
ƒsLt‚t| dƒs¼| jjj}|| j }	| jjj}
t | jjj¡}t|ƒD ](}d||||	 |
d d |
d d f< qŒ|| _| j}|j}|j}|j}|j}|j}||  ¡ }||  dddd¡}|| ||| |  fS )ú“ Method to fuse batchnorm layer with preceeding conv layer.
        Reference: https://github.com/DingXiaoH/RepVGG/blob/main/repvgg.py#L95
        Ú	id_tensorr   r   r+   éÿÿÿÿ©r   r   r    rÀ   rÄ   Úrunning_meanÚrunning_varrß   Úepsr9   rç   r~   rÇ   rã   rÝ   ra   rr   rù   Z
zeros_likeru   r  ÚsqrtZreshape©r¡   Úbranchrò   r  r  ÚgammaÚbetar  r•   Z	input_dimrr   Zkernel_valuerx   ÚstdÚtr>   r>   r?   rø   Z  s2    





&zRepVggBlock._fuse_bn_tensor)
r®   r   r¯   r.   Nrª   NNr°   F)F)r5   r6   r7   rË   r<   r   r=   r	   r8   rŽ   r   rU   r�   rÉ   r¦   rõ   rù   ÚTensorrî   rø   r§   r>   r>   r¢   r?   rÚ   ×  s<   	          ó
ó+	!rÚ   c                       sž   e Zd ZdZdeeeeeeef eee ee	ee
eedd
œ‡ fdd„Zejejdœdd„Zdd„ Zeejejf dœdd„Zeejejf dœdd„Z‡  ZS )ÚMobileOneBlocka8   MobileOne building block.

        This block has a multi-branched architecture at train-time
        and plain-CNN style architecture at inference time
        For more details, please refer to our paper:
        `An Improved One millisecond Mobile Backbone` -
        https://arxiv.org/pdf/2206.04040.pdf
    r®   r   r¯   r.   Nrª   Fr°   )r•   r–   rr   r—   r˜   r±   rf   rB   rÛ   ro   rš   r´   rµ   r}   c                    sB  t t| ƒ ¡  |
| _t||ƒ | _}|p,tƒ }|	rNtj||||||dd�| _	nÂd| _	||kor|dkor|d |d k}|r†|j
|dd�nd| _g }t| jƒD ] }| |j|||||dd�¡ qšt |¡| _d| _|dkrî|j||d||dd�| _|d	k�r|�rt|ƒnt ¡ | _|jdk�r$t ¡ n| |¡| _|jdd
�| _dS )z, Construct a MobileOneBlock module.
        TrÜ   Nr   r   Fr›   )rr   r—   ra   r™   r°   r¸   )rœ   r  r�   ro   r�   ra   rŽ   r9   rà   rá   r�   râ   ru   Úappendr�   Z
ModuleListrã   Ú
conv_scaler   rŸ   r¼   r’   r‘   )r¡   r•   r–   rr   r—   r˜   r±   rf   rB   rÛ   ro   rš   r´   rµ   ra   rå   Zconvsr‡   r¢   r>   r?   r�   „  sR    
ù
	     þ
    þ" zMobileOneBlock.__init__)r¥   r}   c                 C   sŽ   | j dk	r |  |  |   |¡¡¡S d}| jdk	r8|  |¡}d}| jdk	rP|  |¡}|}| jD ]}|||ƒ7 }qZ|  |¡}||7 }|  |  |¡¡S )z Apply forward pass. Nr   )rá   r‘   r’   râ   r  rã   r¼   )r¡   r¥   Zidentity_outZ	scale_outÚoutZckr>   r>   r?   r¦   ¾  s    






zMobileOneBlock.forwardc              
   C   sà   | j dk	rdS |  ¡ \}}tj| jd jj| jd jj| jd jj| jd jj	| jd jj
| jd jj| jd jjdd�| _ || j j_|| j j_|  ¡ D ]\}}d|krªq˜| ¡  q˜|  d¡ |  d¡ |  d¡ |  d	¡ dS )
rê   Nr   Trë   rá   rã   r  râ   r¼   rí   rñ   r>   r>   r?   rõ   Ø  s.    
ø	





zMobileOneBlock.reparameterizerö   c                 C   sÎ   d}d}| j dk	rP|  | j ¡\}}| jd jjd d }tjj |||||g¡}d}d}| j	dk	rr|  | j	¡\}}d}d}t
| jƒD ](}|  | j| ¡\}	}
||	7 }||
7 }q„|| | }|| | }||fS r÷   )r  rø   rã   r    rr   rù   r9   rú   rû   râ   ru   ro   )r¡   Zkernel_scaleZ
bias_scalerû   rü   rý   rþ   rÿ   ZixZ_kernelZ_biasr   r  r>   r>   r?   rî   ø  s&    


zMobileOneBlock._get_kernel_biasc                 C   s$  t |tƒr<|jj}|jj}|jj}|jj}|jj}|jj}n°t |t	j
ƒsLt‚t| dƒsÈ| jd jj}|| j }	| jd jj}
t | jd jj¡}t|ƒD ](}d||||	 |
d d |
d d f< q˜|| _| j}|j}|j}|j}|j}|j}||  ¡ }||  dddd¡}|| ||| |  fS )r  r  r   r   r+   r  r  r
  r>   r>   r?   rø     s2    



&zMobileOneBlock._fuse_bn_tensor)r®   r   r¯   r.   Nrª   Fr   NNr°   )r5   r6   r7   rË   r<   r   r=   r	   r8   rU   rŽ   r   r�   rù   r  r¦   rõ   rî   rø   r§   r>   r>   r¢   r?   r  z  s@              ò
ñ: r  c                       sv   e Zd ZdZdeeeeeeef eee ee	e	e	e	eeeef  e
eedœ‡ fdd„Zde	dœdd„Zdd„ Z‡  ZS )ÚSelfAttnBlockzI ResNet-like Bottleneck Block - 1x1 - optional kxk - self attn - 1x1
    r®   r   r¯   r.   Nr©   FTr°   )r•   r–   rr   r—   r˜   r±   rf   rB   rÍ   r³   rÎ   Úpost_attn_naÚ	feat_sizerš   r´   rµ   c              	      s&  t t| ƒ ¡  |d k	st‚t|r$|n|| ƒ}t||ƒ}t|||||d|d�| _| ||d¡| _	|	rˆ|j|||||d ||d�| _
d}n
t ¡ | _
|d krži nt|d�}|j|fd|i|—Ž| _|rÎ| |¡nt ¡ | _|j||ddd�| _|d	krüt|ƒnt ¡ | _|
�rt ¡ n
|jd
d�| _d S )NFr¶   r   r   rÏ   )r  r—   r›   r°   Tr¸   )rœ   r  r�   r~   r   r�   r¬   r¹   r�   rÐ   r»   r9   rŸ   rQ   r“   r�   Ú	post_attnrÒ   r   r¼   r‘   )r¡   r•   r–   rr   r—   r˜   r±   rf   rB   rÍ   r³   rÎ   r  r  rš   r´   rµ   r½   ra   Z
opt_kwargsr¢   r>   r?   r�   ;  s@    
     þ     þ
zSelfAttnBlock.__init__r¾   c                 C   sN   |r4| j d k	r4t| jjdd ƒd k	r4tj | jjj¡ t| j	dƒrJ| j	 
¡  d S r¿   )r¹   rÃ   rÒ   rÄ   r9   rÅ   rÆ   rÀ   rÇ   r“   rÁ   )r¡   rK   r>   r>   r?   rÉ   i  s    "zSelfAttnBlock.init_weightsc                 C   sb   |}|   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}| jd k	rX||  |¡ }|  |¡S rO   )rÐ   r»   r“   r  rÒ   r¼   r¹   r‘   rÊ   r>   r>   r?   r¦   o  s    






zSelfAttnBlock.forward)r®   r   r¯   r.   Nr©   FFFTNNNr°   )FrÓ   r>   r>   r¢   r?   r  7  sF                 ï
ï.r  )ÚbasicÚbottleZdarkÚedgerb   rq   r“   ©rƒ   Zblock_fnc                 C   s   |t | < d S rO   )Ú_block_registryr  r>   r>   r?   Úregister_block‡  s    r  )Úblockc                 K   s>   t | tjtfƒr| f |ŽS | tks0td| › �ƒ‚t|  f |ŽS )NzUnknown block type ()r   r9   r:   r   r  r~   )r  r‚   r>   r>   r?   r'   ‹  s    
c                       s8   e Zd Zd	eeeeeeee eedœ	‡ fdd„Z‡  Z	S )
ÚStemr®   rW   rE   Nç      à?)	r•   r–   rr   r—   rž   Únum_repÚnum_actÚ	chs_decayrš   c
              
      sÈ  t ƒ  ¡  |dkst‚|	ptƒ }	tˆttfƒr<tˆƒ}ˆ}
n"‡ ‡fdd„t|ƒD ƒd d d… }
|| _	g | _
d}dgdg|d   }|dkr–|s–d|d< |d kr¢|n|}d	g||  d
g|  }|}d}tt|
||ƒƒD ]|\}\}}}|rî|	jnt}d|d › �}|dk�r*|dk�r*| j
 t|||d�¡ |  ||||||d�¡ |}||9 }|}qÖ|�r d| ¡ k�r | j
 t|||d�¡ |  dt ddd¡¡ |d9 }d}| j
 t|||d�¡ ||k�sÄt‚d S )N)r+   rW   c                    s   g | ]}t ˆˆ |  ƒ‘qS r>   )Úround)rc   rx   ©r$  r–   r>   r?   rg   ¨  s     z!Stem.__init__.<locals>.<listcomp>r  rª   r+   r   rW   FTr    r   ©Únum_chsÚ	reductionÚmodule)rr   r—   Úmaxrž   r®   )rœ   r�   r~   rŽ   r   r€   rh   rt   ru   r—   Úfeature_inforŠ   ri   r�   r   r  rQ   Z
add_moduleÚlowerr9   Z	MaxPool2d)r¡   r•   r–   rr   r—   rž   r"  r#  r$  rš   rH   Ú	prev_featZstem_stridesZstem_norm_actsÚprev_chsZcurr_striderx   Úchr,   ÚnaÚlayer_fnZ	conv_namer¢   r&  r?   r�   ”  sB    

"zStem.__init__)r®   rW   rE   r®   Nr!  N)
r5   r6   r7   r<   r8   r	   r=   rŽ   r�   r§   r>   r>   r¢   r?   r   ’  s$          öör   rª   Ústem)r•   r–   rD   Ú	pool_typeÚfeat_prefixrš   c           	         sb  |pt ƒ }|dkst‚d|krDd|kr*dnd }t| |d|||d�}näd|krpt| d| d	 |d |f||d
�}n¸d|krŽt| |dd||d�}nšd|kr¨t| |d|d�}n€d|krÄt| |dd|d�}ndd|krú|ræt| |dd||d�}n|j| |ddd�}n.|�rt| |dd||d�}n|j| |ddd�}t|tƒ�rJ‡ fdd„|jD ƒ}nt|dˆ d�g}||fS )N)	rª   ÚquadÚquad2ÚtieredÚdeeprb   rq   Ú7x7rC   r6  r7  r+   rW   )r"  r#  rž   rš   r8  r®   rm   )rž   rš   r9  r.   )r"  r$  rž   rš   rb   )r—   rš   rq   )rr   r—   rš   r:  é   r   )r"  rž   rš   ©r—   c              	      s&   g | ]}t |d  ˆ |d g¡d�‘qS )Ú.r*  )r*  )rQ   Újoin)rc   Úf©r5  r>   r?   rg   ñ  s     z$create_byob_stem.<locals>.<listcomp>r'  )	rŽ   r~   r   rÚ   r  r�   r   r,  rQ   )	r•   r–   rD   r4  r5  rš   r#  r3  r,  r>   r@  r?   r&   Ë  s0    
$r+   c                    s"   | d krd S t ‡ fdd„| D ƒƒS )Nc                    s   g | ]}|ˆ  ‘qS r>   r>   ©rc   r,   r<  r>   r?   rg   ø  s     z$reduce_feat_size.<locals>.<listcomp>)rh   )r  r—   r>   r<  r?   Úreduce_feat_size÷  s    rB  c                 C   s   | dk	r| n|}|pi S )a2   Override model level attn/self-attn/block kwargs w/ block level

    NOTE: kwargs are NOT merged across levels, block_kwargs will fully replace model_kwargs
    for the block if set to anything that isn't None.

    i.e. an empty block_kwargs dict will remove kwargs set at model level for that block
    Nr>   )r4   Zmodel_kwargsZ
out_kwargsr>   r>   r?   Úoverride_kwargsû  s    rC  )r4   Ú	block_cfgÚ	model_cfgc           
      C   sü   | d }|j d k	}|s |jd k	rr|r0|j s0d }n6t|j|jƒ}|j pH|j }|d k	rbtt|ƒf|Žnd }t||d�}|jd k	}|sŠ|jd k	rÜ|rš|jsšd }n6t|j|jƒ}	|jp²|j}|d k	rÌtt|ƒf|	Žnd }t||d�}|| d< |  t|j	|j	ƒ¡ d S )Nrš   )r’   ©r“   )
r0   r1   rC  r   r   r   r2   r3   Úupdater4   )
r4   rD  rE  Z	layer_fnsZattn_setr0   r1   Zself_attn_setr2   r3   r>   r>   r?   Úupdate_block_kwargs  s,    



ÿÿrH  )r‰   rµ   Úoutput_strideÚ	stem_featr  rš   Úblock_kwargs_fnc                 C   sà  |pt ƒ }g }dd„ | jD ƒ}dd„ |D ƒ}	dd„ t d|t|	ƒ¡ |	¡D ƒ}
d}|d }|d }|}g }t|ƒD �]R\}}|d j}|dkrœ|rœ| |¡ ||kr¸|dkr¸||9 }d}||9 }|d	krÌdnd
}g }t|ƒD ]Ä\}}t	|j
| j ƒ}|j}t|tƒ�r|||ƒ}t|||dk�r$|nd||f||j| j|
| | |d�	}|jdk�r\||d< |||| d� |t|jf|Žg7 }|}|}|dkrÜ|dkrÜt||ƒ}qÜ|tj|Ž g7 }t||d|› �d�}qr| |¡ tj|Ž |fS )Nc                 S   s   g | ]}t |ƒ‘qS r>   )rŒ   rA  r>   r>   r?   rg   7  s     z&create_byob_stages.<locals>.<listcomp>c                 S   s   g | ]}t d d„ |D ƒƒ‘qS )c                 S   s   g | ]
}|j ‘qS r>   r†   )rc   Úbcr>   r>   r?   rg   8  s     z1create_byob_stages.<locals>.<listcomp>.<listcomp>)Úsum)rc   Z	stage_bcsr>   r>   r?   rg   8  s     c                 S   s   g | ]}|  ¡ ‘qS r>   )Útolist)rc   r¥   r>   r>   r?   rg   9  s     r   r   r)  r(  )r   r+   r+   )	r•   r–   r—   r˜   rf   r±   rB   rµ   rš   rF  r  )rD  rE  zstages.r'  )rŽ   r@   rù   ZlinspacerM  ÚsplitrŠ   r,   r  r   r*   rI   r-   r   r   rQ   r/   rB   r(   r'   rB  r9   Ú
Sequential)r‰   rµ   rI  rJ  r  rš   rK  r,  r‹   ZdepthsZdprr˜   Z
net_strider/  r.  ÚstagesZ	stage_idxZstage_block_cfgsr—   Zfirst_dilationr@   Z	block_idxrD  r–   rf   r4   r>   r>   r?   Úcreate_byob_stages+  s`    

"



÷
rR  rˆ   c                 C   sz   t | jƒ}t| j|d�}tt| j|d�}| jrBtt| jƒf| jŽnd }| j	r`tt| j	ƒf| j
Žnd }t|||||d�}|S )N)rN   rM   )r�   r�   r‘   r’   r“   )r   rM   r   rN   r   r   r0   r   r1   r2   r3   rŽ   )r‰   r‘   r�   r�   r’   r“   r2  r>   r>   r?   Úget_layer_fnsk  s    
rS  c                       sª   e Zd ZdZdeeeeeeeee	eef f  e
e
ed	œ	‡ fd
d„Zejjddd„ƒZejjddd„ƒZejjdd„ ƒZddd„Zdd„ Zd edœdd„Zdd„ Z‡  ZS )!r#   a#   'Bring-your-own-blocks' Net

    A flexible network backbone that allows building model stem + blocks via
    dataclass cfg definition w/ factory functions for module instantiation.

    Current assumption is that both stem and blocks are in conv-bn-act order (w/ block ending in act).
    éè  r®   r©   rG   Nr°   T)	r‰   Únum_classesÚin_chansÚglobal_poolrI  Úimg_sizeÚ	drop_raterµ   rK   c
                    s”  t ƒ  ¡  || _|| _d| _t|f|
Ž}t|ƒ}|jrF|dk	sFtdƒ‚|dk	rVt	|ƒnd}g | _
tt|jpt|jd j|j ƒƒ}t|||j|j|d�\| _}| j
 |dd… ¡ t||d d d�}t||||d ||d	�\| _}| j
 |dd… ¡ |d d
 }|j�r4tt|j|j ƒƒ| _| || jd¡| _n|| _t ¡ | _|  j
t| j|d d dd�g7  _
t| j||| jd�| _ t!t"t#|	d�| ƒ dS )a_  
        Args:
            cfg: Model architecture configuration.
            num_classes: Number of classifier classes.
            in_chans: Number of input channels.
            global_pool: Global pooling type.
            output_stride: Output stride of network, one of (8, 16, 32).
            img_size: Image size for fixed image size models (i.e. self-attn).
            drop_rate: Classifier dropout rate.
            drop_path_rate: Stochastic depth drop-path rate.
            zero_init_last: Zero-init last weight of residual path.
            **kwargs: Extra kwargs overlayed onto cfg.
        FNz8img_size argument is required for fixed input size modelr   )rš   r  r)  r<  )rš   r  r(  r   Ú
final_convr'  )r4  rY  r¾   )$rœ   r�   rU  rY  Úgrad_checkpointingr   rS  rL   r~   r   r,  r<   r%  rH   r@   r*   rI   r&   rD   rF   r3  ÚextendrB  rR  rQ  rJ   r�   rZ  r9   rŸ   rQ   r   Úheadr   r   Ú_init_weights)r¡   r‰   rU  rV  rW  rI  rX  rY  rµ   rK   r‚   rš   r  rH   rJ  Z
stage_featr/  r¢   r>   r?   r�   }  sN    
 ú
ÿüzByobNet.__init__Fc                 C   s    t d|rdndd fdgd�}|S )Nz^stemz^stages\.(\d+)z^stages\.(\d+)\.(\d+))z^final_conv)iŸ† )r3  r@   rP   )r¡   ZcoarseZmatcherr>   r>   r?   Úgroup_matcherÆ  s    þþzByobNet.group_matcherc                 C   s
   || _ d S rO   )r[  )r¡   Úenabler>   r>   r?   Úset_grad_checkpointingÑ  s    zByobNet.set_grad_checkpointingc                 C   s   | j jS rO   )r]  Úfc)r¡   r>   r>   r?   Úget_classifierÕ  s    zByobNet.get_classifierc                 C   s   | j  ||¡ d S rO   )r]  Úreset)r¡   rU  rW  r>   r>   r?   Úreset_classifierÙ  s    zByobNet.reset_classifierc                 C   s@   |   |¡}| jr(tj ¡ s(t| j|ƒ}n
|  |¡}|  |¡}|S rO   )r3  r[  rù   ÚjitZis_scriptingr    rQ  rZ  r¤   r>   r>   r?   Úforward_featuresÜ  s    


zByobNet.forward_features©Ú
pre_logitsc                 C   s   | j ||d�S )Nrh  )r]  )r¡   r¥   ri  r>   r>   r?   Úforward_headå  s    zByobNet.forward_headc                 C   s   |   |¡}|  |¡}|S rO   )rg  rj  r¤   r>   r>   r?   r¦   è  s    

zByobNet.forward)rT  r®   r©   rG   Nr°   r°   T)F)T)r©   )F)r5   r6   r7   rË   r$   r<   r8   r	   r
   r   r=   rU   r�   rù   rf  Úignorer_  ra  rc  re  rg  rj  r¦   r§   r>   r>   r¢   r?   r#   u  s<   
        ööI


	c                 C   sà   t | tjƒrb| jd | jd  | j }|| j }| jj dt	 
d| ¡¡ | jd k	rÜ| jj ¡  nzt | tjƒrœtjj| jddd� | jd k	rÜtj | j¡ n@t | tjƒrÆtj | j¡ tj | j¡ nt| dƒrÜ| j|d� d S )	Nr   r   ç       @r°   g{®Gáz„?)Úmeanr  rÉ   r¾   )r   r9   rà   rr   rÞ   ra   rÀ   rï   rè   Úmathr	  rß   Zzero_ZLinearrÅ   rÆ   rç   Zones_rÇ   rÉ   )r*  ró   rK   Zfan_outr>   r>   r?   r^  î  s    



r^  r  r]   r.   )r(   r)   r*   r,   r-   r/   éÀ   r  rX   i€  g      Ð?é   ç      @rW   rG   i 
  )r@   rH   rF   rJ   é0   r®   r;  i€  i0  r^   é   i€  )r+   rW   é   r   )ç      è?ru  ru  ç      @)r)   rd   rb   )r@   rD   rH   )r   r   r   rv  r\   )ç      ø?rw  rw  g      @)r.   r.   r.   rv  )rd   )rl  rl  rl  ç      @)rd   ra   )rv  rv  rv  ç      @)rq  rq  rq  ry  )rm   rt  é   r   rp   g      °?)Úrd_ratioZ
rd_divisor)r@   rD   rH   r0   r1   r_   i   r7  i   Zsilu)r@   rH   rD   rF   rJ   rM   r  )r(   r)   r*   r,   r-   r/   r4   r6  T)rÍ   )r@   rH   rD   rF   rJ   rM   r4   i   r8  rE   )r@   rH   rD   rF   rM   Zgca)r@   rH   rD   rF   rM   r0   ZecaÚbatrm   )Ú
block_size)r@   rH   rD   rF   rM   r0   r1   i   )r@   rH   rD   rF   rJ   rM   r0   )r(   r)   r*   r,   r/   )r@   rH   rD   rF   r0   rY   é`   é   é   )r{  )rÎ   r³   )	r@   rH   rF   rB   rJ   rM   r0   r1   r4   i   )
r@   rH   rD   rF   rB   rJ   rM   r0   r1   r4   re   )
r@   rH   rF   rB   rJ   rM   rN   r0   r1   r4   r9  )r@   rH   rD   rF   rB   rJ   rM   rN   r0   r1   r4   )ru  r.   r.   rl  )rd   ro   rq   )rw  rw  rl  rv  )rw  rl  rv  rx  )rl  rv  rq  rx  )rq  ç      @r�  rx  )r   r   rp  r   )rd   rv   ))Úgernet_lÚgernet_mÚgernet_sÚ	repvgg_a0Ú	repvgg_a1Ú	repvgg_a2Ú	repvgg_b0Ú	repvgg_b1Úrepvgg_b1g4Ú	repvgg_b2Úrepvgg_b2g4Ú	repvgg_b3Úrepvgg_b3g4Úrepvgg_d2seÚ	resnet51qÚ	resnet61qÚresnext26tsÚgcresnext26tsÚseresnext26tsÚeca_resnext26tsÚbat_resnext26tsÚ
resnet32tsÚ
resnet33tsÚgcresnet33tsÚseresnet33tsÚeca_resnet33tsÚgcresnet50tÚgcresnext50tsÚregnetz_b16Úregnetz_c16Úregnetz_d32Ú
regnetz_d8Ú
regnetz_e8Úregnetz_b16_evosÚregnetz_c16_evosÚregnetz_d8_evosÚmobileone_s0Úmobileone_s1Úmobileone_s2Úmobileone_s3Úmobileone_s4c                 K   s$   t t| |ft|  tdd�dœ|—ŽS )NT)Zflatten_sequential)rE  Zfeature_cfg)r   r#   Ú
model_cfgsrQ   )ÚvariantÚ
pretrainedr‚   r>   r>   r?   Ú_create_byobnetÒ  s      ÿýür®  c                 K   s   | dddddt tdddœ
|–S )	NrT  ©r®   éà   r°  ©r;  r;  ç      ì?Zbilinearú	stem.convúhead.fc©
ÚurlrU  Ú
input_sizeÚ	pool_sizeÚcrop_pctÚinterpolationrm  r  Ú
first_convÚ
classifierr   ©r¶  r‚   r>   r>   r?   Ú_cfgÚ  s          üûr¾  c                 K   s   | dddddt tdddœ
|–S )	NrT  ©r®   r^   r^   ©rm   rm   çÍÌÌÌÌÌì?Zbicubiczstem.conv1.convr´  rµ  r   r½  r>   r>   r?   Ú_cfgrä  s          üûrÂ  ztimm/)Ú	hf_hub_idr¿  rÀ  )rÃ  r·  r¸  )zstem.conv_kxk.convzstem.conv_1x1.convZmit)rÃ  r»  Úlicense)r®   é@  rÅ  )rn   rn   )rÃ  r»  rÄ  r·  r¸  r¹  zkhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/resnet51q_ra2-d47dcc76.pthz
stem.conv1)r®   r€  r€  )rÃ  r¶  r»  r·  r¸  Útest_input_sizeÚtest_crop_pctzkhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/resnet61q_ra2-6afc536c.pth)rÃ  r¶  rÆ  rÇ  zvhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/resnext26ts_256_ra2-8bbd9106.pthzthttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/seresnext26ts_256-6f0d74a3.pthzthttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/gcresnext26ts_256-e414378b.pthzvhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/eca_resnext26ts_256-5a1d030f.pthzvhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/bat_resnext26ts_256-fa6fd595.pth)rÃ  r¶  Zmin_input_sizezqhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/resnet32ts_256-aacf5250.pthzqhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/resnet33ts_256-e91b09a4.pthzshttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/gcresnet33ts_256-0e0cd345.pthzshttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/seresnet33ts_256-f8ad44d9.pthzuhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/eca_resnet33ts_256-8f98face.pthzrhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/gcresnet50t_256-96374d1c.pthzthttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/gcresnext50ts_256-3e0f515e.pthzphttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/regnetz_b_raa-677d9606.pthr³  )r!  r!  r!  r¯  r±  g®Gázî?)
rÃ  r¶  r»  rm  r  r·  r¸  r¹  rÆ  rÇ  zuhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/regnetz_c_rab2_256-a54bf36a.pth)rÃ  r¶  r»  rm  r  r¹  rÆ  rÇ  zthttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/regnetz_d_rab_256-b8073a89.pthgffffffî?)rÃ  r¶  rm  r  r¹  rÆ  zphttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/regnetz_d8_bh-afc03c55.pth)rÃ  r¶  rm  r  r¹  rÆ  rÇ  zphttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/regnetz_e8_bh-aace8e6e.pth)r»  rm  r  r·  r¸  r¹  rÆ  zuhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/regnetz_c16_evos_ch-d8311942.pth)rÃ  r¶  r»  rm  r  r¹  rÆ  zthttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/regnetz_d8_evos_ch-2bc12646.pthr²  )zstem.conv_kxk.0.convzstem.conv_scale.conv)rÃ  r¹  r»  rÁ  ))zgernet_s.idstcv_in1kzgernet_m.idstcv_in1kzgernet_l.idstcv_in1kzrepvgg_a0.rvgg_in1kzrepvgg_a1.rvgg_in1kzrepvgg_a2.rvgg_in1kzrepvgg_b0.rvgg_in1kzrepvgg_b1.rvgg_in1kzrepvgg_b1g4.rvgg_in1kzrepvgg_b2.rvgg_in1kzrepvgg_b2g4.rvgg_in1kzrepvgg_b3.rvgg_in1kzrepvgg_b3g4.rvgg_in1kzrepvgg_d2se.rvgg_in1kzresnet51q.ra2_in1kzresnet61q.ra2_in1kzresnext26ts.ra2_in1kzseresnext26ts.ch_in1kzgcresnext26ts.ch_in1kzeca_resnext26ts.ch_in1kzbat_resnext26ts.ch_in1kzresnet32ts.ra2_in1kzresnet33ts.ra2_in1kzgcresnet33ts.ra2_in1kzseresnet33ts.ra2_in1kzeca_resnet33ts.ra2_in1kzgcresnet50t.ra2_in1kzgcresnext50ts.ch_in1kzregnetz_b16.ra3_in1kzregnetz_c16.ra3_in1kzregnetz_d32.ra3_in1kzregnetz_d8.ra3_in1kzregnetz_e8.ra3_in1kzregnetz_b16_evos.untrainedzregnetz_c16_evos.ch_in1kzregnetz_d8_evos.ch_in1kzmobileone_s0.apple_in1kzmobileone_s1.apple_in1kzmobileone_s2.apple_in1kzmobileone_s3.apple_in1kzmobileone_s4.apple_in1krö   c                 K   s   t dd| i|—ŽS )z” GEResNet-Large (GENet-Large from official impl)
    `Neural Architecture Design for GPU-Efficient Networks` - https://arxiv.org/abs/2006.14090
    r‚  r­  )r‚  ©r®  ©r­  r‚   r>   r>   r?   r‚  ›  s    r‚  c                 K   s   t dd| i|—ŽS )z– GEResNet-Medium (GENet-Normal from official impl)
    `Neural Architecture Design for GPU-Efficient Networks` - https://arxiv.org/abs/2006.14090
    rƒ  r­  )rƒ  rÈ  rÉ  r>   r>   r?   rƒ  £  s    rƒ  c                 K   s   t dd| i|—ŽS )z“ EResNet-Small (GENet-Small from official impl)
    `Neural Architecture Design for GPU-Efficient Networks` - https://arxiv.org/abs/2006.14090
    r„  r­  )r„  rÈ  rÉ  r>   r>   r?   r„  «  s    r„  c                 K   s   t dd| i|—ŽS )z^ RepVGG-A0
    `Making VGG-style ConvNets Great Again` - https://arxiv.org/abs/2101.03697
    r…  r­  )r…  rÈ  rÉ  r>   r>   r?   r…  ³  s    r…  c                 K   s   t dd| i|—ŽS )z^ RepVGG-A1
    `Making VGG-style ConvNets Great Again` - https://arxiv.org/abs/2101.03697
    r†  r­  )r†  rÈ  rÉ  r>   r>   r?   r†  »  s    r†  c                 K   s   t dd| i|—ŽS )z^ RepVGG-A2
    `Making VGG-style ConvNets Great Again` - https://arxiv.org/abs/2101.03697
    r‡  r­  )r‡  rÈ  rÉ  r>   r>   r?   r‡  Ã  s    r‡  c                 K   s   t dd| i|—ŽS )z^ RepVGG-B0
    `Making VGG-style ConvNets Great Again` - https://arxiv.org/abs/2101.03697
    rˆ  r­  )rˆ  rÈ  rÉ  r>   r>   r?   rˆ  Ë  s    rˆ  c                 K   s   t dd| i|—ŽS )z^ RepVGG-B1
    `Making VGG-style ConvNets Great Again` - https://arxiv.org/abs/2101.03697
    r‰  r­  )r‰  rÈ  rÉ  r>   r>   r?   r‰  Ó  s    r‰  c                 K   s   t dd| i|—ŽS )z` RepVGG-B1g4
    `Making VGG-style ConvNets Great Again` - https://arxiv.org/abs/2101.03697
    rŠ  r­  )rŠ  rÈ  rÉ  r>   r>   r?   rŠ  Û  s    rŠ  c                 K   s   t dd| i|—ŽS )z^ RepVGG-B2
    `Making VGG-style ConvNets Great Again` - https://arxiv.org/abs/2101.03697
    r‹  r­  )r‹  rÈ  rÉ  r>   r>   r?   r‹  ã  s    r‹  c                 K   s   t dd| i|—ŽS )z` RepVGG-B2g4
    `Making VGG-style ConvNets Great Again` - https://arxiv.org/abs/2101.03697
    rŒ  r­  )rŒ  rÈ  rÉ  r>   r>   r?   rŒ  ë  s    rŒ  c                 K   s   t dd| i|—ŽS )z^ RepVGG-B3
    `Making VGG-style ConvNets Great Again` - https://arxiv.org/abs/2101.03697
    r�  r­  )r�  rÈ  rÉ  r>   r>   r?   r�  ó  s    r�  c                 K   s   t dd| i|—ŽS )z` RepVGG-B3g4
    `Making VGG-style ConvNets Great Again` - https://arxiv.org/abs/2101.03697
    rŽ  r­  )rŽ  rÈ  rÉ  r>   r>   r?   rŽ  û  s    rŽ  c                 K   s   t dd| i|—ŽS )z` RepVGG-D2se
    `Making VGG-style ConvNets Great Again` - https://arxiv.org/abs/2101.03697
    r�  r­  )r�  rÈ  rÉ  r>   r>   r?   r�    s    r�  c                 K   s   t dd| i|—ŽS )ú
    r�  r­  )r�  rÈ  rÉ  r>   r>   r?   r�    s    r�  c                 K   s   t dd| i|—ŽS )rÊ  r‘  r­  )r‘  rÈ  rÉ  r>   r>   r?   r‘    s    r‘  c                 K   s   t dd| i|—ŽS )rÊ  r’  r­  )r’  rÈ  rÉ  r>   r>   r?   r’    s    r’  c                 K   s   t dd| i|—ŽS )rÊ  r“  r­  )r“  rÈ  rÉ  r>   r>   r?   r“     s    r“  c                 K   s   t dd| i|—ŽS )rÊ  r”  r­  )r”  rÈ  rÉ  r>   r>   r?   r”  '  s    r”  c                 K   s   t dd| i|—ŽS )rÊ  r•  r­  )r•  rÈ  rÉ  r>   r>   r?   r•  .  s    r•  c                 K   s   t dd| i|—ŽS )rÊ  r–  r­  )r–  rÈ  rÉ  r>   r>   r?   r–  5  s    r–  c                 K   s   t dd| i|—ŽS )rÊ  r—  r­  )r—  rÈ  rÉ  r>   r>   r?   r—  <  s    r—  c                 K   s   t dd| i|—ŽS )rÊ  r˜  r­  )r˜  rÈ  rÉ  r>   r>   r?   r˜  C  s    r˜  c                 K   s   t dd| i|—ŽS )rÊ  r™  r­  )r™  rÈ  rÉ  r>   r>   r?   r™  J  s    r™  c                 K   s   t dd| i|—ŽS )rÊ  rš  r­  )rš  rÈ  rÉ  r>   r>   r?   rš  Q  s    rš  c                 K   s   t dd| i|—ŽS )rÊ  r›  r­  )r›  rÈ  rÉ  r>   r>   r?   r›  X  s    r›  c                 K   s   t dd| i|—ŽS )rÊ  rœ  r­  )rœ  rÈ  rÉ  r>   r>   r?   rœ  _  s    rœ  c                 K   s   t dd| i|—ŽS )rÊ  r�  r­  )r�  rÈ  rÉ  r>   r>   r?   r�  f  s    r�  c                 K   s   t dd| i|—ŽS )rÊ  rž  r­  )rž  rÈ  rÉ  r>   r>   r?   rž  m  s    rž  c                 K   s   t dd| i|—ŽS )rÊ  rŸ  r­  )rŸ  rÈ  rÉ  r>   r>   r?   rŸ  t  s    rŸ  c                 K   s   t dd| i|—ŽS )rÊ  r   r­  )r   rÈ  rÉ  r>   r>   r?   r   {  s    r   c                 K   s   t dd| i|—ŽS )rÊ  r¡  r­  )r¡  rÈ  rÉ  r>   r>   r?   r¡  ‚  s    r¡  c                 K   s   t dd| i|—ŽS )rÊ  r¢  r­  )r¢  rÈ  rÉ  r>   r>   r?   r¢  ‰  s    r¢  c                 K   s   t dd| i|—ŽS )rÊ  r£  r­  )r£  rÈ  rÉ  r>   r>   r?   r£  �  s    r£  c                 K   s   t dd| i|—ŽS )rÊ  r¤  r­  )r¤  rÈ  rÉ  r>   r>   r?   r¤  —  s    r¤  c                 K   s   t dd| i|—ŽS )rÊ  r¥  r­  )r¥  rÈ  rÉ  r>   r>   r?   r¥  ž  s    r¥  c                 K   s   t dd| i|—ŽS )rÊ  r¦  r­  )r¦  rÈ  rÉ  r>   r>   r?   r¦  ¥  s    r¦  c                 K   s   t dd| i|—ŽS )rÊ  r§  r­  )r§  rÈ  rÉ  r>   r>   r?   r§  ¬  s    r§  c                 K   s   t dd| i|—ŽS )rÊ  r¨  r­  )r¨  rÈ  rÉ  r>   r>   r?   r¨  ³  s    r¨  c                 K   s   t dd| i|—ŽS )rÊ  r©  r­  )r©  rÈ  rÉ  r>   r>   r?   r©  º  s    r©  c                 K   s   t dd| i|—ŽS )rÊ  rª  r­  )rª  rÈ  rÉ  r>   r>   r?   rª  Á  s    rª  )rV   rZ   r   )rl   rZ   r>   r   )r   F)rª   rª   r3  N)r+   )rª   F)F)rª   )rª   )F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)rË   rn  Údataclassesr   r   r   Ú	functoolsr   Útypingr   r   r   r	   r
   r   r   r   rù   Ztorch.nnr9   Z	timm.datar   r   Ztimm.layersr   r   r   r   r   r   r   r   r   r   r   r   Z_builderr   Z_manipulater   r    Ú	_registryr!   r"   Ú__all__r%   r$   rk   ry   r8   r<   rU   r„   rŒ   r�   rŽ   r:   r”   r¬   r­   rÌ   rÔ   rØ   rÚ   r  r  rQ   r  r  r'   rP  r   r&   rB  rC  rH  r=   rR  rS  r#   r^  r«  r®  r¾  rÂ  Zdefault_cfgsr‚  rƒ  r„  r…  r†  r‡  rˆ  r‰  rŠ  r‹  rŒ  r�  rŽ  r�  r�  r‘  r’  r“  r”  r•  r–  r—  r˜  r™  rš  r›  rœ  r�  rž  rŸ  r   r¡  r¢  r£  r¤  r¥  r¦  r§  r¨  r©  rª  r>   r>   r>   r?   Ú<module>   sœ  (8	 ý
û 		
ú:EBA $ >Eù<   úú,)ù
ù@
yûöûöûö
ý
ý
ýýý
ýý
ýý
ý

û
üõüôüöüõüõüõüôüõüõüôüôüôüöüõü
òü
òü
ñü
ñü
ñü

ñü

ñü

ð
ýýýý
ý€ € € ¶   U

 þ þ þ þ þ þ þ þ þ þ   ý   ü ý ý ý ý ýý ý ý ý ý ý ý ý      ü    ü   ý    ý    ý     þ   ü    ýýýýýý€ Û .