
    kh{\              	          d Z ddlZddlmZ ddl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 ddlmZ dd	lmZ dd
l m!Z! ddl"m#Z#m$Z$ ddl%m&Z&m'Z' dgZ( G d dejR                        Z* G d dejR                        Z+ G d dejR                        Z, G d dejR                        Z- G d dejR                        Z.dee/e/f   fdZ0e!dee/e/f   dee/e/f   fd       Z1 G d dejR                        Z2 G d dejR                        Z3 G d  d!ejR                        Z4 G d" dejR                        Z5d2d#Z6d3d$Z7 e' e7d%&       e7d'&       e7d(&       e7d)&       e7d*&      d+      Z8e&d2d,e5fd-       Z9e&d2d,e5fd.       Z:e&d2d,e5fd/       Z;e&d2d,e5fd0       Z<e&d2d,e5fd1       Z=y)4a)   Global Context ViT

From scratch implementation of GCViT in the style of timm swin_transformer_v2_cr.py

Global Context Vision Transformers -https://arxiv.org/abs/2206.09959

@article{hatamizadeh2022global,
  title={Global Context Vision Transformers},
  author={Hatamizadeh, Ali and Yin, Hongxu and Kautz, Jan and Molchanov, Pavlo},
  journal={arXiv preprint arXiv:2206.09959},
  year={2022}
}

Free of any code related to NVIDIA GCVit impl at https://github.com/NVlabs/GCVit.
The license for this code release is Apache 2.0 with no commercial restrictions.

However, weight files adapted from NVIDIA GCVit impl ARE under a non-commercial share-alike license
(https://creativecommons.org/licenses/by-nc-sa/4.0/) until I have a chance to train new ones...

Hacked together by / Copyright 2022, Ross Wightman
    N)partial)CallableListOptionalTupleUnionIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)DropPath	to_2tuple	to_ntupleMlpClassifierHeadLayerNorm2dget_attnget_act_layerget_norm_layer
RelPosBias_assert   )build_model_with_cfg)feature_take_indices)register_notrace_function)named_apply
checkpoint)register_modelgenerate_default_cfgsGlobalContextVitc                   H     e Zd ZdZddddej
                  f fd	Zd Z xZS )MbConvBlockzR A depthwise separable / fused mbconv style residual block with SE, `no norm.
    Ng      ?seFc           	      v   t         	|           t        |      }t        |t              r|dk(  s|dk(  r
d|d<   d|d<   t        |      }|xs |}t        ||z        }t        j                  ||dd	d	||
      | _	         |       | _
         ||fi || _        t        j                  ||d	d	d|      | _        y )N	act_layerr"   ecag      ?rd_ratioFbias   r   )groupsr(   r   r(   )super__init__dict
isinstancestrr   intnnConv2dconv_dwactr"   conv_pw)
selfin_chsout_chsexpand_ratio
attn_layerr(   r%   attn_kwargsmid_chs	__class__s
            M/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/models/gcvit.pyr-   zMbConvBlock.__init__,   s     	Y/j#&:+=uAT&*K
#"'Kj)
#VlV+,yy!Q&tT;W44yy'1aF    c                     |}| j                  |      }| j                  |      }| j                  |      }| j                  |      }||z   }|S N)r4   r5   r"   r6   )r7   xshortcuts      r?   forwardzMbConvBlock.forwardC   sI    LLOHHQKGGAJLLOLr@   )	__name__
__module____qualname____doc__r2   GELUr-   rE   __classcell__r>   s   @r?   r!   r!   )   s(    
 ggG.r@   r!   c                   B     e Zd Zddej                  ef fd	Zd Z xZS )Downsample2dNconvc                    t         |           |xs |}| ||      nt        j                         | _        t        ||      | _        |dv sJ |dk(  r!t        j                  ||dddd      | _        nL|d	k(  r%||k(  sJ t        j                  ddd
      | _        n"||k(  sJ t        j                  d      | _        | ||      | _        y t        j                         | _        y )Nr$   )rO   maxavgrO   r)      r   Fr+   rQ   kernel_sizestridepaddingrU   )r,   r-   r2   Identitynorm1r!   
conv_blockr3   	reduction	MaxPool2d	AvgPool2dnorm2)r7   dimdim_outr\   r%   
norm_layerr>   s         r?   r-   zDownsample2d.__init__N   s     	.S(2(>Z_BKKM
%cY?2222YYsGQ15IDN%'>!>\\a1MDN'>!>\\a8DN,6,BZ(

r@   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }|S rB   )rZ   r[   r\   r_   r7   rC   s     r?   rE   zDownsample2d.forwardf   s=    JJqMOOANN1JJqMr@   )	rF   rG   rH   r2   rJ   r   r-   rE   rK   rL   s   @r?   rN   rN   M   s      gg"V0r@   rN   c                   @     e Zd Zddej                  f fd	Zd Z xZS )FeatureBlockr   rQ   c                    t         |           |}t        d|      }|dk(  rt        t        j
                  d      }nt        t        j                  ddd      }t	        j                         | _        t        |      D ]^  }| j                  j                  d|dz    t        ||             |s3| j                  j                  d	|dz     |              |dz  }` y )
