U
    ¯Ê¹jÏ^  ã                   @   sŽ  d Z ddlmZ ddlmZ ddlmZ ddl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 dd	lmZ dd
lmZ ddlmZmZ ddlmZ dgZG dd„ de	jƒZG dd„ de	jƒZG dd„ de	jƒZG dd„ de	jƒZ dd„ Z!edAee"e"f e#dœdd„ƒZ$G dd„ de	jƒZ%dBdd„Z&dCd d!„Z'ee'd"d#�e'd"d$d%�e'd"d&d$d'd(�e'd"d#�e'd"d$d%�e'd"d&d$d'd(�e'd"d#�e'd"d$d%�e'd"d#�e'd"d#�e'd"d#�d)œƒZ(edDe%d*œd+d,„ƒZ)edEe%d*œd-d.„ƒZ*edFe%d*œd/d0„ƒZ+edGe%d*œd1d2„ƒZ,edHe%d*œd3d4„ƒZ-edIe%d*œd5d6„ƒZ.edJe%d*œd7d8„ƒZ/edKe%d*œd9d:„ƒZ0edLe%d*œd;d<„ƒZ1edMe%d*œd=d>„ƒZ2edNe%d*œd?d@„ƒZ3dS )Oa€   CrossViT Model

@inproceedings{
    chen2021crossvit,
    title={{CrossViT: Cross-Attention Multi-Scale Vision Transformer for Image Classification}},
    author={Chun-Fu (Richard) Chen and Quanfu Fan and Rameswar Panda},
    booktitle={International Conference on Computer Vision (ICCV)},
    year={2021}
}

Paper link: https://arxiv.org/abs/2103.14899
Original code: https://github.com/IBM/CrossViT/blob/main/models/crossvit.py

NOTE: model names have been renamed from originals to represent actual input res all *_224 -> *_240 and *_384 -> *_408

Modifications and additions for timm hacked together by / Copyright 2021, Ross Wightman
é    )Úpartial)ÚList)ÚTupleN©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)ÚDropPathÚ	to_2tupleÚtrunc_normal_Ú_asserté   )Úbuild_model_with_cfg)Úregister_notrace_function)Úregister_modelÚgenerate_default_cfgs)ÚBlockÚCrossVitc                       s*   e Zd ZdZd‡ fdd„	Zd	d
„ Z‡  ZS )Ú
PatchEmbedz Image to Patch Embedding
    éà   é   é   é   Fc                    sP  t ƒ  ¡  t|ƒ}t|ƒ}|d |d  |d |d   }|| _|| _|| _|�r8|d dkrÄt tj||d dddd�tj	dd	�tj|d |d
 dddd�tj	dd	�tj|d
 |dddd�¡| _
nr|d dk�rLt tj||d dddd�tj	dd	�tj|d |d
 dd
dd�tj	dd	�tj|d
 |dd
dd�¡| _
ntj||||d�| _
d S )Nr   r   é   é   é   r   )Úkernel_sizeÚstrideÚpaddingT)Zinplaceé   r   )r   r   )ÚsuperÚ__init__r	   Úimg_sizeÚ
patch_sizeÚnum_patchesÚnnÚ
SequentialZConv2dZReLUÚproj)Úselfr!   r"   Úin_chansÚ	embed_dimÚ
multi_convr#   ©Ú	__class__© úS/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/crossvit.pyr    1   s2    
 

û

ûzPatchEmbed.__init__c                 C   sž   |j \}}}}t|| jd kd|› d|› d| jd › d| jd › d�	ƒ t|| jd kd|› d|› d| jd › d| jd › d�	ƒ |  |¡ d¡ dd¡}|S )Nr   zInput image size (Ú*z) doesn't match model (r   z).r   )Úshaper   r!   r&   ÚflattenÚ	transpose)r'   ÚxÚBÚCÚHÚWr-   r-   r.   ÚforwardM   s    (ÿ(ÿzPatchEmbed.forward)r   r   r   r   F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r    r8   Ú__classcell__r-   r-   r+   r.   r   -   s   r   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )	ÚCrossAttentioné   Fç        c                    s‚   t ƒ  ¡  || _|| }|d | _tj|||d�| _tj|||d�| _tj|||d�| _t 	|¡| _
t ||¡| _t 	|¡| _d S )Ng      à¿)Úbias)r   r    Ú	num_headsÚscaler$   ÚLinearÚwqÚwkÚwvÚDropoutÚ	attn_dropr&   Ú	proj_drop)r'   ÚdimrB   Úqkv_biasrI   rJ   Zhead_dimr+   r-   r.   r    Y   s    

