
    khv                        d Z ddlZddlmZ ddl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 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mZm Z  ddl!m"Z" dgZ#e G d dejH                               Z%ddZ& G d dejH                        Z' G d dejH                        Z( G d dejH                        Z) G d dejH                        Z* G d dejH                        Z+ G d dejH                        Z,d Z-ddZ.ddZ/ ei d  e/d!d"#      d$ e/d!d%#      d& e/d!d'd()      d* e/d!d+#      d, e/d!d-#      d. e/d!d/d()      d0 e/d!d1#      d2 e/d!d3#      d4 e/d!d5d()      d6 e/d!d7#      d8 e/d!d9#      d: e/d!d;d()      d< e/d!d=#      d> e/d!d?#      d@ e/d!dAd()      dB e/d!dC#      dD e/d!dE#      i dF e/d!dGd()      dH e/d!dI#      dJ e/d!dK#      dL e/d!dMd()      dN e/d!dO#      dP e/d!dQ#      dR e/d!dSd()      dT e/d!dU#      dV e/d!dW#      dX e/d!dYd()      dZ e/d!d[#      d\ e/d!d]#      d^ e/d!d_d()      d` e/d!da#      db e/d!dc#      dd e/d!ded()      df e/d!dg#       e/d!dh#       e/d!did()       e/d!dj#       e/d!dk#       e/d!dld()       e/d!dm#       e/d!dn#       e/d!dod()      dp      Z0eddqe,fdr       Z1eddqe,fds       Z2eddqe,fdt       Z3eddqe,fdu       Z4eddqe,fdv       Z5eddqe,fdw       Z6eddqe,fdx       Z7eddqe,fdy       Z8eddqe,fdz       Z9eddqe,fd{       Z:eddqe,fd|       Z;eddqe,fd}       Z<eddqe,fd~       Z=eddqe,fd       Z>eddqe,fd       Z?eddqe,fd       Z@eddqe,fd       ZAeddqe,fd       ZBeddqe,fd       ZCeddqe,fd       ZDeddqe,fd       ZEeddqe,fd       ZFeddqe,fd       ZGeddqe,fd       ZHeddqe,fd       ZIeddqe,fd       ZJeddqe,fd       ZKeddqe,fd       ZL e eMi dd$dd&dd,dd.dd2dd4dd8dd:dd>dd@ddDddFddJddLddPddRddVdXd\d^dbddddddddd       y)a]   Cross-Covariance Image Transformer (XCiT) in PyTorch

Paper:
    - https://arxiv.org/abs/2106.09681

Same as the official implementation, with some minor adaptations, original copyright below
    - https://github.com/facebookresearch/xcit/blob/master/xcit.py

Modifications and additions for timm hacked together by / Copyright 2021, Ross Wightman
    N)partial)ListOptionalTupleUnionIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)DropPathtrunc_normal_	to_2tupleuse_fused_attnMlp   )build_model_with_cfg)feature_take_indices)register_notrace_module)
checkpoint)register_modelgenerate_default_cfgsregister_model_deprecations)	ClassAttnXcitc                   8     e Zd ZdZd fd	ZdededefdZ xZS )PositionalEncodingFourierz
    Positional encoding relying on a fourier kernel matching the one used in the "Attention is all you Need" paper.
    Based on the official XCiT code
        - https://github.com/facebookresearch/xcit/blob/master/xcit.py
    c                     t         |           t        j                  |dz  |d      | _        dt
        j                  z  | _        || _        || _	        || _
        d| _        y )N   r   )kernel_sizeư>)super__init__nnConv2dtoken_projectionmathpiscaletemperature
hidden_dimdimeps)selfr)   r*   r(   	__class__s       L/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/models/xcit.pyr!   z"PositionalEncodingFourier.__init__)   sS     "		*q.#1 M[
&$    BHWc           
         | j                   j                  j                  }| j                   j                  j                  }t	        j
                  d|dz   |      j                  t        j                        j                  d      j                  dd|      }t	        j
                  d|dz   |      j                  t        j                        j                  d|d      }||d d dd d d f   | j                  z   z  | j                  z  }||d d d d dd f   | j                  z   z  | j                  z  }t	        j
                  | j                  |      j                  t        j                        }| j                  dt	        j                  |dd      z  | j                  z  z  }|d d d d d d d f   |z  }	|d d d d d d d f   |z  }
t	        j                  |	d d d d d d dd df   j!                         |	d d d d d d dd df   j#                         gd	      j%                  d
      }	t	        j                  |
d d d d d d dd df   j!                         |
d d d d d d dd df   j#                         gd	      j%                  d
      }
t	        j&                  |
|	fd
	      j)                  dd
dd      }| j                  |j                  |            }|j                  |ddd      S )Nr   )devicer   floor)rounding_moder      r*      )r$   weightr4   dtypetorcharangetofloat32	unsqueezerepeatr+   r'   r)   r(   divstacksincosflattencatpermute)r,   r0   r1   r2   r4   r<   y_embedx_embeddim_tpos_xpos_yposs               r.   forwardz!PositionalEncodingFourier.forward2   s   &&--44%%,,22,,q!a%7::5==ISSTUV]]^_abdef,,q!a%7::5==IPPQRTUWXYWQQY/$((:;djjHWQ23Y/$((:;djjHT__V<??N  Q5!7)S%SVZVeVe%ef1a&.1a&.U1aADqD=1557q!Q1}9M9Q9Q9STZ[\ddefgU1aADqD=1557q!Q1}9M9Q9Q9STZ[\ddefgiiA.66q!QB##CFF5M2zz!Q1%%r/   )       i'  )__name__
__module____qualname____doc__r!   intrP   __classcell__r-   s   @r.   r   r   !   s'    & & & &r/   r   c           
          t         j                  j                  t        j                  | |d|dd      t        j                  |            S )z3x3 convolution + batch normr:   r   F)r   stridepaddingbias)r=   r"   
