
    khu                        d 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c 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 ddlmZ ddlmZmZ d	gZ G d
 dej:                        Z G d dej:                        Z G d dej:                        Z  G d dej:                        Z! G d dej:                        Z" G d d	ej:                        Z#d Z$d Z%d Z&d*dZ'd+dZ( e e(d       e(d       e(d       e(d       e(d       e(d       e(d       e(dddd      d       Z)ed,d!e#fd"       Z*ed,d!e#fd#       Z+ed,d!e#fd$       Z,ed,d!e#fd%       Z-ed,d!e#fd&       Z.ed,d!e#fd'       Z/ed,d!e#fd(       Z0ed,d!e#fd)       Z1y)-z
CoaT architecture.

Paper: Co-Scale Conv-Attentional Image Transformers - https://arxiv.org/abs/2104.06399

Official CoaT code at: https://github.com/mlpc-ucsd/CoaT

Modified from timm/models/vision_transformer.py
    )ListOptionalTupleUnionNIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)
PatchEmbedMlpDropPath	to_2tupletrunc_normal__assert	LayerNorm   )build_model_with_cfg)register_modelgenerate_default_cfgsCoaTc                   8     e Zd ZdZ fdZdeeef   fdZ xZS )ConvRelPosEncz+ Convolutional relative position encoding. c           
      B   t         
|           t        |t              r||i}|| _        n"t        |t
              r|| _        n
t               t        j                         | _	        g | _
        |j                         D ]x  \  }}d}||dz
  |dz
  z  z   dz  }t        j                  ||z  ||z  ||f||f||f||z        }| j                  j                  |       | j                  j                  |       z | j                  D 	cg c]  }	|	|z  	 c}	| _        yc c}	w )aj  
        Initialization.
            Ch: Channels per head.
            h: Number of heads.
            window: Window size(s) in convolutional relative positional encoding. It can have two forms:
                1. An integer of window size, which assigns all attention heads with the same window s
                    size in ConvRelPosEnc.
                2. A dict mapping window size to #attention head splits (
                    e.g. {window size 1: #attention head split 1, window size 2: #attention head split 2})
                    It will apply different window size to the attention head splits.
        r      )kernel_sizepaddingdilationgroupsN)super__init__
isinstanceintwindowdict
ValueErrornn
ModuleList	conv_listhead_splitsitemsConv2dappendchannel_splits)selfhead_chs	num_headsr"   
cur_windowcur_head_splitr   padding_sizecur_convx	__class__s             L/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/models/coat.pyr   zConvRelPosEnc.__init__   s    	fc"i(F DK% DK,*0,,. 	4&JH '*q.X\)JJqPLyy))'4%|4"H-%0H NN!!(+##N3	4 6:5E5EFq8|FFs   Dsizec                 V   |j                   \  }}}}|\  }}	t        |d||	z  z   k(  d       |d d d d dd d d f   }
|d d d d dd d d f   }|j                  dd      j                  |||z  ||	      }t	        j
                  || j                  d      }g }t        | j                        D ]  \  }}|j                   |||                ! t	        j                  |d      }|j                  |||||	z        j                  dd      }|
|z  }t        j                  |d      }|S )Nr    dim)r   r   r   r   r   r   )shaper   	transposereshapetorchsplitr,   	enumerater'   r+   catFpad)r-   qvr7   Br/   NCHWq_imgv_img
v_img_listconv_v_img_listiconv
conv_v_imgEV_hats                     r6   forwardzConvRelPosEnc.forwardD   s'   WW9a1QQY# !QA+!QA+B'//9q=!QG[[(;(;C
 0 	8GAt""4
1#67	8YYA6
''9aQ?II"bQ
#v12    	__name__
__module____qualname____doc__r   r   r!   rV   __classcell__r5   s   @r6   r   r      s!    5(GT%S/ rW   r   c                   D     e Zd ZdZ	 	 	 	 	 d fd	Zdeeef   fdZ xZS )FactorAttnConvRelPosEnczK Factorized attention with convolutional relative position encoding class. c                 :   t         |           || _        ||z  }|dz  | _        t	        j
                  ||dz  |      | _        t	        j                  |      | _        t	        j
                  ||      | _	        t	        j                  |      | _
        || _        y )Ng         )bias)r   r   r/   scaler%   LinearqkvDropout	attn_dropproj	proj_dropcrpe)	r-   r=   r/   qkv_biasrh   rj   shared_crpehead_dimr5   s	           r6   r   z FactorAttnConvRelPosEnc.__init__\   s     	")#%