zCrossAttention.__init__c           	      C   sú   |j \}}}|  |d d …dd…df ¡ |d| j|| j ¡ dddd¡}|  |¡ ||| j|| j ¡ dddd¡}|  |¡ ||| j|| j ¡ dddd¡}|| dd¡ | j }|j	dd�}|  
|¡}||  dd¡ |d|¡}|  |¡}|  |¡}|S )	Nr   r   .r   r   éþÿÿÿéÿÿÿÿ©rK   )r0   rE   ZreshaperB   ZpermuterF   rG   r2   rC   ZsoftmaxrI   r&   rJ   )	r'   r3   r4   ÚNr5   ÚqÚkÚvÚattnr-   r-   r.   r8   n   s    <**


zCrossAttention.forward)r?   Fr@   r@   )r9   r:   r;   r    r8   r=   r-   r-   r+   r.   r>   X   s       úr>   c                       s8   e Zd Zdddddejejf‡ fdd„	Zdd„ Z‡  ZS )ÚCrossAttentionBlockç      @Fr@   c
           
         sF   t ƒ  ¡  |	|ƒ| _t|||||d�| _|dkr8t|ƒnt ¡ | _d S )N)rB   rL   rI   rJ   r@   )	r   r    Únorm1r>   rT   r   r$   ÚIdentityÚ	drop_path)
r'   rK   rB   Ú	mlp_ratiorL   rJ   rI   rY   Ú	act_layerÚ
norm_layerr+   r-   r.   r    ƒ   s    

ûzCrossAttentionBlock.__init__c                 C   s0   |d d …dd…df |   |  |  |¡¡¡ }|S )Nr   r   .)rY   rT   rW   )r'   r3   r-   r-   r.   r8   ›   s    ,zCrossAttentionBlock.forward)	r9   r:   r;   r$   ÚGELUÚ	LayerNormr    r8   r=   r-   r-   r+   r.   rU   �   s   örU   c                       sJ   e Zd Zddddejejf‡ fdd„	Zeej	 eej	 dœdd„Z
‡  ZS )ÚMultiScaleBlockFr@   c                    sr  t ƒ  ¡  t|ƒ}|| _t ¡ | _t|ƒD ]f}g }t|| ƒD ]2}| t	|| || || ||||	| |d�¡ q>t|ƒdkr*| j tj
|Ž ¡ q*t| jƒdkr¦d | _t ¡ | _t|ƒD ]j}|| ||d |  krädrät ¡ g}n,||| ƒ|
ƒ t || ||d |  ¡g}| j tj
|Ž ¡ q¸t ¡ | _t|ƒD ]ª}|d | }|| }|d dk�rŠ| j t|| ||| ||||	d |d�¡ nTg }t|d ƒD ]0}| t|| ||| ||||	d |d�¡ �qš| j tj
|Ž ¡ �q6t ¡ | _t|ƒD ]x}||d |  || k�r$d�r$t ¡ g}n4|||d |  ƒ|
ƒ t ||d |  || ¡g}| j tj
|Ž ¡ �qôd S )N)rK   rB   rZ   rL   rJ   rI   rY   r\   r   r   FrN   )r   r    ÚlenÚnum_branchesr$   Ú
ModuleListÚblocksÚrangeÚappendr   r%   ÚprojsrX   rD   ÚfusionrU   Úrevert_projs)r'   rK   ÚpatchesÚdepthrB   rZ   rL   rJ   rI   rY   r[   r\   ra   ÚdÚtmpÚiZd_ZnhÚ_r+   r-   r.   r    ¢   s‚    

ø


,
øÿø

 ÿzMultiScaleBlock.__init__)r3   Úreturnc                 C   s(  g }t | jƒD ]\}}| ||| ƒ¡ qtj ttj g ¡}t | jƒD ],\}}| ||| d d …dd…df ƒ¡ qHg }t t	| j