Nr   rR   rS   rX   r)   rT   rO   r$   pool)r,   r-   rQ   r   r2   r^   r]   
Sequentialblocksrange
add_moduler!   )	r7   r`   levelsr\   r%   
reductionspool_fnir>   s	           r?   r-   zFeatureBlock.__init__o   s     	
Qbll:Gbll!QOGmmov 	 AKK""T!A#<SI1VW&&acU|WY?a
		 r@   c                 $    | j                  |      S rB   )rj   rd   s     r?   rE   zFeatureBlock.forward   s    {{1~r@   )rF   rG   rH   r2   rJ   r-   rE   rK   rL   s   @r?   rf   rf   n   s     gg *r@   rf   c            	       T     e Zd Zddej                  efdedededef fdZd Z	 xZ
S )	Stemr)   `   r8   r9   r%   rb   c                     t         |           t        j                  ||ddd      | _        t        |||      | _        y )Nr)   rS   r   rT   )r%   rb   )r,   r-   r2   r3   conv1rN   down)r7   r8   r9   r%   rb   r>   s        r?   r-   zStem.__init__   s9     	YYvwAaQRS
 I*U	r@   c                 J    | j                  |      }| j                  |      }|S rB   )rv   rw   rd   s     r?   rE   zStem.forward   s!    JJqMIIaLr@   )rF   rG   rH   r2   rJ   r   r1   r   r-   rE   rK   rL   s   @r?   rs   rs      sJ     "$''#.	V	V 	V  		V
 !	Vr@   rs   c                   x     e Zd Z	 	 	 	 ddededeeef   dedededef fdZdd	ee	j                     fd
Z xZS )WindowAttentionGlobalr`   	num_headswindow_size
use_globalqkv_bias	attn_drop	proj_dropc                    t         |           t        |      }|| _        || _        ||z  | _        | j
                  dz  | _        || _        t        ||      | _	        | j                  r!t        j                  ||dz  |      | _        n t        j                  ||dz  |      | _        t        j                  |      | _        t        j                  ||      | _        t        j                  |      | _        y )Ng      )r|   r{   rS   r+   r)   )r,   r-   r   r|   r{   head_dimscaler}   r   rel_posr2   LinearqkvDropoutr   projr   )	r7   r`   r{   r|   r}   r~   r   r   r>   s	           r?   r-   zWindowAttentionGlobal.__init__   s     	,&"y(]]d*