99S#'9I.IIc3'	I.  	rW   r7   c                    |j                   \  }}}| j                  |      j                  ||d| j                  || j                  z        j	                  ddddd      }|j                  d      \  }}}	|j                  d      }
|
j                  dd      |	z  }||z  }| j                  ||	|	      }| j                  |z  |z   }|j                  dd      j                  |||      }| j                  |      }| j                  |      }|S )
Nrb   r   r   r      r<   r:   r;   r7   )r>   rf   r@   r/   permuteunbindsoftmaxr?   rk   rd   ri   rj   )r-   r4   r7   rI   rJ   rK   rf   rG   krH   	k_softmax
factor_attrk   s                r6   rV   zFactorAttnConvRelPosEnc.forwardr   s	   ''1a hhqk!!!Q4>>1;NOWWXY[\^_abdef**Q-1a II!I$	((R014
^
 yyADy) JJ#d*KK1%%aA. IIaLNN1rW   )   F        ry   NrX   r^   s   @r6   r`   r`   Z   s0    U  ,uS#X rW   r`   c                   :     e Zd ZdZd fd	Zdeeef   fdZ xZS )
ConvPosEnczy Convolutional Position Encoding.
        Note: This module is similar to the conditional position encoding in CPVT.
    c                 p    t         t        |           t        j                  |||d|dz  |      | _        y )Nr   r   )r   )r   r{   r   r%   r*   ri   )r-   r=   ru   r5   s      r6   r   zConvPosEnc.__init__   s.    j$(*IIc31ad3?	rW   r7   c                 j   |j                   \  }}}|\  }}t        |d||z  z   k(  d       |d d d df   |d d dd f   }	}|	j                  dd      j                  ||||      }
| j	                  |
      |
z   }|j                  d      j                  dd      }t        j                  ||fd      }|S )Nr   r9   r   r<   )r>   r   r?   viewri   flattenrA   rD   )r-   r4   r7   rI   rJ   rK   rL   rM   	cls_token
img_tokensfeats              r6   rV   zConvPosEnc.forward   s    ''1a1QQY# !"!RaR%!AqrE(:	 ##Aq)..q!Q:IIdOd"IIaL""1a( IIy!n!,rW   )rb   rX   r^   s   @r6   r{   r{      s"    @uS#X rW   r{   c            	       t     e Zd ZdZdddddej
                  ej                  ddf	 fd	Zdee	e	f   fdZ
 xZS )	SerialBlockz Serial block class.
        Note: In this implementation, each serial block only contains a conv-attention and a FFN (MLP) module.       @Fry   Nc                 &   t         |           |