| jƒƒD ]–\}\}}	tj|| ||d | j  d d …dd …df fdd�}
||
ƒ}
|	|
d d …dd…df ƒ}tj||| d d …dd …df fdd�}
| |
¡ qŒ|S )Nr   r   .rO   )Ú	enumeraterc   re   ÚtorchÚjitZannotater   ÚTensorrf   Úziprg   rh   Úcatra   )r'   r3   Zouts_brm   ÚblockZproj_cls_tokenr&   Zoutsrg   Zrevert_projrl   Zreverted_proj_cls_tokenr-   r-   r.   r8   ù   s    &6(zMultiScaleBlock.forward)r9   r:   r;   r$   r]   r^   r    r   rq   rs   r8   r=   r-   r-   r+   r.   r_       s   	ôWr_   c                 C   s   dd„ t | |ƒD ƒS )Nc                 S   s(   g | ] \}}|d  | |d  | ‘qS )r   r   r-   )Ú.0rm   Úpr-   r-   r.   Ú
<listcomp>  s     z(_compute_num_patches.<locals>.<listcomp>)rt   )r!   ri   r-   r-   r.   Ú_compute_num_patches  s    rz   F)ÚssÚ
crop_scalec                 C   sÄ   | j dd… \}}||d ks*||d krÀ|rª|d |krª|d |krªtt||d  d ƒƒtt||d  d ƒƒ }}| dd…dd…|||d  …|||d  …f } ntjjj| |ddd�} | S )	a~  
    Pulled out of CrossViT.forward_features to bury conditional logic in a leaf node for FX tracing.
    Args:
        x (Tensor): input image
        ss (tuple[int, int]): height and width to scale to
        crop_scale (bool): whether to crop instead of interpolate to achieve the desired scale. Defaults to False
    Returns:
        Tensor: the "scaled" image batch tensor
    rM   Nr   r   ç       @ZbicubicF)ÚsizeÚmodeZalign_corners)r0   ÚintÚroundrq   r$   Z
functionalZinterpolate)r3   r{   r|   r6   r7   ÚcuÚclr-   r-   r.   Úscale_image  s    22r„   c                       sà   e Zd ZdZdddddddd	d
ddddddddeejdd�df‡ fdd„	Zdd„ Ze	j
j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ee	j d œd!d"„Zd+ee	j ee	jd#œd$d%„Zd&d'„ Z‡  ZS ),r   zI Vision Transformer with support for patch or hybrid CNN input stage
    r   )ç      ð?r…   )r?   r   r   éè  )éÀ   é€  )©r   r   r   r‰   r‰   )é   r   )r}   r}   rV   FTr@   g�íµ ÷Æ°>)ÚepsÚtokenc           !         sj  t ƒ  ¡  |dkst‚ˆˆ_|ˆ_t|ƒˆ_t|ƒ}‡fdd„|D ƒˆ_|ˆ_t	ˆj|ƒ}t
|ƒˆ_ˆ ˆ_tˆ ƒˆ_t ¡ ˆ_tˆjƒD ]X}tˆd|› �t t dd||  ˆ | ¡¡ƒ tˆd|› �t t ddˆ | ¡¡ƒ qˆtˆj|ˆ ƒD ]$\}}}ˆj t|||||
d�¡ qðtj|d�ˆ_td	d„ |D ƒƒ}d
d„ t d||¡D ƒ}d}t ¡ ˆ_t|ƒD ]b\}}t|d d… ƒ|d  }|||| … }t ˆ ||||	||||ˆd�
} ||7 }ˆj | ¡ �qdt ‡ ‡fdd„tˆjƒD ƒ¡ˆ_!t |¡ˆ_"t ‡ ‡fdd„tˆjƒD ƒ¡ˆ_#tˆjƒD ]6}t$t%ˆd|› �ƒdd� t$t%ˆd|› �ƒdd� �q"ˆ &ˆj'¡ d S )N©rŒ   Úavgc                    s$   g | ]‰ t ‡ fd d„ˆjD ƒƒ‘qS )c                    s   g | ]}t |ˆ  ƒ‘qS r-   )r€   )rw   Zsj©Úsir-   r.   ry   I  s     z0CrossVit.__init__.<locals>.<listcomp>.<listcomp>)Útupler!   )rw   ©r'   r�   r.   ry   I  s     z%CrossVit.__init__.<locals>.<listcomp>Ú
pos_embed_r   Ú
cls_token_)r!   r"   r(   r)   r*   )rx   c                 S   s   g | ]}t |d d… ƒ‘qS )rM   N)Úsum©rw   r3   r-   r-   r.   ry   b  s     c                 S   s   g | ]}|  ¡ ‘qS r-   )Úitemr–   r-   r-   r.   ry   c  s     r   rN   )rB   rZ   rL   rJ   rI   rY   r\   c                    s   g | ]}ˆˆ | ƒ‘qS r-   r-   ©rw   rm   )r)   r\   r-   r.   ry   x  s     c                    s,   g | ]$}ˆd kr t  ˆ | ˆ¡nt  ¡ ‘qS ©r   )r$   rD   rX   r˜   )r)   Únum_classesr-   r.   ry   z  s   ÿç{®Gáz”?©Ústd)(r   r    ÚAssertionErrorrš   Úglobal_poolr	   r!   Úimg_size_scaledr|   rz   r`   ra   r)   r•   Znum_featuresr$   rb   Úpatch_embedrd   ÚsetattrÚ	Parameterrq   Zzerosrt   re   r   rH   Úpos_dropZlinspacerc   rp   Úmaxr_   ÚnormÚ	head_dropÚheadr
   ÚgetattrÚapplyÚ_init_weights)!r'   r!   Ú	img_scaler"   r(   rš   r)   rj   rB   rZ   r*   r|   rL   Z	drop_rateZpos_drop_rateZproj_drop_rateZattn_drop_rateZdrop_path_rater\   rŸ   r#   rm   Zim_srx   rk   Ztotal_depthZdprZdpr_ptrÚidxZ	block_cfgZ