$!kYO??yycAgH=DHyycAgH=DHI.IIc3'	I.r@   q_globalc                 0   |j                   \  }}}| j                  r|t        |j                   d   |j                   d   k(  d       | j                  |      }|j	                  ||d| j
                  | j                        j                  ddddd      }|j                  d      \  }}|j                  ||j                   d   z  ddd      }	|	j	                  ||| j
                  | j                        j                  dddd      }	n`| j                  |      j	                  ||d| j
                  | j                        j                  ddddd      }
|
j                  d      \  }	}}|	| j                  z  }	|	|j                  dd      j                         z  }| j                  |      }|j                  d	      }| j                  |      }||z  j                  dd      j	                  |||      }| j!                  |      }| j#                  |      }|S )
Nz*x and q_global seq lengths should be equalrS   r   r)   r      )r`   )shaper}   r   r   reshaper{   r   permuteunbindrepeatr   	transpose
contiguousr   softmaxr   r   r   )r7   rC   r   BNCkvkvqr   attns               r?   rE   zWindowAttentionGlobal.forward   s   ''1a??x3AGGBK8>>"#557cd!BAq!T^^T]]CKKAqRSUVXYZB99Q<DAqX^^A%6 61a@A		!Q>FFq!QPQRA((1+%%aAt~~t}}MUUVWYZ\]_`bcdCjjmGAq!

N1;;r2&1133||D!|||#~~d#AX  A&..q!Q7IIaLNN1r@   )TT        r   rB   )rF   rG   rH   r1   r   boolfloatr-   r   torchTensorrE   rK   rL   s   @r?   rz   rz      sw      $!!!// / sCx	/
 / / / /68ELL#9 r@   rz   r|   c                     | j                   \  }}}}| j                  |||d   z  |d   ||d   z  |d   |      } | j                  dddddd      j                         j                  d|d   |d   |      }|S )Nr   r   r)   rS   r      r   r   viewr   r   )rC   r|   r   HWr   windowss          r?   window_partitionr      s    JAq!Q	q!{1~%{1~qKN7JKXYN\]^Aii1aAq)446;;BAP[\]P^`abGNr@   img_sizec                     |\  }}| j                   d   }| j                  d||d   z  ||d   z  |d   |d   |      }|j                  dddddd      j                         j                  d|||      }|S )Nr   r   r   r)   rS   r   r   r   )r   r|   r   r   r   r   rC   s          r?   window_reverser      s    DAqbARk!n,a;q>.A;q>S^_`SacdeA			!Q1a#..055b!QBAHr@   c                   &     e Zd Zd fd	Zd Z xZS )
LayerScalec                     t         |           || _        t        j                  |t        j                  |      z        | _        y rB   )r,   r-   inplacer2   	Parameterr   onesgamma)r7   r`   init_valuesr   r>   s       r?   r-   zLayerScale.__init__   s2    \\+

3"?@
r@   c                 n    | j                   r|j                  | j                        S || j                  z  S rB   )r   mul_r   rd   s     r?   rE   zLayerScale.forward   s(    %)\\qvvdjj!Eq4::~Er@   )h㈵>F)rF   rG   rH   r-   rE   rK   rL   s   @r?   r   r      s    A
Fr@   r   c                        e Zd Zddddddddeej
                  ej                  fdedeeef   ded	ed
e	de
de
dee	   de	de	de	dededef fdZddeej                     fdZddeej                     fdZ xZS )GlobalContextVitBlock         @TNr   r`   	feat_sizer{   r|   	mlp_ratior}   r~   layer_scaler   r   	drop_pathr;   r%   rb   c           	         t         |           t        |      }t        |      }|| _        t	        |d   |d   z  |d   |d   z  z        | _         ||      | _         |||||||
|	      | _        |t        ||      nt        j                         | _        |dkD  rt        |      nt        j                         | _         ||      | _        t        |t	        ||z        ||	      | _        |t        ||      nt        j                         | _        |dkD  rt        |      | _        y t        j                         | _        y )Nr   r   )r{   r|   r}   r~   r   r   r   )in_featureshidden_featuresr%   drop)r,   r-   r   r|   r1   num_windowsrZ   r   r   r2   rY   ls1r   
drop_path1r_   r   mlpls2
drop_path2)r7   r`   r   r{   r|   r   r}   r~   r   r   r   r   r;   r%   rb   r>   s                  r?   r-   zGlobalContextVitBlock.__init__   s'   " 	i(	,&	!A >9Q<S^_`SaCabc_
#!
	 4?3J:c;/PRP[P[P]1:R(9-R[[]_
3C)O8LXahqr3>3J:c;/PRP[P[P]1:R(9-R[[]r@   r   c                 
   |j                   \  }}}}t        || j                        }|j                  d| j                  d   | j                  d   z  |      }| j	                  ||      }t        || j                  ||f      }|S )Nr   r   r   )r   r   r|   r   r   r   )	r7   rC   r   r   r   r   r   x_winattn_wins	            r?   _window_attnz"GlobalContextVitBlock._window_attn  s    WW