| _         |	|      | _        t	        ||||||      | _        |dkD  rt        |      nt        j                         | _	         |	|      | _
        t        ||z        }t        ||||      | _        y )Nr/   rl   rh   rj   rm   ry   in_featureshidden_features	act_layerdrop)r   r   cpenorm1r`   factoratt_crper   r%   Identity	drop_pathnorm2r!   r   mlp)r-   r=   r/   	mlp_ratiorl   rj   rh   r   r   
norm_layer
shared_cperm   mlp_hidden_dimr5   s                r6   r   zSerialBlock.__init__   s     	 _
5#
 1:B),BKKM  _
S9_-*	
rW   r7   c                    | j                  ||      }| j                  |      }| j                  ||      }|| j                  |      z   }| j	                  |      }| j                  |      }|| j                  |      z   }|S N)r   r   r   r   r   r   )r-   r4   r7   curs       r6   rV   zSerialBlock.forward   sx    HHQjjm!!#t,s## jjmhhsms##rW   )rY   rZ   r[   r\   r%   GELUr   r   r   r!   rV   r]   r^   s   @r6   r   r      sH    s gg||&
PuS#X rW   r   c                        e Zd ZdZg ddddej
                  ej                  df fd	Zdede	e
e
f   fdZdede	e
e
f   fd	Zd
ede	e
e
f   fdZdee	e
e
f      fdZ xZS )ParallelBlockz Parallel block class. Fry   Nc           	         t         |            |	|d         | _         |	|d         | _         |	|d         | _        t        |d   |||||
d         | _        t        |d   |||||
d         | _        t        |d   |||||
d         | _        |dkD  rt        |      nt        j                         | _         |	|d         | _         |	|d         | _         |	|d         | _        |d   |d   cxk(  r	|d   k(  sJ  J |d   |d   cxk(  r	|d   k(  sJ  J t!        |d   |d   z        }t#        |d   |||      x| _        x| _        | _        y )Nr   r   rb   r   ry   r   )r   r   norm12norm13norm14r`   factoratt_crpe2factoratt_crpe3factoratt_crpe4r   r%   r   r   norm22norm23norm24r!   r   mlp2mlp3mlp4)r-   dimsr/   
mlp_ratiosrl   rj   rh   r   r   r   shared_crpesr   r5   s               r6   r   zParallelBlock.__init__   s    	 !a) a) a)6G$Q 
  7G$Q 
  7G$Q 
 1:B),BKKM !a) a) a)Aw$q',T!W,,,,,!}
1>A>>>>>T!Wz!}45,/Q*	-
 	
	 	
DI	rW   factorr7   c                 *    | j                  |||      S )z Feature map up-sampling. scale_factorr7   interpolater-   r4   r   r7   s       r6   upsamplezParallelBlock.upsample  s    TBBrW   c                 0    | j                  |d|z  |      S )z Feature map down-sampling.       ?r   r   r   s       r6   
downsamplezParallelBlock.downsample#  s    F
FFrW   r   c                    |j                   \  }}}|\  }}t        |d||z  z   k(  d       |ddddddf   }	|ddddddf   }
|
j                  dd      j                  ||||      }
t	        j
                  |
|ddd      }
|
j                  ||d      j                  dd      }
t        j                  |	|
fd	      }|S )
z Feature map interpolation. r   r9   Nr   Fbilinear)r   recompute_scale_factormodealign_cornersr:   r<   )r>   r   r?   r@   rE   r   rA   rD   )r-   r4   r   r7   rI   rJ   rK   rL   rM   r   r   outs               r6   r   zParallelBlock.interpolate'  s    ''1a1QQY#a!QhK	q!"ax[
))!Q/771aC
]]%#(

  ''1b1;;AqA
iiJ/Q7
rW   sizesc                    |\  }}}}	| j                  |      }
| j                  |      }| j                  |      }| j                  |
|      }
| j	                  ||      }| j                  ||	      }| j                  |d|      }| j                  |d|	      }| j                  |d|	      }| j                  |
d|      }| j                  |d|      }| j                  |
d|      }|
|z   |z   }
||z   |z   }||z   |z   }|| j                  |
      z   }|| j                  |      z   }|| j                  |      z   }| j                  |      }
| j                  |      }| j                  |      }| j                  |
      }