curr_depthZdpr_Úblkr+   )r)   r\   rš   r'   r.   r    ,  sr    




.(ûÿ	
ö"þ
zCrossVit.__init__c                 C   sr   t |tjƒrBt|jdd� t |tjƒrn|jd k	rntj |jd¡ n,t |tjƒrntj |jd¡ tj |jd¡ d S )Nr›   rœ   r   r…   )	Ú
isinstancer$   rD   r
   ÚweightrA   ÚinitZ	constant_r^   )r'   Úmr-   r-   r.   r«   „  s    zCrossVit._init_weightsc                 C   sZ   t ƒ }t| jƒD ]D}| d|› �¡ t| d|› �d ƒ}|d k	r|jr| d|› �¡ q|S )Nr”   r“   )Úsetrd   ra   Úaddr©   Zrequires_grad)r'   Úoutrm   Zper-   r-   r.   Úno_weight_decay�  s    zCrossVit.no_weight_decayc                 C   s   t dddgd�S )Nz ^cls_token|pos_embed|patch_embed)z^blocks\.(\d+)N)z^norm)iŸ† )Ústemrc   )Údict)r'   Zcoarser-   r-   r.   Úgroup_matcher—  s    þzCrossVit.group_matcherc                 C   s   |rt dƒ‚d S )Nz$gradient checkpointing not supported)rž   )r'   Úenabler-   r-   r.   Úset_grad_checkpointingž  s    zCrossVit.set_grad_checkpointingc                 C   s   | j S ©N)r¨   r’   r-   r-   r.   Úget_classifier¢  s    zCrossVit.get_classifierNc                    sF   ˆ ˆ_ |d k	r |dkst‚|ˆ_t ‡ ‡fdd„tˆjƒD ƒ¡ˆ_d S )Nr�   c                    s.   g | ]&}ˆ d kr"t  ˆj| ˆ ¡nt  ¡ ‘qS r™   )r$   rD   r)   rX   r˜   ©rš   r'   r-   r.   ry   ¬  s     z-CrossVit.reset_classifier.<locals>.<listcomp>)rš   rž   rŸ   r$   rb   rd   ra   r¨   )r'   rš   rŸ   r-   r¾   r.   Úreset_classifier¦  s    ÿÿzCrossVit.reset_classifier©ro   c           
         sâ   |j d }g ‰ t| jƒD ]�\}}|}| j| }t||| jƒ}||ƒ}|dkrR| jn| j}| |dd¡}t	j
||fdd�}|dkr†| jn| j}|| }|  |¡}ˆ  |¡ qt| jƒD ]\}}	|	ˆ ƒ‰ q´‡ fdd„t| jƒD ƒ‰ ˆ S )Nr   rN   r   rO   c                    s   g | ]\}}|ˆ | ƒ‘qS r-   r-   )rw   rm   r¦   ©Úxsr-   r.   ry   Ã  s     z-CrossVit.forward_features.<locals>.<listcomp>)r0   rp   r¡   r    r„   r|   Zcls_token_0Zcls_token_1Úexpandrq   ru   Zpos_embed_0Zpos_embed_1r¤   re   rc   r¦   )
r'   r3   r4   rm   r¡   Zx_r{   Z
cls_tokensÚ	pos_embedr®   r-   rÁ   r.   Úforward_features¯  s$    