1a D$4$45

2t//2T5E5Ea5HH!L99UH-8T%5%51v>r@   c           
         || j                  | j                  | j                  | j                  |      |                  z   }|| j	                  | j                  | j                  | j                  |                        z   }|S rB   )r   r   r   rZ   r   r   r   r_   )r7   rC   r   s      r?   rE   zGlobalContextVitBlock.forward  se    ):):4::a=()S TUU$**Q-)@ ABBr@   rB   )rF   rG   rH   rz   r2   rJ   	LayerNormr1   r   r   r   r   r   r-   r   r   r   rE   rK   rL   s   @r?   r   r      s     !!#!+/!!!#8"$''#%<<'S'S S#X'S 	'S
 'S 'S 'S 'S "%'S 'S 'S 'S !'S  'S !'SR(> 8ELL#9 r@   r   c            !            e Zd Zdddddddddej                  ej
                  efdededeeef   d	eeef   d
e	de	de	de
de	dee
   de
de
deee
   e
f   dededef  fdZd Z xZS )GlobalContextVitStageTFr   Nr   depthr{   r   r|   
downsampleglobal_norm
stage_normr   r~   r   r   r   r   r%   rb   norm_layer_clc                    t         |           |r,t        ||dz  |      | _        |dz  }|d   dz  |d   dz  f}nt	        j
                         | _        || _        t        |      }t        t        j                  t        |      t        |      z              }t        ||      | _        |r ||      nt	        j
                         | _        t	        j                  t!        |      D cg c]5  }t#        |||||	|
|dz  dk7  |||t%        |t&              r||   n|||      7 c}      | _        |r ||      nt	        j
                         | _        || _        || _        d| _        y c c}w )NrS   )r`   ra   rb   r   r   )r`   r{   r   r|   r   r~   r}   r   r   r   r   r%   rb   F)r,   r-   rN   r   r2   rY   r   r   r1   mathlog2minrf   global_blockr   