Sequentialr#   BatchNorm2d)	in_planes
out_planesr[   s      r.   conv3x3rb   D   s<    88
		)ZQvqW\]
z" r/   c                   H     e Zd ZdZddddej
                  f fd	Zd Z xZS )ConvPatchEmbedz<Image to Patch Embedding using multiple convolutional layers      r:   rR   c                 J   t         |           t        |      }|d   |z  |d   |z  z  }|| _        || _        || _        |dk(  rxt        j                  j                  t        ||dz  d       |       t        |dz  |dz  d       |       t        |dz  |dz  d       |       t        |dz  |d            | _
        y |dk(  r`t        j                  j                  t        ||dz  d       |       t        |dz  |dz  d       |       t        |dz  |d            | _
        y d)Nr   r   rf      r   r8   z=For convolutional projection, patch size has to be in [8, 16])r    r!   r   img_size
patch_sizenum_patchesr=   r"   r^   rb   proj)r,   ri   rj   in_chans	embed_dim	act_layerrk   r-   s          r.   r!   zConvPatchEmbed.__init__O   s%   X&{j0Xa[J5NO $&++)q.!4	Q	Q:	Q	Q:	Q	15DI 1_++)q.!4	Q	Q:	Q	15DI RRr/   c                     | j                  |      }|j                  d   |j                  d   }}|j                  d      j                  dd      }|||ffS )Nr   r:   r   )rl   shaperG   	transpose)r,   xHpWps       r.   rP   zConvPatchEmbed.forwardl   sP    IIaLQWWQZBIIaL""1a(2r({r/   )	rS   rT   rU   rV   r"   GELUr!   rP   rX   rY   s   @r.   rd   rd   L   s#    F #Q#Y[Y`Y` S:r/   rd   c                   N     e Zd ZdZdej
                  df fd	ZdedefdZ xZ	S )LPIa  
    Local Patch Interaction module that allows explicit communication between tokens in 3x3 windows to augment the
    implicit communication performed by the block diagonal scatter attention. Implemented using 2 layers of separable
    3x3 convolutions with GeLU and BatchNorm2d
    Nr:   c                 (   t         |           |xs |}|dz  }t        j                  j	                  |||||      | _         |       | _        t        j                  |      | _        t        j                  j	                  |||||      | _	        y )Nr   )r   r\   groups)
r    r!   r=   r"   r#   conv1actr_   bnconv2)r,   in_featuresout_featuresro   r   r\   r-   s         r.   r!   zLPI.__init__z   s    #2{"XX__+wWb % d
;..-XX__;Xd % f
r/   r1   r2   c                 @   |j                   \  }}}|j                  ddd      j                  ||||      }| j                  |      }| j	                  |      }| j                  |      }| j                  |      }|j                  |||      j                  ddd      }|S )Nr   r   r   )rq   rI   reshaper{   r|   r}   r~   )r,   rs   r1   r2   r0   NCs          r.   rP   zLPI.forward   s    ''1aIIaA&&q!Q2JJqMHHQKGGAJJJqMIIaA&&q!Q/r/   )
rS   rT   rU   rV   r"   rv   r!   rW   rP   rX   rY   s   @r.   rx   rx   s   s/     26VW fC C r/   rx   c            	       d     e Zd ZdZdddddej
                  ej                  ddf	 fd	Zd Z xZ	S )ClassAttentionBlockzAClass Attention Layer as in CaiT https://arxiv.org/abs/2103.17239      @F              ?c                    t         |            |	|      | _        t        |||||      | _        |dkD  rt        |      nt        j                         | _         |	|      | _	        t        |t        ||z        ||      | _        |
ht        j                  |
t        j                  |      z        | _        t        j                  |
t        j                  |      z        | _        || _        y d\  | _        | _        || _        y )N	num_headsqkv_bias	attn_drop	proj_dropr   r   hidden_featuresro   drop)r   r   )r    r!   norm1r   attnr   r"   Identity	drop_pathnorm2r   rW   mlp	Parameterr=   onesgamma1gamma2tokens_norm)r,   r*   r   	mlp_ratior   r   r   r   ro   
norm_layeretar   r-   s               r.   r!   zClassAttentionBlock.__init__   s     	_
9x9Xac	 1:B),BKKM_
3C)O8LXahqr?,,sUZZ_'<=DK,,sUZZ_'<=DK
 ' (0$DK 'r/   c                 >   | j                  |      }t        j                  | j                  |      |d d dd f   gd      }|| j	                  | j
                  |z        z   }| j                  r| j                  |      }n:t        j                  | j                  |d d ddf         |d d dd f   gd      }|}|d d ddf   }| j                  | j                  |      z  }t        j                  ||d d dd f   gd      }|| j	                  |      z   }|S )Nr   r9   r   )
r   r=   rH   r   r   r   r   r   r   r   )r,   rs   x_norm1x_attnx_res	cls_tokens         r.   rP   zClassAttentionBlock.forward   s   **Q-DIIg.12?QGt{{V344

1A		4::a1Q3i0!AqrE(;CAa1fI	KK$((9"55	IIy!AqrE(+3DNN1%%r/   )
rS   rT   rU   rV   r"   rv   	LayerNormr!   rP   rX   rY   s   @r.   r   r      s6    K gg||'Br/   r   c                        e Zd ZU ej                  j
                  e   ed<   	 d fd	Zd Z	ej                  j                  d        Z xZS )XCA
fused_attnc                    t         |           || _        t        d      | _        t        j                  t        j                  |dd            | _	        t        j                  ||dz  |      | _        t        j                  |      | _        t        j                  ||      | _        t        j                  |      | _        y )NT)experimentalr   r:   )r]   )r    r!   r   r   r   r"   r   r=   r   r(   LinearqkvDropoutr   rl   r   )r,   r*   r   r   r   r   r-   s         r.   r!   zXCA.__init__   s    "(d;<<

9a(CD99S#'9I.IIc3'	I.r/   c                    |j                   \  }}}| j                  |      j                  ||d| j                  || j                  z        j	                  ddddd      }|j                  d      \  }}}| j                  rt        j                  j                  j                  |d      | j                  z  }t        j                  j                  j                  |d      }t        j                  j                  j                  |||d	      }nt        j                  j                  j                  |d      }t        j                  j                  j                  |d      }||j                  d
d      z  | j                  z  }	|	j                  d      }	| j                  |	      }	|	|z  }|j	                  dddd      j                  |||      }| j!                  |      }| j#                  |      }|S )Nr:   r   r   r8   r   r5   r9   r   )r'   )rq   r   r   r   rI   unbindr   r=   r"   
functional	normalizer(   scaled_dot_product_attentionrr   softmaxr   rl   r   )
r,   rs   r0   r   r   r   qkvr   s
             r.   rP   zXCA.forward   s   ''1ahhqk!!!Q4>>1;NOWWXY[\^_abdef**Q-1a??##--aR-84;K;KKA##--aR-8A##@@AqPS@TA ##--aR-8A##--aR-8AB++t/?/??D<<B<'D>>$'DqAIIaAq!))!Q2IIaLNN1r/   c                     dhS )Nr(    r,   s    r.   no_weight_decayzXCA.no_weight_decay   s
    r/   )rh   Fr   r   )rS   rT   rU   r=   jitFinalbool__annotations__r!   rP   ignorer   rX   rY   s   @r.   r   r      sC    		%%
/0 YY r/   r   c                   h     e Zd Zdddddej                  ej
                  df fd	ZdedefdZ xZ	S )	XCABlockr   Fr   r   c                 p   t         |            |	|      | _        t        |||||      | _        |dkD  rt        |      nt        j                         | _         |	|      | _	        t        ||      | _         |	|      | _        t        |t        ||z        ||      | _        t        j                   |
t#        j$                  |      z        | _        t        j                   |
t#        j$                  |      z        | _        t        j                   |
t#        j$                  |      z        | _        y )Nr   r   )r   ro   r   )r    r!   r   r   r   r   r"   r   r   norm3rx   local_mpr   r   rW   r   r   r=   r   r   gamma3r   )r,   r*   r   r   r   r   r   r   ro   r   r   r-   s              r.   r!   zXCABlock.__init__   s     	_
y8ydmn	09B),BKKM_
yA_
3C)O8LXahqrll3C#89ll3C#89ll3C#89r/   r1   r2   c           	         || j                  | j                  | j                  | j                  |            z        z   }|| j                  | j                  | j                  | j                  |      ||      z        z   }|| j                  | j                  | j                  | j                  |            z        z   }|S N)
r   r   r   r   r   r   r   r   r   r   )r,   rs   r1   r2   s       r.   rP   zXCABlock.forward  s    t{{TYYtzz!}-EEFF t{{T]]4::a=!Q-OOPPt{{TXXdjjm-DDEEr/   )
rS   rT   rU   r"   rv   r   r!   rW   rP   rX   rY   s   @r.   r   r      s=    
 gg||:8C C r/   r   c                   f    e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fd	Zd Zej                  j                  d        Z	ej                  j                  dd       Z
ej                  j                  dd       Zej                  j                  dej                  fd       Zdd	ed
ee   fdZ	 	 	 	 	 ddej&                  deeeee   f      dededededeeej&                     eej&                  eej&                     f   f   fdZ	 	 	 ddeeee   f   dedefdZd ZddefdZd Z xZS ) r   z
    Based on timm and DeiT code bases
    https://github.com/rwightman/pytorch-image-models/tree/master/timm
    https://github.com/facebookresearch/deit/
    c                    t         |           |dv sJ t        |      }|d   |z  dk(  r|d   |z  dk(  sJ d       |xs t        t        j
                  d      }|xs t        j                  }|| _        |x| _        x| _	        | _
        || _        d| _        t        |||||      | _        |}t	        j                  t!        j"                  dd|            | _        |rt'        |	      | _        nd
| _        t	        j*                  |      | _        t	        j.                  t1        |      D cg c]  }t3        |||	|
||||||
       c}      | _        t1        |      D cg c]  }t7        ||d|        c}| _        t	        j.                  t1        |      D cg c]  }t;        |||	|
||||||
       c}      | _         ||      | _        t	        j*                  |      | _         |dkD  r t	        jB                  | j                  |      nt	        jD                         | _#        tI        | j$                  d       | jK                  | jL                         y
c c}w c c}w c c}w )a  
        Args:
            img_size (int, tuple): input image size
            patch_size (int): patch size
            in_chans (int): number of input channels
            num_classes (int): number of classes for classification head
            embed_dim (int): embedding dimension
            depth (int): depth of transformer
            num_heads (int): number of attention heads
            mlp_ratio (int): ratio of mlp hidden dim to embedding dim
            qkv_bias (bool): enable bias for qkv if True
            drop_rate (float): dropout rate after positional embedding, and in XCA/CA projection + MLP
            pos_drop_rate: position embedding dropout rate
            proj_drop_rate (float): projection dropout rate
            attn_drop_rate (float): attention dropout rate
            drop_path_rate (float): stochastic depth rate (constant across all layers)
            norm_layer: (nn.Module): normalization layer
            cls_attn_layers: (int) Depth of Class attention layers
            use_pos_embed: (bool) whether to use positional encoding
            eta: (float) layerscale initialization value
            tokens_norm: (bool) Whether to normalize all tokens or just the cls_token in the CA

        Notes:
            - Although `layer_norm` is user specifiable, there are hard-coded `BatchNorm2d`s in the local patch
              interaction (class LPI) and the patch embedding (class ConvPatchEmbed)
         avgtokenr   z2`patch_size` should divide image dimensions evenlyr   )r+   F)ri   rj   rm   rn   ro   r   r9   N)p)
r*   r   r   r   r   r   r   ro   r   r   zblocks.)num_chs	reductionmodule)
r*   r   r   r   r   r   ro   r   r   r   {Gz?std)'r    r!   r   r   r"   r   rv   num_classesnum_featureshead_hidden_sizern   global_poolgrad_checkpointingrd   patch_embedr   r=   zerosr   r   	pos_embedr   pos_drop
ModuleListranger   blocksdictfeature_infor   cls_attn_blocksnorm	head_dropr   r   headr   apply_init_weights)r,   ri   rj   rm   r   r   rn   depthr   r   r   	drop_ratepos_drop_rateproj_drop_rateattn_drop_ratedrop_path_ratero   r   cls_attn_layersuse_pos_embedr   r   r_ir-   s                            r.   r!   zXcit.__init__!  sd   d 	2222X&j(A-HQK*4LPQ4Q 	A@	ARB72<<T#B
(	&ENNND1DN&"')!
 ekk!Q	&BC69EDN!DN

]3mm 5\%#  ##!(((#%%# $ bgglamn\]T)q7STRUWn!}} ?+.-   ##!#(#%'.-  .  y)	I.ALqBIId//=VXVaVaVc	 	dnn#.

4%%&M%# o.-s   3I$(I)$I.c                    t        |t        j                        rjt        |j                  d       t        |t        j                        r8|j
                  +t        j                  j                  |j
                  d       y y y y )Nr   r   r   )
isinstancer"   r   r   r;   r]   init	constant_)r,   ms     r.   r   zXcit._init_weights  sZ    a#!((,!RYY'AFF,>!!!&&!, -?' $r/   c                 
    ddhS )Nr   r   r   r   s    r.   r   zXcit.no_weight_decay  s    [))r/   c                 "    t        ddddg      S )Nz ^cls_token|pos_embed|patch_embedz^blocks\.(\d+))z^cls_attn_blocks\.(\d+)N)z^norm)i )stemr   r   )r   )r,   coarses     r.   group_matcherzXcit.group_matcher  s    4$?AUV
 	
r/   c                     || _         y r   )r   )r,   enables     r.   set_grad_checkpointingzXcit.set_grad_checkpointing  s
    "(r/   returnc                     | j                   S r   )r   r   s    r.   get_classifierzXcit.get_classifier  s    yyr/   r   r   c                     || _         ||dv sJ || _        |dkD  r&t        j                  | j                  |      | _        y t        j
                         | _        y )Nr   r   )r   r   r"   r   r   r   r   )r,   r   r   s      r.   reset_classifierzXcit.reset_classifier  sU    &""6666*DALqBIId//=	VXVaVaVc	r/   rs   indicesr   
stop_early
output_fmtintermediates_onlyc           	         |dv sJ d       |dk(  }g }t        t        | j                        |      \  }	}
|j                  \  }}}}| j	                  |      \  }\  }}| j
                  G| j                  |||      j                  |d|j                  d         j                  ddd      }||z   }| j                  |      }t        j                  j                         s|s| j                  }n| j                  d|
dz    }t        |      D ]q  \  }}| j                  r-t        j                  j                         st        ||||      }n
 ||||      }||	v sN|j                  |r| j!                  |      n|       s |rA|D cg c]6  }|j                  |||d      j                  dd	dd      j#                         8 }}|r|S t        j$                  | j&                  j)                  |dd      |fd
      }| j*                  D ]A  }| j                  r+t        j                  j                         st        ||      }: ||      }C | j!                  |      }||fS c c}w )a   Forward features that returns intermediates.

        Args:
            x: Input image tensor
            indices: Take last n blocks if int, all if None, select matching indices if sequence
            norm: Apply norm layer to all intermediates
            stop_early: Stop iterating over blocks when last desired intermediate hit
            output_fmt: Shape of intermediate feature outputs
            intermediates_only: Only return intermediate features
        Returns:

        )NCHWNLCz)Output format must be one of NCHW or NLC.r  Nr5   r   r   r   r:   r9   )r   lenr   rq   r   r   r   rI   r   r=   r   is_scripting	enumerater   r   appendr   
contiguousrH   r   expandr   )r,   rs   r  r   r	  r
  r  r   intermediatestake_indices	max_indexr0   r   heightwidthrt   ru   pos_encodingr   r   blkys                         r.   forward_intermediateszXcit.forward_intermediates  sA   * _,Y.YY,&"6s4;;7G"Qi  gg1fe&&q)8B>>%>>!R4<<QAGGAJOWWXY[\^_`LL AMM!99!!#:[[F[[)a-0F' 	BFAs&&uyy/E/E/GsAr2.2rNL $$TTYYq\qA	B `mn[\QYYq"b"5==aAqITTVnMn   IIt~~,,QB7;C'' 	C&&uyy/E/E/GsA&F		 IIaL- os   ;I
prune_norm
prune_headc                    t        t        | j                        |      \  }}| j                  d|dz    | _        |rt        j                         | _        |r+t        j                         | _        | j                  dd       |S )z@ Prune layers not required for specified intermediates.
        Nr   r   r   )	r   r  r   r"   r   r   r   r   r  )r,   r  r  r  r  r  s         r.   prune_intermediate_layerszXcit.prune_intermediate_layers  sk     #7s4;;7G"Qikk.9q=1DI#%==?D !!!R(r/   c                    |j                   d   }| j                  |      \  }\  }}| j                  G| j                  |||      j                  |d|j                   d         j	                  ddd      }||z   }| j                  |      }| j                  D ]E  }| j                  r-t        j                  j                         st        ||||      }< ||||      }G t        j                  | j                  j                  |dd      |fd      }| j                  D ]A  }| j                  r+t        j                  j                         st        ||      }: ||      }C | j!                  |      }|S )Nr   r5   r   r   r9   )rq   r   r   r   rI   r   r   r   r=   r   r  r   rH   r   r  r   r   )r,   rs   r0   rt   ru   r  r  s          r.   forward_featureszXcit.forward_features  sL   GGAJ&&q)8B>>%>>!R4<<QAGGAJOWWXY[\^_`LL AMM!;; 	#C&&uyy/E/E/GsAr2.2rN		# IIt~~,,QB7;C'' 	C&&uyy/E/E/GsA&F		 IIaLr/   