| j                  |      }| j                  |      }|| j                  |
      z   }|| j                  |      z   }|| j                  |      z   }||||fS )Nrq   g       @)r   r7   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r-   x1x2x3x4r   _S2S3S4cur2cur3cur4upsample3_2upsample4_3upsample4_2downsample2_3downsample3_4downsample2_4s                      r6   rV   zParallelBlock.forward>  s   2r2{{2{{2{{2##Dr#2##Dr#2##Dr#2mmD"m=mmD"m=mmD"m=RbARbARbAk!K/k!M1m#m3$..&&$..&&$..&& {{2{{2{{2yyyyyy$..&&$..&&$..&&2r2~rW   )rY   rZ   r[   r\   r%   r   r   r   floatr   r!   r   r   r   r   rV   r]   r^   s   @r6   r   r      s    !
 gg||:
xC% CuS#X CGE GsCx G5 c3h . T%S/-B  rW   r   c                       e Zd ZdZdddddddd	d
dddddeddddf 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 Zd deej,                  eej,                     f   defdZdej,                  fdZ xZS )"r   z CoaT class.       rb     @      @     rb   rp      rb   r   rx   )rp   rp   rp   rp   Try   FNtokenc                    t         |           |dv sJ |xs dddd}|| _        || _        || _        |d   x| _        | _        || _        || _        t        |      }t        ||||d   t        j                        | _        t        |D cg c]  }|dz  	 c}d|d   |d	   t        j                        | _        t        |D cg c]  }|d
z  	 c}d|d	   |d   t        j                        | _        t        |D cg c]  }|dz  	 c}d|d   |d   t        j                        | _        t        j"                  t%        j&                  d	d	|d               | _        t        j"                  t%        j&                  d	d	|d	               | _        t        j"                  t%        j&                  d	d	|d               | _        t        j"                  t%        j&                  d	d	|d               | _        t1        |d   d      | _        t1        |d	   d      | _        t1        |d   d      | _        t1        |d   d      | _        t;        |d   |z  ||      | _        t;        |d	   |z  ||      | _        t;        |d   |z  ||      | _         t;        |d   |z  ||      | _!        |}|dk(  sJ tE        ||
||||      }t        jF                  tI        |d         D cg c],  }tK        d|d   |	d   | j2                  | j<                  d|. c}      | _&        t        jF                  tI        |d	         D cg c],  }tK        d|d	   |	d	   | j4                  | j>                  d|. c}      | _'        t        jF                  tI        |d         D cg c],  }tK        d|d   |	d   | j6                  | j@                  d|. c}      | _(        t        jF                  tI        |d         D cg c],  }tK        d|d   |	d   | j8                  | jB                  d|. c}      | _)        || _*        | jT                  dkD  rkt        jF                  tI        |      D cg c]=  }tW        d||	| j<                  | j>                  | j@                  | jB                  fd|? c}      | _,        nd | _,        | j                  sR| jX                  ! ||d	         | _-         ||d         | _.        nd x| _-        | _.         ||d         | _/        | jT                  dkD  r|d	   |d   cxk(  r	|d   k(  sJ  J t$        j                  ja                  dd	d	      | _1        t        jd                  |      | _3        |dkD  r t        jh                  | j
                  |      nt        jj                         | _6        n_d | _1        t        jd                  |      | _3        |dkD  r t        jh                  | j
                  |      nt        jj                         | _6        to        | j(                  d       to        | j*                  d       to        | j,                  d       to        | j.                  d       | jq                  | jr                         y c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w )Nr   avgr   rb   )rb         r:   r   )img_size
patch_sizein_chans	embed_dimr   rp   r   rx   r   )r=   ru   )r.   r/   r"   ry   )r/   rl   rj   rh   r   r   )r=   r   r   rm   )r   r   r   )in_channelsout_channelsr   {Gz?std ):r   r   return_interm_layersout_features
embed_dimsnum_featureshead_hidden_sizenum_classesglobal_poolr   r
   r%   r   patch_embed1patch_embed2patch_embed3patch_embed4	ParameterrA   zeros