ModuleListrk   r   r/   listrj   normr`   grad_checkpointing)r7   r`   r   r{   r   r|   r   r   r   r   r~   r   r   r   r   r%   rb   r   feat_levelsrp   r>   s                       r?   r-   zGlobalContextVitStage.__init__%  s\   ( 	*a%DO
 'C"1*IaLA,=>I kkmDO",$))C	NS5E$EFG(k:1<=-"++-mm  5\!%
   "##'#!EQJ'##*4Y*E)A,9#(%
 $ +5M#&"++-	""'+%
s   ,:E+c                    | j                  |      }| j                  |      }|j                  dddd      }| j                  |j                  dddd            }| j                  D ]C  }| j
                  r,t        j                  j                         st        |||      }; |||      }E | j                  |      }|j                  dddd      j                         }|S )Nr   rS   r)   r   )r   r   r   r   rj   r   r   jitis_scriptingr   r   r   )r7   rC   global_queryblks       r?   rE   zGlobalContextVitStage.forwardb  s    OOA((+ IIaAq!''(<(<Q1a(HI;; 	)C&&uyy/E/E/GsA|4<(		)
 IIaLIIaAq!,,.r@   )rF   rG   rH   r2   rJ   r   r   r1   r   r   r   r   r   r   r   r-   rE   rK   rL   s   @r?   r   r   $  s      $ %$!!+/!!36"$''#%<<&1%;( ;( 	;(
 S#X;( sCx;( ;( ;( ;( ;( ;( "%;( ;( ;( T%[%/0;(   !;(" !#;($ $%;(zr@   r   c            )       R    e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d,dedededeeef   deedf   deedf   ded	eedf   d
eedf   dededee   dedededededededef( fdZ	d-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d0dedee   fdZ	 	 	 	 	 d1d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	 	 	 d2deeee   f   d%ed&efd'Zdej*                  dej*                  fd(Zd.d)efd*Zdej*                  dej*                  fd+Z xZS )3r   in_chansnum_classesglobal_poolr   window_ratio.r|   	embed_dimdepthsr{   r   r~   r   	drop_rateproj_drop_rateattn_drop_ratedrop_path_rater%   rb   r   norm_epsc                    t         |           t        |      }t        t	        |      |      }t        t	        |      |      }g | _        t        |      }t        d |D              }|| _        || _	        || _
        t        |      }t        |d|dz
  z  z        x| _        | _        | t        |      |      }n:|J t         t        |      |      D cg c]  }|d   |z  |d   |z  f c}      }t!        ||||      | _        t%        j&                  d|t)        |            j+                  |      D cg c]  }|j-                          }}g }t/        |      D ]  }||dz
  k(  }dt1        |dz
  d      z  }|j3                  t5        di d||z  d||   d	|	|   d
|d   |z  |d   |z  fd||   d|dk7  d|d|
d|d|d|d|d||   d|d|d|       | xj
                  t7        |d   j8                  d|dz   z  d|       gz  c_         t;        j<                  | | _        tA        | j                  |||      | _!        |r"tE        t        | jF                  |      |        y y c c}w c c}w )N)epsc              3   &   K   | ]	  }|d z    yw)r   N ).0ds     r?   	<genexpr>z,GlobalContextVit.__init__.<locals>.<genexpr>  s     3Q!q&3s   rS   r   r   )r8   r9   r%   rb   r`   r   r{   r   r|   r   r   r   r~   r   r   r   r   r%   rb   r   r   zstages.)num_chsr\   module	pool_typer   )schemer   )$r,   r-   r   r   r   feature_infor   tupler   r   r   lenr1   num_featureshead_hidden_sizer   rs   stemr   linspacesumsplittolistrk   rQ   appendr   r.   r`   r2   ri   stagesr   headr   _init_weights) r7   r   r   r   r   r   r|   r   r   r{   r   r~   r   r   r   r   r   weight_initr%   rb   r   r   r   
num_stagesrrC   dprr
  rp   