zCrossVit.forward_features)rÂ   Ú
pre_logitsro   c                    s’   ˆ j dkrdd„ ˆD ƒndd„ ˆD ƒ‰‡ fdd„ˆD ƒ‰|sNtˆ jd tjƒrftjdd„ ˆD ƒdd	�S tjtj‡fd
d„t	ˆ jƒD ƒdd	�dd	�S )NrŽ   c                 S   s(   g | ] }|d d …dd …f j dd�‘qS )Nr   rO   )Úmeanr–   r-   r-   r.   ry   Ç  s     z)CrossVit.forward_head.<locals>.<listcomp>c                 S   s   g | ]}|d d …df ‘qS )Nr   r-   r–   r-   r-   r.   ry   Ç  s     c                    s   g | ]}ˆ   |¡‘qS r-   )r§   r–   r’   r-   r.   ry   È  s     r   c                 S   s   g | ]}|‘qS r-   r-   r–   r-   r-   r.   ry   Ê  s     r   rO   c                    s   g | ]\}}|ˆ | ƒ‘qS r-   r-   )rw   rm   r¨   rÁ   r-   r.   ry   Ë  s     )
rŸ   r¯   r¨   r$   rX   rq   ru   rÇ   Ústackrp   )r'   rÂ   rÆ   r-   )r'   rÂ   r.   Úforward_headÆ  s
    &zCrossVit.forward_headc                 C   s   |   |¡}|  |¡}|S r¼   )rÅ   rÉ   )r'   r3   rÂ   r-   r-   r.   r8   Í  s    

zCrossVit.forward)F)T)N)F)r9   r:   r;   r<   r   r$   r^   r    r«   rq   rr   Úignorer¶   r¹   r»   r½   r¿   r   rs   rÅ   ÚboolrÉ   r8   r=   r-   r-   r+   r.   r   (  sD   ìX	
	

	c                 K   s4   |  dd ¡rtdƒ‚dd„ }tt| |fd|i|—ŽS )NZfeatures_onlyz<features_only not implemented for Vision Transformer models.c                 S   sD   i }|   ¡ D ]2}d|ks d|kr.| dd¡}n|}| | ||< q|S )NrÄ   Z	cls_tokenÚ.rn   )ÚkeysÚreplace)Z