cls_token1
cls_token2
cls_token3
cls_token4r{   cpe1cpe2cpe3cpe4r   crpe1crpe2crpe3crpe4r#   r&   ranger   serial_blocks1serial_blocks2serial_blocks3serial_blocks4parallel_depthr   parallel_blocksr   norm3norm4Conv1d	aggregaterg   	head_dropre   r   headr   apply_init_weights)r-   r   r   r   r   r   serial_depthsr  r/   r   rl   	drop_rateproj_drop_rateattn_drop_ratedrop_path_rater   r   r   crpe_windowr   r4   dprskwargsr   r5   s                           r6   r   zCoaT.__init__c  sf   , 	....!7qQ%7$8!($4>rNBD1&& X&&*x m> '&./a1f/A
ST m> '&./a1f/A
ST m> ''/0!a2g0QTU m>
 ,,u{{1aA'GH,,u{{1aA'GH,,u{{1aA'GH,,u{{1aA'GH :a=A6	:a=A6	:a=A6	:a=A6	 #JqMY,FR[dop
"JqMY,FR[dop
"JqMY,FR[dop
"JqMY,FR[dop
 czz$$!
 !mm =+,-.   qM$Q-99 JJ	
 -. 	
 !mm =+,-.   qM$Q-99 JJ	
 -. 	
 !mm =+,-.   qM$Q-99 JJ	
 -. 	
 !mm =+,-.   qM$Q-99 JJ	
 -. 	
 -"#%== ~.20   #)"&**djj$**djj!Q 	20 $D  $(D  ((##/'
16
'
16
*..
TZ#JqM2DJ""Q&!!}
1FAFFFFF!&QQ\]!^!#I!6ITWXBIId&7&7E^`^i^i^k	 "&!#I!6ITWXBIId&7&7E^`^i^i^k	 	doo3/doo3/doo3/doo3/

4%%&A 0 0 1D-.-.-.-.20s1   ZZ!Z&,1Z+1Z0$1Z5 1Z:/AZ?c                    t        |t        j                        rjt        |j                  d       t        |t        j                        r8|j
                  +t        j                  j                  |j
                  d       y y y t        |t        j                        rUt        j                  j                  |j
                  d       t        j                  j                  |j                  d       y y )Nr   r   r   r   )	r    r%   re   r   weightrc   init	constant_r   )r-   ms     r6   r  zCoaT._init_weights  s    a#!((,!RYY'AFF,>!!!&&!, -?'2<<(GGaffa(GGahh, )rW   c                 
    h dS )N>   r   r   r   r   r   r-   s    r6   no_weight_decayzCoaT.no_weight_decay  s    GGrW   c                     |rJ d       y )Nz$gradient checkpointing not supportedr   )r-   enables     r6   set_grad_checkpointingzCoaT.set_grad_checkpointing  s    AAAz6rW   c                 2    t        ddddddddd	d
g	      }|S )Nz#^cls_token1|patch_embed1|crpe1|cpe1z^serial_blocks1\.(\d+)z#^cls_token2|patch_embed2|crpe2|cpe2z^serial_blocks2\.(\d+)z#^cls_token3|patch_embed3|crpe3|cpe3z^serial_blocks3\.(\d+)z#^cls_token4|patch_embed4|crpe4|cpe4z^serial_blocks4\.(\d+))z^parallel_blocks\.(\d+)N)z^norm|aggregate)i )	stem1r  stem2r	  stem3r
  stem4r  r  )r#   )r-   coarsematchers      r6   group_matcherzCoaT.group_matcher  s6    848484842.
 rW   returnc                     | j                   S r   )r  r$  s    r6   get_classifierzCoaT.get_classifier.  s    yyrW   r   r   c                     || _         ||dv sJ || _        |dkD  r&t        j                  | j                  |      | _        y t        j
                         | _        y )Nr   r   )r   r   r%   re   r   r   r  )r-   r   r   s      r6   reset_classifierzCoaT.reset_classifier2  sU    &""2222*DALqBIId//=	VXVaVaVc	rW   c                 H
   |j                   d   }| j                  |      }| j                  j                  \  }}t        || j                        }| j
                  D ]  } ||||f      } t        |      j                  |||d      j                  dddd      j                         }| j                  |      }| j                  j                  \  }	}