last_stagestage_scaler>   s                                   r?   r-   zGlobalContextVit.__init__u  s   0 	!),	^J7XF
} =8LX&3(33	&&"[
47	A*WX.DY8Y4ZZD1"/)J/<K+++OdyYcOdeqOr s!(1+"2HQK14D!E stK!	
	 $)>>!^S[#Q#W#WX^#_`aqxxz``z" 	jAj1n,Js1q5!},KMM/ +Qi $A, %Q<;6	!8ST	
 (N 6 & $ " ( ) ) a& $ &  ,! $ $vbz~~QqS\cdecfZg"h!ii+	j, mmV, #4#4#4k[dmn	 2 2;GN M !t as   I=>Jc                 \   |dk(  rt        |t        j                        rt        j                  j	                  |j
                         |j                  Zd|v r,t        j                  j                  |j                  d       y t        j                  j                  |j                         y y y t        |t        j                        rbt        j                  j                  |j
                  d       |j                  *t        j                  j                  |j                         y y y )Nvitr   gư>)stdg{Gz?)	r/   r2   r   initxavier_uniform_weightr(   normal_zeros_)r7   r   namer   s       r?   r  zGlobalContextVit._init_weights  s    U?&")),''6;;*}>v{{3	 + - &")),37;;*GGNN6;;/ + -r@   c                     | j                         D ch c]  \  }t        fddD              r c}}S c c}}w )Nc              3   &   K   | ]  }|v  
 y wrB   r   )r   nr   s     r?   r   z3GlobalContextVit.no_weight_decay.<locals>.<genexpr>  s     Sa16Ss   )relative_position_bias_tablezrel_pos.mlp)named_parametersany)r7   r   _s    ` r?   no_weight_decayz GlobalContextVit.no_weight_decay  sK     //1U U!QS#RSS U 	U Us    :c                      t        dd      }|S )Nz^stemz^stages\.(\d+))r  rj   )r.   )r7   coarsematchers      r?   group_matcherzGlobalContextVit.group_matcher  s    $
 r@   c                 4    | j                   D ]	  }||_         y rB   )r
  r   )r7   enabless      r?   set_grad_checkpointingz'GlobalContextVit.set_grad_checkpointing  s     	*A#)A 	*r@   returnc                 .    | j                   j                  S rB   )r  fc)r7   s    r?   get_classifierzGlobalContextVit.get_classifier  s    yy||r@   c                     || _         | | j                  j                  j                  }t	        | j
                  ||| j                        | _        y )Nr   )r   r  r   r   r   r  r   )r7   r   r   s      r?   reset_classifierz!GlobalContextVit.reset_classifier  sD    &))//99K"4#4#4k[dhdrdrs	r@   rC   indicesr   
stop_early
output_fmtintermediates_onlyc                 r   |dv sJ d       g }t        t        | j                        |      \  }}	| j                  |      }t        j
                  j                         s|s| j                  }
n| j                  d|	dz    }
t        |
      D ]#  \  }} ||      }||v s|j                  |       % |r|S ||fS )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 compatible 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:

        )NCHWzOutput shape must be NCHW.Nr   )	r   r  r
  r  r   r   r   	enumerater	  )r7   rC   r2  r   r3  r4  r5  intermediatestake_indices	max_indexr
  feat_idxstages                r?   forward_intermediatesz&GlobalContextVit.forward_intermediates  s    * Y&D(DD&"6s4;;7G"Qi IIaL99!!#:[[F[[)a-0F(0 	(OHeaA<'$$Q'	(
   -r@   
prune_norm
prune_headc                     t        t        | j                        |      \  }}| j                  d|dz    | _        |r| j                  dd       |S )z@ Prune layers not required for specified intermediates.
        Nr   r    )r   r  r
  r1  )r7   r2  r?  r@  r:  r;  s         r?   prune_intermediate_layersz*GlobalContextVit.prune_intermediate_layers  sM     #7s4;;7G"Qikk.9q=1!!!R(r@   c                 J    | j                  |      }| j                  |      }|S rB   )r  r
  rd   s     r?   forward_featuresz!GlobalContextVit.forward_features+  s!    IIaLKKNr@   
pre_logitsc                 N    |r| j                  ||      S | j                  |      S )N)rF  )r  )r7   rC   rF  s      r?   forward_headzGlobalContextVit.forward_head0  s%    6@tyyzy2RdiiPQlRr@   c                 J    | j                  |      }| j                  |      }|S rB   )rE  rH  rd   s     r?   rE   zGlobalContextVit.forward3  s'    !!!$a r@   )r)     rR      )    rL     rL  N@   r)   r      r   rS   r      rM  g      @TNr   r   r   r   rB  gelulayernorm2d	layernormr   )r  F)TrB   )NFFr7  F)r   FT)rF   rG   rH   r1   r0   r   r   r   r   r-   r  r   r   ignorer#  r'  r+  r2   Moduler/  r1  r   r   r   r>  rC  rE  rH  rE   rK   rL   s   @r?   r   r   t  s"    #$(+,<+/&3)6"!+/!$&$&$&#+!,"-OOOO OO 	OO
 CHoOO  S/OO sCxOO OO #s(OOO S#XOO OO OO "%OO OO "OO  "!OO" "#OO& 'OO( )OO* +OO, -OOb0  YYU U
 YY  YY* * YY		  tC thsm t 8<$$',( ||(  eCcN34(  	( 
 (  (  !%(  
tELL!5tELL7I)I#JJ	K( X ./$#	3S	>*  	%,, 5<< 
S$ S %,, r@   c                 D    t        t        | |fdt        dd      i|}|S )Nfeature_cfg)r   r   rS   r)   T)out_indicesflatten_sequential)r   r   r.   )variant
pretrainedkwargsmodels       r?   _create_gcvitra  9  s3     ':\dK E
 Lr@   c                 2    | dddddt         t        dddd	|S )
NrJ  )r)   rK  rK  )r   r   g      ?bicubicz
stem.conv1zhead.fcT)urlr   
input_size	pool_sizecrop_pctinterpolationmeanr  
first_conv
classifierfixed_input_sizer	   )rd  r_  s     r?   _cfgrm  B  s3    4}SYI%.B")   r@   z}https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights-morevit/gcvit_xxtiny_224_nvidia-d1d86009.pth)rd  z|https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights-morevit/gcvit_xtiny_224_nvidia-274b92b7.pthz{https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights-morevit/gcvit_tiny_224_nvidia-ac783954.pthz|https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights-morevit/gcvit_small_224_nvidia-4e98afa2.pthz{https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights-morevit/gcvit_base_224_nvidia-f009139b.pth)zgcvit_xxtiny.in1kzgcvit_xtiny.in1kzgcvit_tiny.in1kzgcvit_small.in1kzgcvit_base.in1kr,  c                 8    t        dddd|}t        dd| i|S )N)rS   rS      rS   rQ  r   r{   r^  r   )gcvit_xxtinyr.   ra  r^  r_  model_kwargss      r?   rq  rq  [  s6      L OJO,OOr@   c                 8    t        dddd|}t        dd| i|S )N)r)   r   ro  r   rQ  rp  r^  r   )gcvit_xtinyrr  rs  s      r?   rv  rv  d  s6      L N:NNNr@   c                 8    t        dddd|}t        dd| i|S )NrO  rQ  rp  r^  r   )
gcvit_tinyrr  rs  s      r?   rx  rx  m  s6      L M*MMMr@   c           	      >    t        ddddddd|}t        d	d| i|S )
NrO  )r)   ro        rt   rS   r   r   r{   r   r   r   r^  r   )gcvit_smallrr  rs  s      r?   r}  r}  v  s?       L N:NNNr@   c           	      >    t        ddddddd|}t        d	d| i|S )
NrO  )r   rR  rM  rL     rS   r   r|  r^  r   )
gcvit_baserr  rs  s      r?   r  r    s?       L M*MMMr@   rV  )rB  )>rI   r   	functoolsr   typingr   r   r   r   r   r   torch.nnr2   	timm.datar
   r   timm.layersr   r   r   r   r   r   r   r   r   r   r   _builderr   	_featuresr   _features_fxr   _manipulater   r   	_registryr   r   __all__rX  r!   rN   rf   rs   rz   r1   r   r   r   r   r   r   ra  rm  default_cfgsrq  rv  rx  r}  r  r   r@   r?   <module>r     s3  *   9 9   AA A A A * + 3 0 <
!")) !H299 B299 4299 $5BII 5pU38_  sCx E#s(O  F F5BII 5pMBII M`Bryy BJ % LM KL JK KL JK&  P0@ P P O/? O O N.> N N O/? O O N.> N Nr@   