pre_logitsc                     | j                   r3| j                   dk(  r|d d dd f   j                  d      n|d d df   }| j                  |      }|r|S | j                  |      S )Nr   r   r9   r   )r   meanr   r   )r,   rs   r$  s      r.   forward_headzXcit.forward_head*  s_    (,(8(8E(A!QR%!$qAwANN1q0DIIaL0r/   c                 J    | j                  |      }| j                  |      }|S r   )r#  r'  )r,   rs   s     r.   rP   zXcit.forward0  s'    !!!$a r/   )re   rf   r:     r   rR      r*  r   Tr   r   r   r   r   NNr   Tr   FF)Tr   )NFFr  F)r   FT)rS   rT   rU   rV   r!   r   r=   r   r   r   r   r  r"   Moduler  rW   r   strr  Tensorr   r   r   r   r  r!  r#  r'  rP   rX   rY   s   @r.   r   r     s    -u'n- YY* * YY
 
 YY) ) YY		  dC dhsm d 8<$$',B ||B  eCcN34B  	B 
 B  B  !%B  
tELL!5tELL7I)I#JJ	KB L ./$#	3S	>*  	"81$ 1r/   c           	         d| v r| d   } t        |dd       d u}| D cg c]  }|j                  d      s| }}|D ],  }|r%| j                  |      | |j                  dd      <   *| |= . d| v rd|j	                         v rt        |j                        }t        |      D ]  }| j                  d| d      }|j                  d	d
|j                  d
         }t        d      D ]  \  }}	||   | d| d|	 d<    | j                  d| dd       }