state_dictZnew_state_dictÚkeyZnew_keyr-   r-   r.   Úpretrained_filter_fn×  s    z._create_crossvit.<locals>.pretrained_filter_fnrÐ   )ÚgetÚRuntimeErrorr   r   )ÚvariantÚ
pretrainedÚkwargsrÐ   r-   r-   r.   Ú_create_crossvitÓ  s    
ýüûrÖ   Ú c                 K   s   | ddd dt tddddœ
|–S )Nr†   )r   éð   rØ   g      ì?T)zpatch_embed.0.projzpatch_embed.1.proj)zhead.0zhead.1)
Úurlrš   Ú
input_sizeZ	pool_sizeÚcrop_pctrÇ   r�   Zfixed_input_sizeÚ
first_convÚ
classifierr   )rÙ   rÕ   r-   r-   r.   Ú_cfgê  s         ûúrÞ   ztimm/)Ú	hf_hub_id)zpatch_embed.0.proj.0zpatch_embed.1.proj.0)rß   rÜ   )r   é˜  rà   r…   )rß   rÚ   rÜ   rÛ   )zcrossvit_15_240.in1kzcrossvit_15_dagger_240.in1kzcrossvit_15_dagger_408.in1kzcrossvit_18_240.in1kzcrossvit_18_dagger_240.in1kzcrossvit_18_dagger_408.in1kzcrossvit_9_240.in1kzcrossvit_9_dagger_240.in1kzcrossvit_base_240.in1kzcrossvit_small_240.in1kzcrossvit_tiny_240.in1krÀ   c              	   K   s^   t dddgddgdddgdddgdddggd	d	gdddgd
�}tf d| dœt |f|Ž—Ž}|S )N©r…   gÞÝÝÝÝÝí?r   r   é`   r‡   r   r   r   r   ©r¬   r"   r)   rj   rB   rZ   Úcrossvit_tiny_240©rÓ   rÔ   ©r¸   rÖ   ©rÔ   rÕ   Z
model_argsÚmodelr-   r-   r.   rä     s        þrä   c              	   K   s^   t dddgddgdddgdddgdddggd	d	gdddgd
�}tf d| dœt |f|Ž—Ž}|S )Nrá   r   r   r‡   rˆ   r   r   r   rŠ   rã   Úcrossvit_small_240rå   ræ   rç   r-   r-   r.   ré     s        þré   c              	   K   s^   t dddgddgdddgdddgdddggddgdddgd	�}tf d
| dœt |f|Ž—Ž}|S )Nrá   r   r   rˆ   r   r   r   r   rã   Úcrossvit_base_240rå   ræ   rç   r-   r-   r.   rê   %  s        þrê   c              	   K   s^   t dddgddgdddgdddgdddggd	d	gdddgd
�}tf d| dœt |f|Ž—Ž}|S )Nrá   r   r   é€   é   r   r   r   r   rã   Úcrossvit_9_240rå   ræ   rç   r-   r-   r.   rí   .  s        þrí   c              	   K   s^   t dddgddgdddgdddgdddggd	d	gd
d
dgd�}tf d| dœt |f|Ž—Ž}|S )Nrá   r   r   r‡   rˆ   r   é   r   rŠ   r   rã   Úcrossvit_15_240rå   ræ   rç   r-   r-   r.   rï   7  s        þrï   c              
   K   sf   t f dddgddgdddgdddgdddggd	d	gd
d
dgdœ|—Ž}tf d| dœt |f|Ž—Ž}|S )Nrá   r   r   r   éÀ  r   rŠ   r   r   r   rã   Úcrossvit_18_240rå   ræ   rç   r-   r-   r.   rñ   @  s        þþrñ   c              	   K   s`   t dddgddgdddgdddgdddggd	d	gdddgd
d�}tf d| dœt |f|Ž—Ž}|S )Nrá   r   r   rë   rì   r   r   r   r   T©r¬   r"   r)   rj   rB   rZ   r*   Úcrossvit_9_dagger_240rå   ræ   rç   r-   r-   r.   ró   I  s         þró   c              	   K   s`   t dddgddgdddgdddgdddggd	d	gd
d
dgdd�}tf d| dœt |f|Ž—Ž}|S )Nrá   r   r   r‡   rˆ   r   rî   r   rŠ   r   Trò   Úcrossvit_15_dagger_240rå   ræ   rç   r-   r-   r.   rô   R  s         þrô   c              	   K   s`   t dddgddgdddgdddgdddggd	d	gd
d
dgdd�}tf d| dœt |f|Ž—Ž}|S )N©r…   gî?r   r   r‡   rˆ   r   rî   r   rŠ   r   Trò   Úcrossvit_15_dagger_408rå   ræ   rç   r-   r-   r.   rö   [  s         þrö   c              	   K   s`   t dddgddgdddgdddgdddggd	d	gd
d
dgdd�}tf d| dœt |f|Ž—Ž}|S )Nrá   r   r   r   rð   r   rŠ   r   r   r   Trò   Úcrossvit_18_dagger_240rå   ræ   rç   r-   r-   r.   r÷   d  s         þr÷   c              	   K   s`   t dddgddgdddgdddgdddggd	d	gd
d
dgdd�}tf d| dœt |f|Ž—Ž}|S )Nrõ   r   r   r   rð   r   rŠ   r   r   r   Trò   Úcrossvit_18_dagger_408rå   ræ   rç   r-   r-   r.   rø   m  s         þrø   )F)F)r×   )F)F)F)F)F)F)F)F)F)F)F)4r<   Ú	functoolsr   Útypingr   r   rq   Z	torch.hubZtorch.nnr$   Z	timm.datar   r   Ztimm.layersr   r	   r
   r   Z_builderr   Z_features_fxr   Ú	_registryr   r   Zvision_transformerr   Ú__all__ÚModuler   r>   rU   r_   rz   r€   rË   r„   r   rÖ   rÞ   Zdefault_cfgsrä   ré   rê   rí   rï   rñ   ró   rô   rö   r÷   rø   r-   r-   r-   r.   Ú<module>   sœ   +)o ,

þ  þþ  þþæ