t        || j                        }| j                  D ]  } |||	|
f      } t        |      j                  ||	|
d      j                  dddd      j                         }| j                  |      }| j                  j                  \  }}t        || j                        }| j                  D ]  } ||||f      } t        |      j                  |||d      j                  dddd      j                         }| j!                  |      }| j                   j                  \  }}t        || j"                        }| j$                  D ]  } ||||f      } t        |      j                  |||d      j                  dddd      j                         }| j&                  t(        j*                  j-                         s\| j.                  rPi }d| j0                  v r||d<   d| j0                  v r||d<   d	| j0                  v r||d	<   d
| j0                  v r||d
<   |S | j3                  |      }|S | j&                  D ]\  }| j5                  ||	|
f      | j7                  |||f      | j9                  |||f      }}} |||||||f|	|
f||f||fg      \  }}}}^ t(        j*                  j-                         sQ| j.                  rDi }d| j0                  v rBt        |      j                  |||d      j                  dddd      j                         }||d<   d| j0                  v rBt        |      j                  ||	|
d      j                  dddd      j                         }||d<   d	| j0                  v rBt        |      j                  |||d      j                  dddd      j                         }||d	<   d
| j0                  v rBt        |      j                  |||d      j                  dddd      j                         }||d
<   |S | j;                  |      }| j=                  |      }| j3                  |      }|||gS )Nr   rq   r:   rb   r   r   x1_noclsx2_noclsx3_noclsx4_nocls)r   )r>   r   	grid_size
insert_clsr   r  
remove_clsr@   rr   
contiguousr   r   r	  r   r   r
  r   r   r  r  rA   jitis_scriptingr   r   r  r   r  r  r   r  )r-   x0rI   r   H1W1blkr7  r   H2W2r8  r   H3W3r9  r   H4W4r:  feat_outs                        r6   forward_featureszCoaT.forward_features9  s   HHQK r""",,BDOO,&& 	(CRr2h'B	(b>))!RR8@@Aq!LWWY x("",,BDOO,&& 	(CRr2h'B	(b>))!RR8@@Aq!LWWY x("",,BDOO,&& 	(CRr2h'B	(b>))!RR8@@Aq!LWWY x("",,BDOO,&& 	(CRr2h'B	(b>))!RR8@@Aq!LWWY '99))+0I0I!2!22+3HZ(!2!22+3HZ(!2!22+3HZ(!2!22+3HZ( ZZ^	 '' 	aC2Bx0$))BR2I499UWZ\^`YaKbBB RRR2r(RQSHWY[]V^7_`NBB	a yy%%'D,E,EHT...%b>11!RR@HHAqRST__a'/$T...%b>11!RR@HHAqRST__a'/$T...%b>11!RR@HHAqRST__a'/$T...%b>11!RR@HHAqRST__a'/$OBBBBBBB<rW   x_feat
pre_logitsc           	      >   t        |t              r| j                  J | j                  dk(  r@t	        j
                  |D cg c]  }|d d dd f   j                  dd        c}d      }n,t	        j                  |D cg c]  }|d d df    c}d      }| j                  |      j                  d      }n3| j                  dk(  r|d d dd f   j                  d      n|d d df   }| j                  |      }|r|S | j                  |      S c c}w c c}w )Nr   r   T)r=   keepdimr<   r   )r    listr  r   rA   rD   meanstacksqueezer  r  )r-   rM  rN  xlr4   s        r6   forward_headzCoaT.forward_head  s    fd#>>---5(IIVTrr!QR%y~~!T~BTZ[\KKF ;bAqD ;Cq!))a)0A-1-=-=-Fq!"u""q")FSTVWSWLANN1q0DIIaL0 U ;s   #DDc                     t         j                  j                         s| j                  r| j	                  |      S | j	                  |      }| j                  |      }|S r   )rA   r?  r@  r   rL  rV  )r-   r4   rM  s      r6   rV   zCoaT.forward  sR    yy%%'D,E,E((++ **1-F!!&)AHrW   )TFr   )rY   rZ   r[   r\   r   r   r  rA   r?  ignorer%  r(  r0  r%   Moduler3  r!   r   strr5  rL  r   Tensorr   boolrV  rV   r]   r^   s   @r6   r   r   a  s0    *&# !&)f'P- YYH H YYB B YY " YY		  dC dhsm dO b15tELL7I)I#J 1X\ 1ELL rW   c                 x    |j                  | j                  d   dd      }t        j                  || fd      } | S )z Insert CLS token. r   r:   r   r<   )expandr>   rA   rD   )r4   r   
cls_tokenss      r6   r<  r<    s7    !!!''!*b"5J		:q/q)AHrW   c                     | ddddddf   S )z Remove CLS token. Nr   r   )r4   s    r6   r=  r=    s    QAX;rW   c                    i }| j                  d|       } | j                         D ]  \  }}|j                  d      s|j                  d      rt        |dd       x|j                  d      rt        |dd       Z|j                  d      rt        |dd       <|j                  d      rt        |dd       |j                  d      rt        |dd       |||<    |S )Nmodelr   r   r  r  r  r  )getr)   
startswithgetattr)
state_dictrc  out_dictru   rH   s        r6   checkpoint_filter_fnri    s    H4J  " 	1<< g&75'4+H+Pg&75'4+H+Pg&75'4+H+Pk*wuk4/P/Xf%'%*F*N	 OrW   c                 p    |j                  dd       rt        d      t        t        | |fdt        i|}|S )Nfeatures_onlyz<features_only not implemented for Vision Transformer models.pretrained_filter_fn)rd  RuntimeErrorr   r   ri  )variant
pretraineddefault_cfgkwargsrc  s        r6   _create_coatrr    sJ    zz/4(YZZ  2	
 E LrW   c                 2    | ddd dddt         t        ddd|S )	Nr   )rb   r   r   g?bicubicTzpatch_embed1.projr  )urlr   
input_size	pool_sizecrop_pctinterpolationfixed_input_sizerR  r   
first_conv
classifierr   )ru  rq  s     r6   	_cfg_coatr}    s2    =t%.B)  rW   ztimm/)	hf_hub_id)rb     r  r   squash)r~  rv  rx  	crop_mode)zcoat_tiny.in1kzcoat_mini.in1kzcoat_small.in1kzcoat_lite_tiny.in1kzcoat_lite_mini.in1kzcoat_lite_small.in1kzcoat_lite_medium.in1kzcoat_lite_medium_384.in1kr1  c           	      Z    t        dg dg dd      }t        dd| it        |fi |}|S )Nrp   )   r  r  r  r   r   r   r   r   r   r   r  r  ro  )	coat_tinyr#   rr  ro  rq  	model_cfgrc  s       r6   r  r    :    !5\bceIYYtI?XQW?XYELrW   c           	      Z    t        dg dg dd      }t        dd| it        |fi |}|S )Nrp   )r     r  r  r  r   r  ro  )	coat_minir  r  s       r6   r  r    r  rW   c           	      \    t        ddg dg ddd|}t        dd| it        |fi |}|S )	Nrp   )r  r   r   r   r  r   r  ro  r   )
coat_smallr  r  s       r6   r  r    sI     o!5\bcogmoIZ*ZY@YRX@YZELrW   c           	      ^    t        dg dg dg d      }t        dd| it        |fi |}|S )Nrp   )r   r      r   r  rx   rx   rp   rp   r   r   r  r   ro  )coat_lite_tinyr  r  s       r6   r  r    :    !4L]ikI^j^DD]V\D]^ELrW   c           	      ^    t        dg dg dg d      }t        dd| it        |fi |}|S )Nrp   r   r  r  r  ro  )coat_lite_minir  r  s       r6   r  r    r  rW   c           	      ^    t        dg dg dg d      }t        dd| it        |fi |}|S )Nrp   r   r   r  r  ro  )coat_lite_smallr  r  s       r6   r  r    s:    !4L]ikI_z_T)E^W]E^_ELrW   c           	      X    t        dg dg d      }t        dd| it        |fi |}|S )Nrp   r   r  r   r   rb   r   
   rx   )r   r   r  ro  )coat_lite_mediumr  r  s       r6   r  r    s7    !5]TI`
`d9F_X^F_`ELrW   c           	      Z    t        ddg dg d      }t        dd| it        |fi |}|S )Nr  rp   r  r  )r   r   r   r  ro  )coat_lite_medium_384r  r  s       r6   r  r    s:    /CS`bIdJd$yJc\bJcdELrW   )FN)r9   rX  )2r\   typingr   r   r   r   rA   torch.nnr%   torch.nn.functional
functionalrE   	timm.datar   r	   timm.layersr
   r   r   r   r   r   r   _builderr   	_registryr   r   __all__rZ  r   r`   r{   r   r   r   r<  r=  ri  rr  r}  default_cfgsr  r  r  r  r  r  r  r  r   rW   r6   <module>r     s   0 /     A _ _ _ * <(?BII ?D/bii /d 67")) 7t}BII }@~299 ~B

  %'2'2 73$w7$w7%8&9!* 3("&  T   T   d   $   $   4   D     rW   