|
s|
j                  d	d
      }
t        d      D ]  \  }}	|
|   | d| d|	 d<     | S c c}w )Nmodelr   zpos_embeder.z
pos_embed.z!cls_attn_blocks.0.attn.qkv.weightzcls_attn_blocks.0.attn.q.weightzcls_attn_blocks.z.attn.qkv.weightr:   r5   r   z.attn.z.weightz.attn.qkv.biasz.bias)getattr
startswithpopreplace
state_dictr  r   r   r   rq   r  )r5  r0  r   r   pos_embed_keysnum_ca_blocksr   
qkv_weightj	subscriptr   s              r.   checkpoint_filter_fnr;  6  s   *(
 E;5TAM!+IAq||K/HaINI BL..QRBSJqyy>?1	 +j8=^bgbrbrbt=tE112}% 		[A#*:1#=M(NOJ#++Ar:3C3CB3GHJ )% 0 [9MWXY]
-aSykIJ[!~~(8>&JDQH##++Ar2$-e$4 [LAyOWXY{J!1!F9+UKL[		[ ) Js
   EEc                 r    |j                  dd      }t        t        | |ft        t	        |d      d|}|S )Nout_indicesr:   getter)r=  feature_cls)pretrained_filter_fnfeature_cfg)r3  r   r   r;  r   )variant
pretraineddefault_cfgkwargsr=  r0  s         r.   _create_xcitrF  S  sJ    **]A.K  2[hG E Lr/   c                 2    | ddd dddt         t        ddd|S )	Nr)  )r:   re   re   r   bicubicTzpatch_embed.proj.0.0r   )urlr   
input_size	pool_sizecrop_pctinterpolationfixed_input_sizer&  r   
first_conv
classifierr   )rI  rE  s     r.   _cfgrQ  `  s2    =t)%.B,F  r/   zxcit_nano_12_p16_224.fb_in1kztimm/z<https://dl.fbaipublicfiles.com/xcit/xcit_nano_12_p16_224.pth)	hf_hub_idrI  z!xcit_nano_12_p16_224.fb_dist_in1kzAhttps://dl.fbaipublicfiles.com/xcit/xcit_nano_12_p16_224_dist.pthz!xcit_nano_12_p16_384.fb_dist_in1kzAhttps://dl.fbaipublicfiles.com/xcit/xcit_nano_12_p16_384_dist.pth)r:     rS  )rR  rI  rJ  zxcit_tiny_12_p16_224.fb_in1kz<https://dl.fbaipublicfiles.com/xcit/xcit_tiny_12_p16_224.pthz!xcit_tiny_12_p16_224.fb_dist_in1kzAhttps://dl.fbaipublicfiles.com/xcit/xcit_tiny_12_p16_224_dist.pthz!xcit_tiny_12_p16_384.fb_dist_in1kzAhttps://dl.fbaipublicfiles.com/xcit/xcit_tiny_12_p16_384_dist.pthzxcit_tiny_24_p16_224.fb_in1kz<https://dl.fbaipublicfiles.com/xcit/xcit_tiny_24_p16_224.pthz!xcit_tiny_24_p16_224.fb_dist_in1kzAhttps://dl.fbaipublicfiles.com/xcit/xcit_tiny_24_p16_224_dist.pthz!xcit_tiny_24_p16_384.fb_dist_in1kzAhttps://dl.fbaipublicfiles.com/xcit/xcit_tiny_24_p16_384_dist.pthzxcit_small_12_p16_224.fb_in1kz=https://dl.fbaipublicfiles.com/xcit/xcit_small_12_p16_224.pthz"xcit_small_12_p16_224.fb_dist_in1kzBhttps://dl.fbaipublicfiles.com/xcit/xcit_small_12_p16_224_dist.pthz"xcit_small_12_p16_384.fb_dist_in1kzBhttps://dl.fbaipublicfiles.com/xcit/xcit_small_12_p16_384_dist.pthzxcit_small_24_p16_224.fb_in1kz=https://dl.fbaipublicfiles.com/xcit/xcit_small_24_p16_224.pthz"xcit_small_24_p16_224.fb_dist_in1kzBhttps://dl.fbaipublicfiles.com/xcit/xcit_small_24_p16_224_dist.pthz"xcit_small_24_p16_384.fb_dist_in1kzBhttps://dl.fbaipublicfiles.com/xcit/xcit_small_24_p16_384_dist.pthzxcit_medium_24_p16_224.fb_in1kz>https://dl.fbaipublicfiles.com/xcit/xcit_medium_24_p16_224.pthz#xcit_medium_24_p16_224.fb_dist_in1kzChttps://dl.fbaipublicfiles.com/xcit/xcit_medium_24_p16_224_dist.pthz#xcit_medium_24_p16_384.fb_dist_in1kzChttps://dl.fbaipublicfiles.com/xcit/xcit_medium_24_p16_384_dist.pthzxcit_large_24_p16_224.fb_in1kz=https://dl.fbaipublicfiles.com/xcit/xcit_large_24_p16_224.pthz"xcit_large_24_p16_224.fb_dist_in1kzBhttps://dl.fbaipublicfiles.com/xcit/xcit_large_24_p16_224_dist.pthz"xcit_large_24_p16_384.fb_dist_in1kzBhttps://dl.fbaipublicfiles.com/xcit/xcit_large_24_p16_384_dist.pthzxcit_nano_12_p8_224.fb_in1kz;https://dl.fbaipublicfiles.com/xcit/xcit_nano_12_p8_224.pthz xcit_nano_12_p8_224.fb_dist_in1kz@https://dl.fbaipublicfiles.com/xcit/xcit_nano_12_p8_224_dist.pthz xcit_nano_12_p8_384.fb_dist_in1kz@https://dl.fbaipublicfiles.com/xcit/xcit_nano_12_p8_384_dist.pthzxcit_tiny_12_p8_224.fb_in1kz;https://dl.fbaipublicfiles.com/xcit/xcit_tiny_12_p8_224.pthz xcit_tiny_12_p8_224.fb_dist_in1kz@https://dl.fbaipublicfiles.com/xcit/xcit_tiny_12_p8_224_dist.pthz xcit_tiny_12_p8_384.fb_dist_in1kz@https://dl.fbaipublicfiles.com/xcit/xcit_tiny_12_p8_384_dist.pthzxcit_tiny_24_p8_224.fb_in1kz;https://dl.fbaipublicfiles.com/xcit/xcit_tiny_24_p8_224.pthz xcit_tiny_24_p8_224.fb_dist_in1kz@https://dl.fbaipublicfiles.com/xcit/xcit_tiny_24_p8_224_dist.pthz xcit_tiny_24_p8_384.fb_dist_in1kz@https://dl.fbaipublicfiles.com/xcit/xcit_tiny_24_p8_384_dist.pthzxcit_small_12_p8_224.fb_in1kz<https://dl.fbaipublicfiles.com/xcit/xcit_small_12_p8_224.pthz!xcit_small_12_p8_224.fb_dist_in1kzAhttps://dl.fbaipublicfiles.com/xcit/xcit_small_12_p8_224_dist.pthz!xcit_small_12_p8_384.fb_dist_in1kzAhttps://dl.fbaipublicfiles.com/xcit/xcit_small_12_p8_384_dist.pthzxcit_small_24_p8_224.fb_in1kz<https://dl.fbaipublicfiles.com/xcit/xcit_small_24_p8_224.pthzAhttps://dl.fbaipublicfiles.com/xcit/xcit_small_24_p8_224_dist.pthzAhttps://dl.fbaipublicfiles.com/xcit/xcit_small_24_p8_384_dist.pthz=https://dl.fbaipublicfiles.com/xcit/xcit_medium_24_p8_224.pthzBhttps://dl.fbaipublicfiles.com/xcit/xcit_medium_24_p8_224_dist.pthzBhttps://dl.fbaipublicfiles.com/xcit/xcit_medium_24_p8_384_dist.pthz<https://dl.fbaipublicfiles.com/xcit/xcit_large_24_p8_224.pthzAhttps://dl.fbaipublicfiles.com/xcit/xcit_large_24_p8_224_dist.pthzAhttps://dl.fbaipublicfiles.com/xcit/xcit_large_24_p8_384_dist.pth)!xcit_small_24_p8_224.fb_dist_in1k!xcit_small_24_p8_384.fb_dist_in1kzxcit_medium_24_p8_224.fb_in1k"xcit_medium_24_p8_224.fb_dist_in1k"xcit_medium_24_p8_384.fb_dist_in1kzxcit_large_24_p8_224.fb_in1k!xcit_large_24_p8_224.fb_dist_in1k!xcit_large_24_p8_384.fb_dist_in1kr  c           	      V    t        dddddd      }t        d	d| it        |fi |}|S )
Nrf      r*  r8   r   Frj   rn   r   r   r   r   rC  )xcit_nano_12_p16_224r   rF  rC  rE  
model_argsr0  s       r.   r]  r]    s=    B!RWYJeJe$zJd]cJdeELr/   c           	      X    t        ddddddd      }t        d
d	| it        |fi |}|S )Nrf   r[  r*  r8   r   FrS  )rj   rn   r   r   r   r   ri   rC  )xcit_nano_12_p16_384r^  r_  s       r.   rb  rb    s@    B!RWbegJeJe$zJd]cJdeELr/   c           	      V    t        dddddd      }t        d	d| it        |fi |}|S )
Nrf      r*  r8   r   Tr\  rC  )xcit_tiny_12_p16_224r^  r_  s       r.   re  re     =    B!RVXJeJe$zJd]cJdeELr/   c           	      V    t        dddddd      }t        d	d| it        |fi |}|S )
Nrf   rd  r*  r8   r   Tr\  rC  )xcit_tiny_12_p16_384r^  r_  s       r.   rh  rh    rf  r/   c           	      V    t        dddddd      }t        d	d| it        |fi |}|S )
Nrf   rS  r*  rh   r   Tr\  rC  )xcit_small_12_p16_224r^  r_  s       r.   rj  rj    >    B!RVXJfZf4PZKe^dKefELr/   c           	      V    t        dddddd      }t        d	d| it        |fi |}|S )
Nrf   rS  r*  rh   r   Tr\  rC  )xcit_small_12_p16_384r^  r_  s       r.   rm  rm    rk  r/   c           	      V    t        dddddd      }t        d	d| it        |fi |}|S )
Nrf   rd     r8   h㈵>Tr\  rC  )xcit_tiny_24_p16_224r^  r_  s       r.   rq  rq     =    B!SWYJeJe$zJd]cJdeELr/   c           	      V    t        dddddd      }t        d	d| it        |fi |}|S )
Nrf   rd  ro  r8   rp  Tr\  rC  )xcit_tiny_24_p16_384r^  r_  s       r.   rt  rt  (  rr  r/   c           	      V    t        dddddd      }t        d	d| it        |fi |}|S )
Nrf   rS  ro  rh   rp  Tr\  rC  )xcit_small_24_p16_224r^  r_  s       r.   rv  rv  0  >    B!SWYJfZf4PZKe^dKefELr/   c           	      V    t        dddddd      }t        d	d| it        |fi |}|S )
Nrf   rS  ro  rh   rp  Tr\  rC  )xcit_small_24_p16_384r^  r_  s       r.   ry  ry  8  rw  r/   c           	      V    t        dddddd      }t        d	d| it        |fi |}|S )
Nrf      ro  rh   rp  Tr\  rC  )xcit_medium_24_p16_224r^  r_  s       r.   r|  r|  @  >    B!SWYJgjgDQ[Lf_eLfgELr/   c           	      V    t        dddddd      }t        d	d| it        |fi |}|S )
Nrf   r{  ro  rh   rp  Tr\  rC  )xcit_medium_24_p16_384r^  r_  s       r.   r  r  H  r}  r/   c           	      V    t        dddddd      }t        dd| it        |fi |}|S )	Nrf   rR   ro  rp  Tr\  rC  )xcit_large_24_p16_224r^  r_  s       r.   r  r  P  >    B"$TXZJfZf4PZKe^dKefELr/   c           	      V    t        dddddd      }t        dd| it        |fi |}|S )	Nrf   rR   ro  rp  Tr\  rC  )xcit_large_24_p16_384r^  r_  s       r.   r  r  X  r  r/   c           	      V    t        dddddd      }t        d	d| it        |fi |}|S )
Nrh   r[  r*  r8   r   Fr\  rC  )xcit_nano_12_p8_224r^  r_  s       r.   r  r  a  =    2QVXJd:djIc\bIcdELr/   c           	      V    t        dddddd      }t        d	d| it        |fi |}|S )
Nrh   r[  r*  r8   r   Fr\  rC  )xcit_nano_12_p8_384r^  r_  s       r.   r  r  i  r  r/   c           	      V    t        dddddd      }t        d	d| it        |fi |}|S )
Nrh   rd  r*  r8   r   Tr\  rC  )xcit_tiny_12_p8_224r^  r_  s       r.   r  r  q  =    2QUWJd:djIc\bIcdELr/   c           	      V    t        dddddd      }t        d	d| it        |fi |}|S )
Nrh   rd  r*  r8   r   Tr\  rC  )xcit_tiny_12_p8_384r^  r_  s       r.   r  r  y  r  r/   c           	      V    t        dddddd      }t        dd| it        |fi |}|S )	Nrh   rS  r*  r   Tr\  rC  )xcit_small_12_p8_224r^  r_  s       r.   r  r    =    2QUWJeJe$zJd]cJdeELr/   c           	      V    t        dddddd      }t        dd| it        |fi |}|S )	Nrh   rS  r*  r   Tr\  rC  )xcit_small_12_p8_384r^  r_  s       r.   r  r    r  r/   c           	      V    t        dddddd      }t        d	d| it        |fi |}|S )
Nrh   rd  ro  r8   rp  Tr\  rC  )xcit_tiny_24_p8_224r^  r_  s       r.   r  r    =    2RVXJd:djIc\bIcdELr/   c           	      V    t        dddddd      }t        d	d| it        |fi |}|S )
Nrh   rd  ro  r8   rp  Tr\  rC  )xcit_tiny_24_p8_384r^  r_  s       r.   r  r    r  r/   c           	      V    t        dddddd      }t        dd| it        |fi |}|S )	Nrh   rS  ro  rp  Tr\  rC  )xcit_small_24_p8_224r^  r_  s       r.   r  r    =    2RVXJeJe$zJd]cJdeELr/   c           	      V    t        dddddd      }t        dd| it        |fi |}|S )	Nrh   rS  ro  rp  Tr\  rC  )xcit_small_24_p8_384r^  r_  s       r.   r  r    r  r/   c           	      V    t        dddddd      }t        dd| it        |fi |}|S )	Nrh   r{  ro  rp  Tr\  rC  )xcit_medium_24_p8_224r^  r_  s       r.   r  r    >    2RVXJfZf4PZKe^dKefELr/   c           	      V    t        dddddd      }t        dd| it        |fi |}|S )	Nrh   r{  ro  rp  Tr\  rC  )xcit_medium_24_p8_384r^  r_  s       r.   r  r    r  r/   c           	      V    t        dddddd      }t        d	d| it        |fi |}|S )
Nrh   rR   ro  rf   rp  Tr\  rC  )xcit_large_24_p8_224r^  r_  s       r.   r  r    =    2SWYJeJe$zJd]cJdeELr/   c           	      V    t        dddddd      }t        d	d| it        |fi |}|S )
Nrh   rR   ro  rf   rp  Tr\  rC  )xcit_large_24_p8_384r^  r_  s       r.   r  r    r  r/   xcit_nano_12_p16_224_distxcit_nano_12_p16_384_distxcit_tiny_12_p16_224_distxcit_tiny_12_p16_384_distxcit_tiny_24_p16_224_distxcit_tiny_24_p16_384_distxcit_small_12_p16_224_distxcit_small_12_p16_384_distxcit_small_24_p16_224_distxcit_small_24_p16_384_distxcit_medium_24_p16_224_distxcit_medium_24_p16_384_distxcit_large_24_p16_224_distxcit_large_24_p16_384_distxcit_nano_12_p8_224_distxcit_nano_12_p8_384_distxcit_tiny_12_p8_224_distrT  rU  rV  rW  rX  rY  )xcit_tiny_12_p8_384_distxcit_tiny_24_p8_224_distxcit_tiny_24_p8_384_distxcit_small_12_p8_224_distxcit_small_12_p8_384_distxcit_small_24_p8_224_distxcit_small_24_p8_384_distxcit_medium_24_p8_224_distxcit_medium_24_p8_384_distxcit_large_24_p8_224_distxcit_large_24_p8_384_dist)r   )FN)r   r+  )NrV   r%   	functoolsr   typingr   r   r   r   r=   torch.nnr"   	timm.datar	   r
   timm.layersr   r   r   r   r   _builderr   	_featuresr   _features_fxr   _manipulater   	_registryr   r   r   caitr   __all__r,  r   rb   rd   rx   r   r   r   r   r;  rF  rQ  default_cfgsr]  rb  re  rh  rj  rm  rq  rt  rv  ry  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rS   r   r/   r.   <module>r     s5	  	   / /   A O O * + 1 # Y Y ( &		 & &D$RYY $N")) >1")) 1h+")) +\#ryy #LY299 Yx:
 % B&"DJ%LB&
 (O*QB& (O\i*kB& #DJ%LB& (O*QB&" (O\i*k#B&( #DJ%L)B&. (O*Q/B&4 (O\i*k5B&: $TK&M;B&@ )$P+RAB&F )$P]j+lGB&L $TK&MMB&R )$P+RSB&X )$P]j+lYB&^ %dL'N_B&d *4Q,SeB&j *4Q^k,mkB&p $TK&MqB&v )$P+RwB&| )$P]j+l}B&F "4I$KGB&L 'N)PMB&R 'N[h)jSB&X "4I$KYB&^ 'N)P_B&d 'N[h)jeB&j "4I$KkB&p 'N)PqB&v 'N[h)jwB&| #DJ%L}B&B (O*QCB&H (O\i*kIB&N #DJ%LOB&T *.O*Q *.O\i*k &*K&M +/P+R +/P]j+l %)J%L *.O*Q *.O\i*kB& BJ                               $   $         t   t   t   t         t   t                     H  '!D '  !D '  !D	 '
  !D '  !D '  !D ' !"F ' !"F ' !"F ' !"F ' "#H ' "#H ' !"F ' !"F '$  B% '&  B' '(  B) '* !C B B!D!D!D!D"F"F!D!D? '  r/   