Ë
    éÓ^j¯„  ã            	       óÚ  — d Z ddlZddlZddlmZmZ ddlmZmZm	Z	m
Z
 ddlZddlZddlmZ ddlmc mZ ddl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dgZ(dZ)dZ*de+de+dee+   fd„Z,	 	 d>de+de-dej\                  fd„Z/	 	 d>de+de-dej\                  fd„Z0 G d„ dejb                  «      Z2 G d„ dejb                  «      Z3d?de+fd„Z4 G d„ dejb                  «      Z5 G d „ d!ejb                  «      Z6 G d"„ d#ejb                  «      Z7 G d$„ d%ejb                  «      Z8 G d&„ d'ejb                  «      Z9 G d(„ d)ejb                  «      Z: G d*„ d+ejb                  «      Z; G d,„ dejb                  «      Z<d@d-„Z= e' e=d.¬/«       e=d.d0d1¬2«       e=d.d3d1¬4«      d5œ«      Z>d6e?d7ejb                  de?fd8„Z@dAd9eAd:e-de<fd;„ZBe&dAd:e-de<fd<„«       ZCe&dAd:e-de<fd=„«       ZDy)Ba  CSATv2

A frequency-domain vision model using DCT transforms with spatial attention.

Paper: TBD

This model created by members of MLPA Lab. Welcome feedback and suggestion, questions.
gusdlf93@naver.com
juno.demie.oh@gmail.com

Refined for timm by Ross Wightman
é    N)ÚpartialÚreduce)ÚListÚOptionalÚTupleÚUnion)Útrunc_normal_ÚDropPathÚMlpÚLayerNorm2dÚ	AttentionÚNormMlpClassifierHeadÚ
LayerScaleÚLayerScale2d)ÚGlobalResponseNorm)Úbuild_model_with_cfg)Úfeature_take_indices)Ú
checkpointÚcheckpoint_seqé   )Úregister_modelÚgenerate_default_cfgsÚCSATv2Úcsatv2))@g£;ˆ�i#�@g”ö_˜Le¿gmV}®¶bÕ?g†ZÓ¼ã�¿çiUMuÿ>gž{—œ¿g µ‰“û]¿çiUMu?gñhãˆµø4?g	áÑÆk¡?gˆ�)t^cw¿g-Cëâ6*?r   gžŽ’Wç8¿g^×/ØÛv¿g„dS¿ç       €g!¡JÍ>¿çñhãˆµø¿ga2U0*©3¿g	3mÿÊJƒ?gÿ	.VÔ`Z?çÖÿ9Ì—¿çiUMu¿gÒûÆ×žY"¿gÇº¸�ð6¿çñhãˆµøä>g/n£¼b¿g8„*5{ 5?çñhãˆµøô¾çiUMuÿ¾g-Cëâ6*¿çÒûÆ×žY?r   ç-Cëâ6
?gG¬Å§ h?çñhãˆµø¿r   gžŽ’Wç(?çñhãˆµø?r   ga2U0*©#¿r"   r$   g-Cëâ6?r&   çñhãˆµø?ç        r(   çñhãˆµøä¾ga2U0*©#?çñhãˆµøô>r$   r   r'   r*   r'   r   r+   r   r   r   r#   r   )@g Òo_ÇŽ@g¹nÀç‡q¿gÅ�1w-¹?gžŽ’WçX?r   gå'Õ>�i?g™�Êø÷W¿r*   gCÅ8
!¿g/Ý$�…?g”ö_˜LE?r   r   r   g8„*5{ e?r)   r!   r$   r    r   gÈêVÏIïk?g¢—Q,·´Z?r'   r   r*   r(   r   g’ËH¿}M?gÖÿ9Ì—'?r    r*   r$   r#   r*   r   g¼yªCn†K?r   r*   r)   r'   r*   r"   r)   r!   r+   r!   r'   çK°8œùÕ?r)   r#   r,   r"   r!   r!   r!   r!   çÒûÆ×žY¿r#   r!   r)   r!   r+   r!   r)   )@gQ1Îß¤t�@gP6å
ïra¿gVñFæ‘·¿g~têÊgy^?çCÅ8
!?g€Ÿqá@H6?g�kCÅ8S¿r+   r,   g×†Šqþ&„¿gÚæÆô„%>?r-   r*   g-Cëâ6
¿g’ËH¿}]?g¼yªCn†;?r+   g-Cëâ6¿r'   r   gcbóqm¨h¿g{®GázT?r"   r#   r*   r*   r*   gÒûÆ×žYB?g¼yªCn†+?r!   r*   r+   r*   r*   r%   gÇº¸�ðF¿r"   r"   r%   r&   r   r+   r"   r!   r)   r#   r'   r$   r!   r)   r.   r   r)   r+   r   r*   r&   r#   r)   r!   r*   r!   r   r)   ))@g   €‘€Ag©¤N@�¸@g->ÀðV·@gr3Ü€oÔ™@gðŠà«ß–@g|~!\¢œ@gº ¾eŸ‡@gwR~R£…@g[”Ù “D„@gMuÀ„@gqZð¢¯Üq@g-²�ïÙr@gC­iÞñÆw@gõœô¾qÝu@gP6åŠbw@gîZB>èÉg@gŸF�Øg@g&�Ñ:ª´k@gxî=\ri@g"«[='<b@g­QÑèº_@g´CV·O@gý\ðP@g�ŸqášY@gK°8œù7`@gJï_{A`@ggí¶ÍÇY@ge¥I)èpX@gÊl�IF–J@gòÏ½gK@g�N]ù,_R@g‚ÿ­dÇBT@gX9´ÈvVQ@g�ô¾ñµ‡H@g×i¤¥òú@@gcÑtv2„B@gÌz1”}4@gûËîÉÃò8@g\ÉŽ�@ô@@g.Êl�IFF@g²… %ÈG@gÜFxD@gžê�›án>@g–x@Ù”£6@g‹2d’‰:@güo%;6’:@g„dØ5@gß2§Ëbj1@gèy’t].@g†!YÀd%@g%zÅr{&@g§t°þÏñ)@g’?xî-.@güûŒ¢.@gHmâäÎ!@giR
º½Ä@gMÛ¿²Ò¤@g¸éÏ~¤è@gJFÎÂž¶@g„Ø™Bçµ@g%XÎü
@gXVš”‚î@gå'Õ>O@gÔe1±ù¸÷?)@g[|
€ÍeÒ@ga¦í_Yt@g%;6qÂr@gQkšwœ^S@g:d¯wS@g³Í�é	CV@gHŠÈ°Šÿ@@g2�üÁÀ_A@gÏNGÉ@@gÃð1%2<@g-²�ï(@ga7l[”‰,@g“o¶¹1u2@g*Wx—‹˜0@g]3ùf›[/@g5ÒRy;‚@gqr¿CQ !@g ã4”$@g‹72�üÑ"@gÁ9#J{Ã@gñ×d�z¨@gµÃ_“5j@gtÈ^ï>@g–²q¬«@gÑ–s)®j@gx´qÄZü@gEdXÅY@gÐ›ŠT[@gºN#-•7ÿ?g¡¹N#-@gßà“©‚@g‘~û:p@g5ÒRy;‚@g—âª²ïŠ@gJÒ5“o¶ø?gs×òAù?gTŒó7¡ï?g	Äëú;ò?g·]h®ÓÈ÷?g Tût<fþ?gÓ¤t{Iÿ?g1¬Zdú?g½:Ç€ìõó?g'÷;úí?g µ‰“{ñ?g 2þ}Æ…ñ?gàÖÝ<Õ!î?g³^åDé?gnQfƒL2ç?g³^åDà?g|—wJà?gr§t°þÏá?gÃ¶E™2ä?g…ëQ¸…ä?g"‰^F±ÜØ?g±ÄÊ¦\Õ?g(ò$éšÉÓ?g´«�ò“jÕ?g¸…ëQ¸Ê?g3d’‘³È?g~ãkÏ,	Ì?gã6À[ Á?gL£uT5Á?g¸u7Ou¸?)@g[|
€Ù¹Ð@g8¡Mr@g”M¹Â;÷p@gÈ^ïþ¨P@gðmú³ÍO@g¿+‚ÿ­S@g›É7ÛÜ<@g©ÞØ*Ù;@g,Ÿåyp÷9@g_˜LŒš7@g–ìØÄû#@gÁnØ¶(³&@gq¬‹Ûhð,@gïrßÙ)@gû–9]c)@gEõÖÀV©@g*Æù›Ph@g‰”M¹¢@gã¥›Ä P@grùé·O@grùé·/@gúòì£@g€·@‚â‡@gòï3.H@g3Ä±.n@geS®ðŽ@gíÓñ˜�Ê
@gõg?RDÆ@gÁV	‡³ù?gÃdª`TRü?g¸u7Ï@g„Ó‚}…@g[%X@g�üÁÀsïû?ga†�ˆ)ô?gÄáÑÆõ?gÃ»\Äwbé?gMÖ¨‡htí?gO@aÃÓò?g>?Œž÷?gö]üo%ø?gj¼t“˜ô?gdu«ç¤÷ï?gÃ*ÞÈ<òç?gÁ=~oë?gÛù~j¼të?g£Ì™däç?gmÿÊJ“Rä?g»aÛ¢Ìâ?gZØÓMÚ?g7qr¿CQÚ?gfÚþ••Ü?gm±à?g\='½o|à?gCV·zNÔ?g;6ñº~Ñ?gá´àE_AÐ?gs�FZ*oÑ?güo%;6Æ?g‘~û:pÎÄ?g|ò°PkšÇ?gO’®™|³½?g�KqUÙw½?goƒÀÊ¡µ?ÚrowsÚcolsÚreturnc                 ó¶  — t        j                  d| |z  d«      j                  | |«      j                  «       }t	        | |z   dz
  «      D �cg c]  }g ‘Œ }}g }t	        | «      D ]U  }t	        |«      D ]E  }||z   }|dz  dk(  r||   j                  d||   |   «       Œ,||   j                  ||   |   «       ŒG ŒW |D ]  }	|j                  |	«       Œ |S c c}w )z0Generate zigzag scan order for DCT coefficients.r   r   é   )ÚnpÚarangeÚreshapeÚtolistÚrangeÚinsertÚappendÚextend)
r/   r0   Ú
idx_matrixÚ_ÚdiaÚzigzagÚiÚjÚsÚds
             ú]/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/csatv2.pyÚ_zigzag_permutationrE   X   sè   € ä—‘˜1˜d T™k¨1Ó-×5Ñ5°d¸DÓA×HÑHÓJ€JÜ˜T D™[¨1™_Ó-Ö
.�!Š2Ð
.€CÐ
.Ø€FÜ�4‹[ò 0ˆÜ�t“ò 	0ˆAØ�A‘ˆAØ�1‰u˜ŠzØ�A‘—‘˜a ¨A¡¨qÑ!1Õ2à�A‘—‘˜j¨™m¨AÑ.Õ/ñ	0ð0ð ò ˆØ�‰�aÕðà€Mùò /s   Á	CÚkernel_sizeÚorthonormalc                 óÊ  — t        ||¬«      }t        j                  | fi |¤Ž}|j                  «       j	                  «       j                  d| «      }t        j                  ||j                  dg«      gd¬«      }t        j                  j                  |d¬«      dd…d| …f   }t        j                  d|t        j                  ¬«      t        j                  z  t        j                  | |t        j                  ¬«      ddd…f   z  }t        j                  || dz  z  «      }||z  }|j                  }|r„|dd…df   t        j                   t        j                  d| d	z  z  fi |¤Ž«      z  |dd…df<   |dd…dd…f   t        j                   t        j                  d| dz  z  fi |¤Ž«      z  |dd…dd…f<    |j	                  «       j
                  |j"                  Ž }|S )
z#Generate Type-II DCT kernel matrix.©ÚdeviceÚdtypeéÿÿÿÿr   ©ÚdimNy       €      ð¿r3   r   é   )ÚdictÚtorchÚeyeÚcloneÚ
contiguousÚviewÚcatÚflipÚfftÚtensorÚ	complex64Úpir5   ÚlongÚexpÚrealÚsqrtÚshape)rF   rG   rJ   rK   ÚddÚxÚvÚks           rD   Ú_dct_kernel_type_2re   i   s’  € ô 
�V 5Ô	)€BÜ�	‰	�+Ñ$ Ñ$€AØ	�‰‹	×ÑÓ×#Ñ# B¨Ó4€AÜ�	‰	�1�a—f‘f˜a˜S“kÐ"¨Ô+€AÜ�	‰	�‰�a˜RˆÓ ¢ L [ L Ñ1€Aä�‰�S ¬u¯©Ô?Ä%Ç(Á(ÑJÜ
�,‰,�{¨6¼¿¹Ô
DÀTÊ1ÀWÑ
Mñ	Nð ô 	�	‰	�!�{ Q‘Ñ'Ó(€AØ	ˆA‰€AØ	�‰€AÙØ’A�q�D‘'œEŸJ™J¤u§|¡|°A¸Àq¹Ñ4IÑ'PÈRÑ'PÓQÑQˆŠ!ˆQˆ$‰Ø’Q˜™�U‘8œeŸj™j¬¯©°a¸;È¹?Ñ6KÑ)RÈrÑ)RÓSÑSˆŠ!ˆQ‰Rˆ%‰Øˆ�‰‹×Ñ˜QŸW™WÐ%€AØ€Hó    c                 óX   — t         j                  j                  t        | |||«      «      S )z9Generate Type-III DCT kernel matrix (inverse of Type-II).)rQ   ÚlinalgÚinvre   )rF   rG   rJ   rK   s       rD   Ú_dct_kernel_type_3rj   ƒ   s&   € ô �<‰<×ÑÔ.¨{¸KÈÐQVÓWÓXÐXrf   c            	       óv   ‡ — e Zd ZdZ	 	 	 	 d
dedededdfˆ fd„Zdej                  dej                  fd	„Z	ˆ xZ
S )ÚDct1dz#1D Discrete Cosine Transform layer.NrF   Úkernel_typerG   r1   c                 óê   •— t        ||¬«      }t        ‰	| �	  «        t        t        dœ} ||›    ||fi |¤Žj
                  }| j                  d|j                  «       «       | j                  dd «       y )NrI   )Ú2Ú3ÚweightsÚbias)	rP   ÚsuperÚ__init__re   rj   ÚTÚregister_bufferrT   Úregister_parameter)
ÚselfrF   rm   rG   rJ   rK   ra   ÚkernelÚdct_weightsÚ	__class__s
            €rD   rt   zDct1d.__init__�   sp   ø€ ô ˜ uÔ-ˆÜ‰ÑÔÜ)Ô0BÑCˆØ.�f ˜}Ñ.¨{¸KÑNÈ2ÑN×PÑPˆØ×Ñ˜Y¨×(>Ñ(>Ó(@ÔAØ×Ñ ¨Õ-rf   rb   c                 óX   — t        j                  || j                  | j                  «      S ©N)ÚFÚlinearrq   rr   ©rx   rb   s     rD   ÚforwardzDct1d.forwardŸ   s   € Ü�x‰x˜˜4Ÿ<™<¨¯©Ó3Ð3rf   ©r3   TNN©Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚintÚboolrt   rQ   ÚTensorr�   Ú__classcell__©r{   s   @rD   rl   rl   �   sZ   ø„ Ù-ð
  !Ø $ØØñ.àð.ð ð.ð ð	.ð 
õ.ð4˜Ÿ™ð 4¨%¯,©,÷ 4rf   rl   c            	       óv   ‡ — e Zd ZdZ	 	 	 	 d
dedededdfˆ fd„Zdej                  dej                  fd	„Z	ˆ xZ
S )ÚDct2dz#2D Discrete Cosine Transform layer.NrF   rm   rG   r1   c                 ób   •— t        ||¬«      }t        ‰| �	  «        t        |||fi |¤Ž| _        y ©NrI   )rP   rs   rt   rl   Ú	transform©rx   rF   rm   rG   rJ   rK   ra   r{   s          €rD   rt   zDct2d.__init__¦   s1   ø€ ô ˜ uÔ-ˆÜ‰ÑÔÜ˜{¨K¸ÑKÈÑKˆ�rf   rb   c                 ó‚   — | j                  | j                  |«      j                  dd«      «      j                  dd«      S )NrL   éþÿÿÿ)r‘   Ú	transposer€   s     rD   r�   zDct2d.forward²   s5   € Ø�~‰~˜dŸn™n¨QÓ/×9Ñ9¸"¸bÓAÓB×LÑLÈRÐQSÓTÐTrf   r‚   rƒ   rŒ   s   @rD   rŽ   rŽ   £   sb   ø„ Ù-ð
  !Ø $ØØñ
Làð
Lð ð
Lð ð	
Lð 
õ
LðU˜Ÿ™ð U¨%¯,©,÷ Urf   rŽ   Úout_chsc           
      ó&  ‡‡— t        t        j                  |«      Št        ˆfd„|D «       «      }t	        |«      }| |z  dk(  r| |k\  sJ d| › d|› d|› d|› d�	«       ‚| |z  Šˆfd„|D «       \  }}}||z   |z   | k(  rt        |||«      dkD  sJ ‚|||fS )	Nc              3   ó(   •K  — | ]	  }|‰z  –— Œ y ­wr}   © )Ú.0rb   Úgs     €rD   ú	<genexpr>z!_split_out_chs.<locals>.<genexpr>¹   s   øè ø€ Ò$˜ˆa�1�fÑ$ùó   ƒr   zout_chs=z( can't be split into Y/Cb/Cr with ratio z
 (reduced z!); out_chs must be a multiple of ú.c              3   ó(   •K  — | ]	  }|‰z  –— Œ y ­wr}   r™   )rš   ÚriÚunits     €rD   rœ   z!_split_out_chs.<locals>.<genexpr>Â   s   øè ø€ Ò'˜r��d•Ñ'ùr�   )r   ÚmathÚgcdÚtupleÚsumÚmin)	r–   ÚratioÚrÚdenomÚyÚcbÚcrr›   r¡   s	          @@rD   Ú_split_out_chsr­   ¶   sÁ   ù€ äŒt�x‰x˜Ó€AÜÓ$˜eÔ$Ó$€AÜ�‹F€Eà�U‰?˜aÒ G¨uÒ$4ð Ø
�7�)ÐCÀEÀ7ð KØ�3Ð7¸°w¸að	AóÐ4ð
 �eÑ€DÛ' QÔ'�I€A€rˆ2Øˆr‰6�B‰;˜'Ò!¤c¨!¨R°£n°qÒ&8Ð8Ð8Øˆb�"ˆ9Ðrf   c                   ó<  ‡ — e Zd ZdZ	 	 	 	 	 ddededededdf
ˆ fd„Zdd	„Zdd
„Zdd„Z	de
j                  de
j                  fd„Zde
j                  de
j                  fd„Zde
j                  de
j                  fd„Zde
j                  de
j                  fd„Zˆ xZS )ÚLearnableDct2dzKLearnable 2D DCT stem with RGB to YCbCr conversion and frequency selection.NrF   rm   rG   r–   r1   c           
      óü  •— t        ||¬«      }t        ‰| �	  «        || _        t	        |||fi |¤Ž| _        t        ||«      | _        t        |d¬«      \  }}	}
t        j                  |dz  |fdddœ|¤Ž| _        t        j                  |dz  |	fdddœ|¤Ž| _        t        j                  |dz  |
fdddœ|¤Ž| _        | j                  dt        j                   d	d
||¬«      d¬«       | j                  dt        j                   d	d
||¬«      d¬«       | j                  dt        j                   d	dd||¬«      d¬«       | j                  dt        j                   d	dd||¬«      d¬«       | j#                  «        y )NrI   ©é   rO   rO   )r§   r3   r   r   ©rF   ÚpaddingÚmeané   é@   F)Ú
persistentÚvarÚimagenet_meanÚimagenet_std)rP   rs   rt   rd   rŽ   r‘   rE   Úpermutationr­   ÚnnÚConv2dÚconv_yÚconv_cbÚconv_crrv   rQ   ÚemptyÚreset_parameters)rx   rF   rm   rG   r–   rJ   rK   ra   Úy_chÚcb_chÚcr_chr{   s              €rD   rt   zLearnableDct2d.__init__Ê   ss  ø€ ô ˜ uÔ-ˆÜ‰ÑÔØˆŒÜ˜{¨K¸ÑKÈÑKˆŒÜ.¨{¸KÓHˆÔä+¨G¸:ÔFÑˆˆe�UÜ—y‘y °Ñ!1°4ÐYÀaÐQRÑYÐVXÑYˆŒÜ—y‘y °Ñ!1°5ÐYÀaÐQRÑYÐVXÑYˆŒÜ—y‘y °Ñ!1°5ÐYÀaÐQRÑYÐVXÑYˆŒð 	×Ñ˜V¤U§[¡[°°B¸vÈUÔ%SÐ`eÐÔfØ×Ñ˜U¤E§K¡K°°2¸fÈEÔ$RÐ_dÐÔeà×Ñ˜_¬e¯k©k¸!¸QÀÈ&ÐX]Ô.^ÐkpÐÔqØ×Ñ˜^¬U¯[©[¸¸A¸qÈÐW\Ô-]ÐjoÐÔpð 	×ÑÕrf   c                 ó$   — | j                  «        y)zInitialize buffers.N©Ú_init_buffers©rx   s    rD   rÃ   zLearnableDct2d.reset_parametersè   ó   € à×ÑÕrf   c                 óÐ  — | j                   j                  t        j                  t        «      «       | j
                  j                  t        j                  t        «      «       | j                  j                  t        j                  g d¢«      j                  ddd«      «       | j                  j                  t        j                  g d¢«      j                  ddd«      «       y)z.Compute and fill non-persistent buffer values.©g
×£p=
ß?gÉv¾Ÿ/Ý?g–C‹lçûÙ?r¶   r   ©gZd;ßOÍ?gyé&1¬Ì?gÍÌÌÌÌÌÌ?N)
rµ   Úcopy_rQ   rY   Ú	_DCT_MEANr¹   Ú_DCT_VARrº   rU   r»   rÊ   s    rD   rÉ   zLearnableDct2d._init_buffersì   s�   € à�	‰	�‰œŸ™¤YÓ/Ô0Ø�‰�‰”u—|‘|¤HÓ-Ô.Ø×Ñ× Ñ ¤§¡Ò.CÓ!D×!IÑ!IÈ!ÈQÐPQÓ!RÔSØ×Ñ×Ñ¤§¡Ò-BÓ C× HÑ HÈÈAÈqÓ QÕRrf   c                 ó$   — | j                  «        y)z"Initialize non-persistent buffers.NrÈ   rÊ   s    rD   Úinit_non_persistent_buffersz*LearnableDct2d.init_non_persistent_buffersó   rË   rf   rb   c                 óp   — |j                  | j                  «      j                  | j                  «      dz  S )z3Convert from ImageNet normalized to [0, 255] range.éÿ   )Úmulr»   Úadd_rº   r€   s     rD   Ú_denormalizezLearnableDct2d._denormalize÷   s-   € à�u‰u�T×&Ñ&Ó'×,Ñ,¨T×-?Ñ-?Ó@À3ÑFÐFrf   c                 óº   — |dd…df   |dd…df   |dd…df   }}}|dz  |dz  z   |dz  z   }d||z
  z  d	z   }d
||z
  z  d	z   }t        j                  |||gd¬«      S )z5Convert RGB to YCbCr color space (BCHW input/output).Nr   r   r3   g‰A`åÐ"Ó?gbX9´Èâ?gÉv¾Ÿ/½?g?5^ºIâ?é€   g7‰A`åÐæ?rM   )rQ   Ústack)rx   rb   r¨   r›   Úbrª   r«   r¬   s           rD   Ú_rgb_to_ycbcrzLearnableDct2d._rgb_to_ycbcrû   s}   € à’A�q�D‘'˜1šQ ˜T™7 A¢a¨ d¡Gˆaˆ1ˆØ�‰I˜˜E™	Ñ! A¨¡IÑ-ˆØ�a˜!‘e‰_˜sÑ"ˆØ�a˜!‘e‰_˜sÑ"ˆÜ�{‰{˜A˜r 2˜;¨AÔ.Ð.rf   c                 óJ   — | j                   dz  dz   }|| j                  z
  |z  S )z8Normalize DCT coefficients using precomputed statistics.g      à?g:Œ0âŽyE>)r¹   rµ   )rx   rb   Ústds      rD   Ú_frequency_normalizez#LearnableDct2d._frequency_normalize  s'   € à�h‰h˜#‰o Ñ$ˆØ�D—I‘I‘ Ñ$Ð$rf   c                 óH  — |j                   \  }}}}| j                  |«      }| j                  |«      }|j                  |||| j                  z  | j                  || j                  z  | j                  «      }|j                  dddddd«      }| j                  |«      }|j                  d|| j                  | j                  z  «      }|d d …d d …| j                  f   }| j                  |«      }|j                  ||| j                  z  || j                  z  |d«      }|j                  ddddd«      j                  «       }| j                  |d d …df   «      }| j                  |d d …df   «      }| j                  |d d …df   «      }t        j                  |||gd¬«      S )	Nr   r3   rO   r   r¶   é   rL   rM   )r`   rØ   rÝ   r6   rd   Úpermuter‘   r¼   rà   rT   r¿   rÀ   rÁ   rQ   rV   )	rx   rb   rÜ   ÚcÚhÚwÚx_yÚx_cbÚx_crs	            rD   r�   zLearnableDct2d.forward  sm  € Ø—W‘W‰
ˆˆ1ˆa�Ø×Ñ˜aÓ ˆØ×Ñ˜qÓ!ˆà�I‰I�a˜˜A §¡™K¨¯©°°d·f±f±¸d¿f¹fÓEˆØ�I‰I�a˜˜A˜q ! QÓ'ˆØ�N‰N˜1ÓˆØ�I‰I�b˜!˜TŸV™V d§f¡f™_Ó-ˆØŠa’�D×$Ñ$Ð$Ñ%ˆØ×%Ñ% aÓ(ˆØ�I‰I�a˜˜dŸf™f™ a¨4¯6©6¡k°1°bÓ9ˆØ�I‰I�a˜˜A˜q !Ó$×/Ñ/Ó1ˆØ�k‰k˜!šA˜q˜D™'Ó"ˆØ�|‰|˜Aša ˜d™GÓ$ˆØ�|‰|˜Aša ˜d™GÓ$ˆÜ�y‰y˜#˜t TÐ*°Ô2Ð2rf   )r3   Té    NN©r1   N)r„   r…   r†   r‡   rˆ   r‰   rt   rÃ   rÉ   rÓ   rQ   rŠ   rØ   rÝ   rà   r�   r‹   rŒ   s   @rD   r¯   r¯   Ç   sË   ø„ ÙUð
  !Ø $ØØØñ àð ð ð ð ð	 ð
 ð ð 
õ ó<óSóðG˜eŸl™lð G¨u¯|©|ó Gð/˜uŸ|™|ð /°·±ó /ð% e§l¡lð %°u·|±|ó %ð
3˜Ÿ™ð 3¨%¯,©,÷ 3rf   r¯   c            	       ó”   ‡ — e Zd ZdZ	 	 	 	 d
dedededdfˆ fd„Zdej                  de	ej                  ej                  f   fd	„Z
ˆ xZS )Ú
Dct2dStatsz5Utility module to compute DCT coefficient statistics.NrF   rm   rG   r1   c                 ó’   •— t        ||¬«      }t        ‰| �	  «        || _        t	        |||fi |¤Ž| _        t        ||«      | _        y r�   )rP   rs   rt   rd   rŽ   r‘   rE   r¼   r’   s          €rD   rt   zDct2dStats.__init__  sG   ø€ ô ˜ uÔ-ˆÜ‰ÑÔØˆŒÜ˜{¨K¸ÑKÈÑKˆŒÜ.¨{¸KÓHˆÕrf   rb   c                 óè  — |j                   \  }}}}|j                  |||| j                  z  | j                  || j                  z  | j                  «      }|j                  dddddd«      }| j	                  |«      }|j                  d|| j                  | j                  z  «      }|d d …d d …| j
                  f   }|j                  ||| j                  z  z  || j                  z  z  |d«      }t        j                  ddg«      }t        j                  ddg«      }t        d«      D ]D  }t        j                  |d d …|f   d¬	«      ||<   t        j                  |d d …|f   d¬	«      ||<   ŒF ||fS )
Nr   r3   rO   r   r¶   râ   rL   r·   rM   )r`   r6   rd   rã   r‘   r¼   rQ   Úzerosr8   rµ   r¹   )	rx   rb   rÜ   rä   rå   ræ   Ú	mean_listÚvar_listr@   s	            rD   r�   zDct2dStats.forward,  sF  € Ø—W‘W‰
ˆˆ1ˆa�à�I‰I�a˜˜A §¡™K¨¯©°°d·f±f±¸d¿f¹fÓEˆØ�I‰I�a˜˜A˜q ! QÓ'ˆØ�N‰N˜1ÓˆØ�I‰I�b˜!˜TŸV™V d§f¡f™_Ó-ˆØŠa’�D×$Ñ$Ð$Ñ%ˆØ�I‰I�a˜1 §¡™;Ñ'¨1°·±©;Ñ7¸¸BÓ?ˆä—K‘K  B Ó(ˆ	Ü—;‘;  2˜wÓ'ˆÜ�q“ò 	4ˆAÜ Ÿ:™: aª¨1¨¡g°1Ô5ˆI�a‰LÜŸ)™) A¢a¨ d¡G°Ô3ˆH�QŠKð	4ð ˜(Ð"Ð"rf   r‚   )r„   r…   r†   r‡   rˆ   r‰   rt   rQ   rŠ   r   r�   r‹   rŒ   s   @rD   rí   rí     sm   ø„ Ù?ð
  !Ø $ØØñIàðIð ðIð ð	Ið 
õIð#˜Ÿ™ð #¨%°·±¸e¿l¹lÐ0JÑ*K÷ #rf   rí   c            	       ó|   ‡ — e Zd ZdZ	 	 	 	 d
dededee   ddfˆ fd„Zdej                  dej                  fd	„Z
ˆ xZS )ÚBlockz,ConvNeXt-style block with spatial attention.NrN   Ú	drop_pathÚls_init_valuer1   c                 óT  •— t        ||¬«      }t        ‰| �	  «        t        j                  ||fdd|dœ|¤Ž| _        t        j                  |fddi|¤Ž| _        t        j                  |d|z  fi |¤Ž| _	        t        j                  «       | _        t        d|z  fdd	i|¤Ž| _        t        j                  d|z  |fi |¤Ž| _        |rt        |fd
|i|¤Žnt        j                   «       | _        |dkD  rt%        |«      nt        j                   «       | _        t)        di |¤Ž| _        y )NrI   é   r¶   )rF   r´   ÚgroupsÚepsç�íµ ÷Æ°>rO   Úchannels_lastTÚinit_valuesr)   r™   )rP   rs   rt   r½   r¾   ÚdwconvÚ	LayerNormÚnormÚLinearÚpwconv1ÚGELUÚactr   ÚgrnÚpwconv2r   ÚIdentityÚlsr
   rõ   ÚSpatialAttentionÚattn)rx   rN   rõ   rö   rJ   rK   ra   r{   s          €rD   rt   zBlock.__init__A  s  ø€ ô ˜ uÔ-ˆÜ‰ÑÔÜ—i‘i  SÐU°aÀÈ3ÑUÐRTÑUˆŒÜ—L‘L Ñ5¨$Ð5°"Ñ5ˆŒ	Ü—y‘y  a¨#¡gÑ4°Ñ4ˆŒÜ—7‘7“9ˆŒÜ% a¨#¡gÑH¸TÐHÀRÑHˆŒÜ—y‘y  S¡¨#Ñ4°Ñ4ˆŒÙHU”,˜sÑD°ÐDÀÒDÔ[]×[fÑ[fÓ[hˆŒØ09¸B²œ )Ô,ÄBÇKÁKÃMˆŒÜ$Ñ* rÑ*ˆ�	rf   rb   c                 óä  — |}| j                  |«      }|j                  dddd«      }| j                  |«      }| j                  |«      }| j	                  |«      }| j                  |«      }| j                  |«      }|j                  dddd«      }| j                  |«      }t        j                  ||j                  dd  dd¬«      }||z  }| j                  |«      }|| j                  |«      z   S )Nr   r3   r¶   r   ÚbilinearT)ÚsizeÚmodeÚalign_corners)rþ   rã   r   r  r  r  r  r
  r~   Úinterpolater`   r  rõ   )rx   rb   Úshortcutr
  s       rD   r�   zBlock.forwardU  sÓ   € ØˆØ�K‰K˜‹NˆØ�I‰I�a˜˜A˜qÓ!ˆØ�I‰I�a‹LˆØ�L‰L˜‹OˆØ�H‰H�Q‹KˆØ�H‰H�Q‹KˆØ�L‰L˜‹OˆØ�I‰I�a˜˜A˜qÓ!ˆà�y‰y˜‹|ˆÜ�}‰}˜T¨¯©°°¨¸*ÐTXÔYˆØ�‰HˆØ�G‰G�A‹Jˆà˜$Ÿ.™.¨Ó+Ñ+Ð+rf   )r)   NNN)r„   r…   r†   r‡   rˆ   Úfloatr   rt   rQ   rŠ   r�   r‹   rŒ   s   @rD   rô   rô   >  s^   ø„ Ù6ð
  "Ø-1ØØñ+àð+ð ð+ð $ E™?ð	+ð 
õ+ð(,˜Ÿ™ð ,¨%¯,©,÷ ,rf   rô   c                   ód   ‡ — e Zd ZdZ	 	 d	 dˆ fd„Zdej                  dej                  fd„Zˆ xZS )ÚSpatialTransformerBlockzüLightweight transformer block for spatial attention (1-channel, 7x7 grid).

    This is a simplified transformer with single-head, 1-dim attention over spatial
    positions. Used inside SpatialAttention where input is 1 channel at 7x7 resolution.
    r1   c                 ó@  •— t        ||¬«      }t        ‰| �	  «        t        dddi|¤Ž| _        t        j                  d	i |¤Ž| _        t        j                  d
ddi|¤Ž| _	        t        j                  d	i |¤Ž| _
        t        ddt
        j                  i|¤Ž| _        y )NrI   Úin_chansr   rr   F)r   rO   r   Ú	act_layerr™   )r   )r   r¶   )rP   rs   rt   ÚPosConvÚ	pos_embedr½   rÿ   Únorm1r  ÚqkvÚnorm2r   r  Úmlp©rx   rJ   rK   ra   r{   s       €rD   rt   z SpatialTransformerBlock.__init__o  sˆ   ø€ ô
 ˜ uÔ-ˆÜ‰ÑÔä Ñ2¨!Ð2¨rÑ2ˆŒÜ—\‘\Ñ* rÑ*ˆŒ
Ü—9‘9Ñ4¨Ð4°Ñ4ˆŒô —\‘\Ñ* rÑ*ˆŒ
ÜÑ8¬"¯'©'Ð8°RÑ8ˆ�rf   rb   c                 ó   — |j                   \  }}}}|}|j                  d«      j                  dd«      }| j                  |«      }| j	                  |||f«      }| j                  |«      }|j                  d«      \  }	}
}|	|
j                  dd«      z  j                  d¬«      }||z  j                  d«      }|j                  dd«      j                  ||||«      }||z   }|}|j                  d«      j                  dd«      }| j                  | j                  |«      «      }|j                  dd«      j                  ||||«      }||z   }|S )Nr3   r   rL   r”   rM   )r`   Úflattenr•   r  r  r  ÚunbindÚsoftmaxÚ	unsqueezer6   r  r  )rx   rb   ÚBÚCÚHÚWr  Úx_tr  Úqrd   rc   r
  s                rD   r�   zSpatialTransformerBlock.forward  s>  € Ø—W‘W‰
ˆˆ1ˆa�ð ˆØ�i‰i˜‹l×$Ñ$ Q¨Ó*ˆØ�j‰j˜‹oˆØ�n‰n˜S 1 a &Ó)ˆð �h‰h�s‹mˆØ—*‘*˜R“.‰ˆˆ1ˆaØ�A—K‘K  BÓ'Ñ'×0Ñ0°RÐ0Ó8ˆØ�a‰x×"Ñ" 2Ó&ˆà�m‰m˜A˜qÓ!×)Ñ)¨!¨Q°°1Ó5ˆØ�s‰Nˆð ˆØ�i‰i˜‹l×$Ñ$ Q¨Ó*ˆØ�h‰h�t—z‘z #“Ó'ˆØ�m‰m˜A˜qÓ!×)Ñ)¨!¨Q°°1Ó5ˆØ�s‰Nˆàˆrf   ©NNrë   ©	r„   r…   r†   r‡   rt   rQ   rŠ   r�   r‹   rŒ   s   @rD   r  r  h  s:   ø„ ñð Øð9ð 
õ	9ð ˜Ÿ™ð ¨%¯,©,÷ rf   r  c                   ód   ‡ — e Zd ZdZ	 	 d	 dˆ fd„Zdej                  dej                  fd„Zˆ xZS )r	  zBSpatial attention module using channel statistics and transformer.r1   c                 óÊ   •— t        ||¬«      }t        ‰| �	  «        t        j                  d«      | _        t        j                  ddddœ|¤Ž| _        t        di |¤Ž| _	        y )NrI   )rø   rø   rø   r¶   r³   )r3   r   r™   )
rP   rs   rt   r½   ÚAdaptiveAvgPool2dÚavgpoolr¾   Úconvr  r
  r  s       €rD   rt   zSpatialAttention.__init__ž  sW   ø€ ô
 ˜ uÔ-ˆÜ‰ÑÔÜ×+Ñ+¨FÓ3ˆŒÜ—I‘IÐC°¸1ÑCÀÑCˆŒ	Ü+Ñ1¨bÑ1ˆ�	rf   rb   c                 óê   — |j                  dd¬«      }|j                  dd¬«      }t        j                  ||gd¬«      }| j	                  |«      }| j                  |«      }| j                  |«      }|S )Nr   T)rN   ÚkeepdimrM   )rµ   ÚamaxrQ   rV   r/  r0  r
  )rx   rb   Úx_avgÚx_maxs       rD   r�   zSpatialAttention.forward©  sf   € Ø—‘˜1 d�Ó+ˆØ—‘˜1 d�Ó+ˆÜ�I‰I�u˜e�n¨!Ô,ˆØ�L‰L˜‹OˆØ�I‰I�a‹LˆØ�I‰I�a‹LˆØˆrf   r*  rë   r+  rŒ   s   @rD   r	  r	  ›  s8   ø„ ÙLð Øð	2ð 
õ		2ð˜Ÿ™ð ¨%¯,©,÷ rf   r	  c                   óž   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 	 ddedededededed	ed
edee   ddfˆ fd„Zde	j                  de	j                  fd„Zˆ xZS )ÚTransformerBlockzQTransformer block with optional downsampling and convolutional position encoding.NÚinpÚoupÚ	num_headsÚattn_head_dimÚ
downsampleÚ	attn_dropÚ	proj_droprõ   rö   r1   c           
      ó"  •— t        |
|¬«      }t        ‰| �	  «        t        |dz  «      }|| _        | j                  rZt        j                  ddd«      | _        t        j                  ddd«      | _        t        j                  ||dddfddi|¤Ž| _
        nKt        j                  «       | _        t        j                  «       | _        t        j                  «       | _
        t        dd	|i|¤Ž| _        t        j                  |fi |¤Ž| _        t!        d||||||d
œ|¤Ž| _        |	rt%        |fd|	i|¤Žnt        j                  «       | _        |dkD  rt)        |«      nt        j                  «       | _        t        j                  |fi |¤Ž| _        t/        |||ft
        j0                  |dœ|¤Ž| _        |	rt%        |fd|	i|¤Žnt        j                  «       | _        |dkD  rt)        |«      | _        y t        j                  «       | _        y )NrI   rO   r¶   r3   r   r   rr   Fr  )rN   r:  r;  Údim_outr=  r>  rý   r)   )r  Údropr™   )rP   rs   rt   rˆ   r<  r½   Ú	MaxPool2dÚpool1Úpool2r¾   Úprojr  r  r  rÿ   r  r   r
  r   Úls1r
   Ú
drop_path1r  r   r  r  Úls2Ú
drop_path2)rx   r8  r9  r:  r;  r<  r=  r>  rõ   rö   rJ   rK   ra   Ú
hidden_dimr{   s                 €rD   rt   zTransformerBlock.__init__¶  s¸  ø€ ô ˜ uÔ-ˆÜ‰ÑÔÜ˜˜q™“\ˆ
Ø$ˆŒà�?Š?ÜŸ™ a¨¨AÓ.ˆDŒJÜŸ™ a¨¨AÓ.ˆDŒJÜŸ	™	 # s¨A¨q°!ÑF¸%ÐFÀ2ÑFˆD�IäŸ™›ˆDŒJÜŸ™›ˆDŒJÜŸ™›ˆDŒIä Ñ4¨#Ð4°Ñ4ˆŒÜ—\‘\ #Ñ,¨Ñ,ˆŒ
Üð 
ØØØ'ØØØñ
ð ñ
ˆŒ	ñ HU”:˜cÑC¨}ÐCÀÒCÔZ\×ZeÑZeÓZgˆŒØ1:¸R²œ( 9Ô-ÄRÇ[Á[Ã]ˆŒä—\‘\ #Ñ,¨Ñ,ˆŒ
Ü�s˜J¨ÐU´r·w±wÀYÑUÐRTÑUˆŒÙGT”:˜cÑC¨}ÐCÀÒCÔZ\×ZeÑZeÓZgˆŒØ1:¸R²œ( 9Ó-ˆ�ÄRÇ[Á[Ã]ˆ�rf   rb   c                 óx  — | j                   rá| j                  | j                  |«      «      }| j                  |«      }|j                  \  }}}}|j                  d«      j                  dd«      }| j                  |«      }| j                  |||f«      }| j                  | j                  |«      «      }|j                  dd«      j                  |d||«      }|| j                  |«      z   }n±|j                  \  }}}}|}|j                  d«      j                  dd«      }| j                  |«      }| j                  |||f«      }| j                  | j                  |«      «      }|j                  dd«      j                  |d||«      }|| j                  |«      z   }|j                  \  }}}}|}|j                  d«      j                  dd«      }| j                  | j                  | j                  |«      «      «      }|j                  dd«      j                  ||||«      }|| j!                  |«      z   }|S )Nr3   r   rL   )r<  rE  rC  rD  r`   r   r•   r  r  rF  r
  r6   rG  rH  r  r  rI  )rx   rb   r  r(  r$  r%  r&  r'  s           rD   r�   zTransformerBlock.forwardå  sç  € Ø�?Š?Ø—y‘y §¡¨A£Ó/ˆHØ—*‘*˜Q“-ˆCØŸ™‰JˆAˆq�!�QØ—+‘+˜a“.×*Ñ*¨1¨aÓ0ˆCØ—*‘*˜S“/ˆCØ—.‘.  q¨! fÓ-ˆCØ—(‘(˜4Ÿ9™9 S›>Ó*ˆCØ—-‘-  1Ó%×-Ñ-¨a°°Q¸Ó:ˆCØ˜4Ÿ?™?¨3Ó/Ñ/‰AàŸ™‰JˆAˆq�!�QØˆHØ—)‘)˜A“,×(Ñ(¨¨AÓ.ˆCØ—*‘*˜S“/ˆCØ—.‘.  q¨! fÓ-ˆCØ—(‘(˜4Ÿ9™9 S›>Ó*ˆCØ—-‘-  1Ó%×-Ñ-¨a°°Q¸Ó:ˆCØ˜4Ÿ?™?¨3Ó/Ñ/ˆAð —W‘W‰
ˆˆ1ˆa�ØˆØ�i‰i˜‹l×$Ñ$ Q¨Ó*ˆØ�h‰h�t—x‘x §
¡
¨3£Ó0Ó1ˆØ�m‰m˜A˜qÓ!×)Ñ)¨!¨Q°°1Ó5ˆØ�t—‘ sÓ+Ñ+ˆàˆrf   )	é   rê   Fr)   r)   r)   NNN)r„   r…   r†   r‡   rˆ   r‰   r  r   rt   rQ   rŠ   r�   r‹   rŒ   s   @rD   r7  r7  ³  sµ   ø„ Ù[ð Ø!#Ø$Ø!Ø!Ø!Ø-1ØØñ-Sàð-Sð ð-Sð ð	-Sð
 ð-Sð ð-Sð ð-Sð ð-Sð ð-Sð $ E™?ð-Sð 
õ-Sð^˜Ÿ™ð ¨%¯,©,÷ rf   r7  c                   óx   ‡ — e Zd ZdZ	 	 d	deddfˆ fd„Zdej                  deeef   dej                  fd„Z	ˆ xZ
S )
r  z Convolutional position encoding.Nr  r1   c           	      ó€   •— t        ||¬«      }t        ‰| �	  «        t        j                  ||fdddd|dœ|¤Ž| _        y )NrI   r¶   r   T)rF   Ústrider´   rr   rù   )rP   rs   rt   r½   r¾   rE  )rx   r  rJ   rK   ra   r{   s        €rD   rt   zPosConv.__init__  sD   ø€ ô ˜ uÔ-ˆÜ‰ÑÔÜ—I‘I˜h¨Ðw¸aÈÐSTÐ[_ÐhpÑwÐtvÑwˆ�	rf   rb   r  c                 óÞ   — |j                   \  }}}|\  }}|j                  dd«      j                  ||||«      }| j                  |«      |z   }|j	                  d«      j                  dd«      S )Nr   r3   )r`   r•   rU   rE  r   )	rx   rb   r  r$  ÚNr%  r&  r'  Úcnn_feats	            rD   r�   zPosConv.forward  si   € Ø—'‘'‰ˆˆ1ˆaØ‰ˆˆ1Ø—;‘;˜q !Ó$×)Ñ)¨!¨Q°°1Ó5ˆØ�I‰I�hÓ (Ñ*ˆØ�y‰y˜‹|×%Ñ% a¨Ó+Ð+rf   r*  )r„   r…   r†   r‡   rˆ   rt   rQ   rŠ   r   r�   r‹   rŒ   s   @rD   r  r    sR   ø„ Ù*ð
 Øñ	xàðxð
 
õxð,˜Ÿ™ð ,¨U°3¸°8©_ð ,ÀÇÁ÷ ,rf   r  c                   ó  ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 d%dededeedf   deedf   deedf   d	ed
edee   de	ddfˆ fd„Z
d&defd„Zd&dej                  deddfd„Zej                   j"                  dej                  fd„«       Zd'dedee	   ddfd„Zej                   j"                  d&deddfd„«       Zdej*                  dej*                  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dee   fd!„Zd*dej*                  d"edej*                  fd#„Zdej*                  dej*                  fd$„Zˆ xZS )+r   zÉCSATv2: Frequency-domain vision model with spatial attention.

    A hybrid architecture that processes images in the DCT frequency domain
    with ConvNeXt-style blocks and transformer attention.
    NÚnum_classesr  Údims.ÚdepthsÚtransformer_depthsÚdrop_path_rateÚtransformer_drop_pathrö   Úglobal_poolr1   c                 óò  •— t        |
|¬«      }t        ‰| �	  «        |dk7  rt        j                  d|› d�«       || _        || _        |	| _        d| _        |d   | _	        | j                  | _
        t        |d   dd	¬
«      g| _        d}t        |«      D ]9  \  }}|dkD  r|dz  }| j                  j                  t        ||d|› �¬
«      «       Œ; |rt        |«      nt        d„ t        ||«      D «       «      }t!        t#        j$                  d||«      j'                  «       «      }g }t        ||«      D ]V  \  }}|t)        ||z
  «      D �cg c]  }t+        |«      ‘Œ c}z  }|t)        |«      D �cg c]  }|rt+        |«      nd‘Œ c}z  }ŒX t-        dd|d   i|¤Ž| _        t!        |«      }g }t        t        |||«      «      D ]Ù  \  }\  }}}|dkD  r!t1        j2                  ||dz
     |fdddœ|¤Žgng t)        ||z
  «      D �cg c]  }t5        d|t+        |«      |dœ|¤Ž‘Œ c}z   t)        |«      D �cg c]  }t7        d||t+        |«      |dœ|¤Ž‘Œ c}z   |t9        |«      dz
  k  rt;        |fddi|¤Žgng z   }|j                  t1        j<                  |Ž «       ŒÛ t1        j<                  |Ž | _        tA        |d   |fd|	i|¤Ž| _!        | jE                  d¬«       y c c}w c c}w c c}w c c}w )NrI   r¶   z5CSATv2 is designed for 3-channel RGB input. in_chans=z* may not work correctly with the DCT stem.FrL   r   rL  Ústem_dct)Únum_chsÚ	reductionÚmoduler3   ústages.c              3   ó,   K  — | ]  \  }}||z
  –— Œ y ­wr}   r™   )rš   rC   Úts      rD   rœ   z"CSATv2.__init__.<locals>.<genexpr>H  s   è ø€ ÒDwÉtÈqÐRSÀQÈÅUÑDwùs   ‚r)   r–   r   )rF   rO  )rN   rõ   rö   )r8  r9  rõ   rö   rú   rû   Ú	pool_type©Úneeds_reset)rL  r™   )#rP   rs   rt   ÚwarningsÚwarnrT  r  rZ  Úgrad_checkpointingÚnum_featuresÚhead_hidden_sizeÚfeature_infoÚ	enumerater:   r¥   ÚzipÚiterrQ   Úlinspacer7   r8   Únextr¯   r\  r½   r¾   rô   r7  Úlenr   Ú
SequentialÚstagesr   ÚheadÚinit_weights)rx   rT  r  rU  rV  rW  rX  rY  rö   rZ  rJ   rK   Úkwargsra   r^  r@   rN   Útotal_blocksÚdp_iterÚdp_ratesÚdepthÚt_depthr=   rs  Úlayersr{   s                            €rD   rt   zCSATv2.__init__!  sD  ø€ ô ˜ uÔ-ˆÜ‰ÑÔØ�qŠ=Ü�M‰MðØ$˜:Ð%OðQôð 'ˆÔØ ˆŒØ&ˆÔØ"'ˆÔà  ™HˆÔØ $× 1Ñ 1ˆÔô "¨$¨q©'¸QÀzÔRÐSˆÔØˆ	Ü “oò 	c‰FˆAˆsØ�1ŠuØ˜Q‘�	Ø×Ñ×$Ñ$¤T°#ÀÐU\Ð]^Ð\_ÐS`Ô%aÕbð	cñ '<”s˜6”{ÄÑDwÔWZÐ[aÐcuÓWvÔDwÓAwˆÜ”u—~‘~ a¨¸ÓF×MÑMÓOÓPˆØˆÜ! &Ð*<Ó=ò 	a‰NˆE�7Ø´°e¸g±oÓ0FÖG¨1œ˜g�ÒGÑGˆHØÔQVÐW^ÓQ_Ö`ÈAÑ*?œ˜gœÀRÑGÒ`Ñ`‰Hð	aô 'Ñ@°$°q±'Ð@¸RÑ@ˆŒô �x“.ˆØˆÜ(1´#°d¸FÐDVÓ2WÓ(Xò 	2Ñ$ˆAÑ$��U˜Gð RSÐUVÒQV”"—)‘)˜D  Q¡™K¨ÐL¸!ÀAÑLÈÑLÑMÐ\^äejÐkpÐszÑkzÓe{Ö|Ð`a”Ð[˜3¬$¨w«-À}Ñ[ÐXZÓ[Ò|ñ}ô zð  @Gó  zHö  IÐtuÔ!Ðo c¨s¼dÀ7»mÐ[hÑoÐlnÓoò  Iñ	Ið 89¼3¸v»;È¹?Ò7J”+˜cÑ2 tÐ2¨rÑ2Ñ3ÐPRñTð ð �M‰Mœ"Ÿ-™-¨Ð0Õ1ð	2ô —m‘m VÐ,ˆŒä)¨$¨r©(°KÑ]È;Ð]ÐZ\Ñ]ˆŒ	ð 	×Ñ eÐÕ,ùò3 HùÚ`ùò }ùò Is   ÅK%Å3K*È	K/È9 K4re  c                 óP   — | j                  t        | j                  |¬«      «       y )Nrd  )Úapplyr   Ú_init_weights)rx   re  s     rD   ru  zCSATv2.init_weightsg  s   € Ø�
‰
”7˜4×-Ñ-¸;ÔGÕHrf   Úmc                 ó6  — t        |t        j                  t        j                  f«      rOt	        |j
                  d¬«       |j                  �+t        j                  j                  |j                  d«       y y |rt        |d«      r|j                  «        y y y )Ng{®Gáz”?)rß   r   rÃ   )Ú
isinstancer½   r¾   r  r	   Úweightrr   ÚinitÚ	constant_ÚhasattrrÃ   )rx   r€  re  s      rD   r  zCSATv2._init_weightsj  sn   € Ü�aœ"Ÿ)™)¤R§Y¡YÐ/Ô0Ü˜!Ÿ(™(¨Õ-Ø�v‰vÐ!Ü—‘×!Ñ! !§&¡&¨!Õ,ð "áœW QÐ(:Ô;Ø×ÑÕ ð <ˆ[rf   c                 ó.   — | j                   j                  S r}   )rt  ÚfcrÊ   s    rD   Úget_classifierzCSATv2.get_classifierr  s   € à�y‰y�|‰|Ðrf   c                 ó^   — || _         |�|| _        | j                  j                  ||¬«       y )N)rc  )rT  rZ  rt  Úreset)rx   rT  rZ  s      rD   Úreset_classifierzCSATv2.reset_classifierv  s,   € Ø&ˆÔØÐ"Ø*ˆDÔØ�	‰	�‰˜¨{ˆÕ;rf   Úenablec                 ó   — || _         y r}   )rh  )rx   r�  s     rD   Úset_grad_checkpointingzCSATv2.set_grad_checkpointing|  s
   € à"(ˆÕrf   rb   c                 óÎ   — | j                  |«      }| j                  r6t        j                  j	                  «       st        | j                  |«      }|S | j                  |«      }|S r}   )r\  rh  rQ   ÚjitÚis_scriptingr   rs  r€   s     rD   Úforward_featureszCSATv2.forward_features€  sS   € Ø�M‰M˜!ÓˆØ×"Ò"¬5¯9©9×+AÑ+AÔ+CÜ˜tŸ{™{¨AÓ.ˆAð ˆð —‘˜A“ˆAØˆrf   Úindicesr   Ú
stop_earlyÚ
output_fmtÚintermediates_onlyc                 ó   — |dk(  sJ d«       ‚g }t        t        | j                  «      dz   |«      \  }}	| j                  |«      }d|v r|j	                  |«       t
        j                  j                  «       s|s| j                  }
n|	dkD  r| j                  d|	 ng }
t        |
«      D ]]  \  }}| j                  r+t
        j                  j                  «       st        ||«      }n ||«      }|dz   |v sŒM|j	                  |«       Œ_ |r|S ||fS )aO  Forward pass returning intermediate features.

        Args:
            x: Input image tensor.
            indices: Indices of features to return (0=stem_dct, 1-4=stages). None returns all.
            norm: Apply norm layer to final intermediate (unused, for API compat).
            stop_early: Stop iterating when last desired intermediate is reached.
            output_fmt: Output format, must be 'NCHW'.
            intermediates_only: Only return intermediate features.

        Returns:
            List of intermediate features or tuple of (final features, intermediates).
        ÚNCHWzOutput format must be NCHW.r   r   N)r   rq  rs  r\  r:   rQ   r‘  r’  rl  rh  r   )rx   rb   r”  r   r•  r–  r—  ÚintermediatesÚtake_indicesÚ	max_indexrs  Úfeat_idxÚstages                rD   Úforward_intermediateszCSATv2.forward_intermediatesˆ  s
  € ð, ˜VÒ#ÐBÐ%BÓBÐ#Øˆä"6´s¸4¿;¹;Ó7GÈ!Ñ7KÈWÓ"UÑˆ�ià�M‰M˜!ÓˆØ�ÑØ× Ñ  Ô#ä�9‰9×!Ñ!Ô#©:Ø—[‘[‰Fð 1:¸A²�T—[‘[  )Ñ,À2ˆFä(¨Ó0ò 	(‰OˆH�eØ×&Ò&¬u¯y©y×/EÑ/EÔ/GÜ˜u aÓ(‘á˜!“H�Ø˜!‰|˜|Ò+Ø×$Ñ$ QÕ'ð	(ñ Ø Ð à�-ÐÐrf   Ú
prune_normÚ
prune_headc                 ó  — t        t        | j                  «      dz   |«      \  }}|dkD  r| j                  d| nt        j                  «       | _        |r#t        j
                  «       | j                  _        |r| j                  dd«       |S )a_  Prune layers not required for specified intermediates.

        Args:
            indices: Indices of intermediate layers to keep (0=stem_dct, 1-4=stages).
            prune_norm: Whether to prune the final norm layer.
            prune_head: Whether to prune the classifier head.

        Returns:
            List of indices that were kept.
        r   r   NÚ )	r   rq  rs  r½   rr  r  rt  r   rŒ  )rx   r”  r   r¡  r›  rœ  s         rD   Úprune_intermediate_layersz CSATv2.prune_intermediate_layersº  sp   € ô" #7´s¸4¿;¹;Ó7GÈ!Ñ7KÈWÓ"UÑˆ�ià1:¸Q²�d—k‘k * 9Ñ-ÄBÇMÁMÃOˆŒáÜŸ[™[›]ˆD�I‰IŒNÙØ×!Ñ! ! RÔ(àÐrf   Ú
pre_logitsc                 ó(   — | j                  ||¬«      S )N)r¥  )rt  )rx   rb   r¥  s      rD   Úforward_headzCSATv2.forward_headÖ  s   € Ø�y‰y˜ zˆyÓ2Ð2rf   c                 óF   — | j                  |«      }| j                  |«      S r}   )r“  r§  r€   s     rD   r�   zCSATv2.forwardÙ  s#   € Ø×!Ñ! !Ó$ˆØ× Ñ  Ó#Ð#rf   )éè  r¶   )rê   éH   é¨   i‚  )r3   r3   rL  é   )r   r   r3   r3   r)   FNÚavgNN)Tr}   )NFFr™  F)r   FT©F)r„   r…   r†   r‡   rˆ   r   r  r‰   r   Ústrrt   ru  r½   ÚModuler  rQ   r‘  Úignorer‰  rŒ  r�  rŠ   r“  r   r   rŸ  r¤  r§  r�   r‹   rŒ   s   @rD   r   r     s”  ø„ ñð  $ØØ$6Ø&2Ø2>Ø$'Ø*/Ø-1Ø$ØØñD-àðD-ð ðD-ð ˜˜S˜‘/ð	D-ð
 ˜#˜s˜(‘OðD-ð !& c¨3 h¡ðD-ð "ðD-ð $(ðD-ð $ E™?ðD-ð ðD-ð 
õD-ñLI¨ó Iñ!˜rŸy™yð !°tð !Àtó !ð ‡Y�Y×Ñð §	¡	ò ó ðñ<¨Cð <¸hÀs¹mð <ÐW[ó <ð ‡Y�Y×Ññ)¨Tð )¸Tò )ó ð)ð %§,¡,ð °5·<±<ó ð 8<ØØ$Ø$Ø',ñ0 à�|‰|ð0 ð ˜e C¨¨c© NÑ3Ñ4ð0 ð ð	0 ð
 ð0 ð ð0 ð !%ð0 ð 
ˆt�E—L‘LÑ! 5¨¯©°t¸E¿L¹LÑ7IÐ)IÑ#JÐJÑ	Kó0 ðh ./Ø$Ø#ñ	à˜3  S¡	˜>Ñ*ðð ðð ð	ð
 
ˆc‰óñ83˜eŸl™lð 3¸ð 3ÈÏÉó 3ð$˜Ÿ™ð $¨%¯,©,÷ $rf   c                 ó    — | ddddddddg d	œ
|¥S )
Nr©  )r¶   é   r³  )rL  rL  rÍ   rÎ   r  g      ð?zhead.fc)
ÚurlrT  Ú
input_sizeÚ	pool_sizerµ   rß   ÚinterpolationÚcrop_pctÚ
classifierÚ
first_convr™   )r´  rv  s     rD   Ú_cfgr»  Þ  s0   € àØ¨=ÀvØ%Ð.CØ#°Ø¨rñð ðð rf   ztimm/)Ú	hf_hub_id)r¶   é€  r½  Úbicubic)r¼  rµ  r·  )é
   r¿  )r¼  r¶  r·  )zcsatv2.r512_in1kzcsatv2_21m.sw_r640_in1kzcsatv2_21m.sw_r512_in1kÚ
state_dictÚmodelc                 ó’  ‡— d| v r| S ddl }ddddœŠ|j                  d«      }|j                  d«      }|j                  d	«      }|j                  d
«      }d|j                  dt        fˆfd„}i }| j	                  «       D �]Ã  \  }	}
|j                  d|	«      }	|	j                  dd«      j                  dd«      j                  dd«      }	|j                  ||	«      }	d|	v r$|	j                  dd«      |
j                  d«      }
}	n'd|	v r#|	j                  dd«      |
j                  d«      }
}	d|	v r|	j                  dd«      }	nDd|	v r|	j                  dd«      }	n-d|	v r|	j                  dd«      }	nd |	v r|	j                  d d!«      }	d"|	v r3|	j                  d#d$«      j                  d%d&«      j                  d"d&«      }	nd'|	v r|	j                  d'd(«      }	d)|	v r|	j                  d)d*«      }	nd+|	v r|	j                  d+d,«      }	d-|	v rd&|	vr|	j                  d-d.«      }	|j                  d/|	«      }	|j                  d0|	«      }	|
||	<   �ŒÆ |S )1zßRemap original CSATv2 checkpoint to timm format.

    Handles two key structural changes:
    1) Stage naming: stages1/2/3/4 -> stages.0/1/2/3
    2) Downsample position: moved from end of stage N to start of stage N+1
    zstages.0.0.grn.weightr   Nr¶   é	   )r   r3   r¶   z^dct\.z^stages([1-4])\.(\d+)\.(.*)$z^head\.z^norm\.r€  r1   c                 óò   •— t        | j                  d«      «      t        | j                  d«      «      | j                  d«      }}}|‰v r|‰|   k(  rd|› d|› �S |dk(  rd|› d|› �S d|dz
  › d|dz   › d|› �S )Nr   r3   r¶   r`  z.0.z	stages.0.rž   )rˆ   Úgroup)r€  rž  ÚidxÚrestÚdownsample_idxs       €rD   Úremap_stagez)checkpoint_filter_fn.<locals>.remap_stage  s’   ø€ Ü˜qŸw™w q›z›?¬C°·±¸³
«O¸Q¿W¹WÀQ»Z�DˆsˆØ�NÑ" s¨n¸UÑ.CÒ'CØ˜U˜G 3 t fÐ-Ð-Ø�AŠ:Ø˜s˜e 1 T FÐ+Ð+Ø˜ ™˜ 1 S¨1¡W I¨Q¨t¨fÐ5Ð5rf   z	stem_dct.z.Y_Conv.z.conv_y.z	.Cb_Conv.z	.conv_cb.z	.Cr_Conv.z	.conv_cr.z	grn.gammaz
grn.weightrL   zgrn.betazgrn.biasz
.ff.net.0.z	.mlp.fc1.z
.ff.net.3.z	.mlp.fc2.z	.ff_norm.z.norm2.z.attn_norm.z.norm1.z.attention.attention.z!.attention.attention.attn.to_qkv.z.attn.attn.qkv.z.attention.attention.attn.z.attn.attn.z.attention.z.attn.z.attn.to_qkv.z
.attn.qkv.z.attn.to_out.0.z.attn.proj.z.attn.pos_embed.z.pos_embed.zhead.fc.z
head.norm.)ÚreÚcompileÚMatchr¯  ÚitemsÚsubÚreplacer6   )rÀ  rÁ  rÊ  Údct_reÚstage_reÚhead_reÚnorm_rerÉ  Úoutrd   rc   rÈ  s              @rD   Úcheckpoint_filter_fnrÕ  ú  sk  ø€ ð  *Ñ,ØÐãð ˜q QÑ'€Nà�z‰z˜)Ó$€FØ�z‰zÐ9Ó:€HØ�z‰z˜*Ó%€GØ�z‰z˜*Ó%€Gð6�r—x‘xð 6¤Cõ 6ð €CØ× Ñ Ó"ó 0‰ˆˆ1à�J‰J�{ AÓ&ˆØ�Y‰Y�z JÓ/ß‘˜ [Ó1ß‘˜ [Ó1ð 	
ð
 �L‰L˜ aÓ(ˆð ˜!ÑØ—9‘9˜[¨,Ó7¸¿¹À2»ˆq‰AØ˜1‰_Ø—9‘9˜Z¨Ó4°a·i±iÀ³mˆqˆAð ˜1ÑØ—	‘	˜,¨Ó4‰AØ˜QÑØ—	‘	˜,¨Ó4‰AØ˜AÑØ—	‘	˜+ yÓ1‰AØ˜aÑØ—	‘	˜-¨Ó3ˆAð # aÑ'Ø—‘Ð>Ð@QÓRß‘GÐ8ÀÓOß‘GÐ3ÀÓOñ ð ˜aÑØ—	‘	˜-¨Ó2ˆAð ˜aÑØ—	‘	˜/¨<Ó8‰AØ !Ñ#Ø—	‘	Ð+¨]Ó;ˆAð  Ñ" }¸AÑ'=Ø—	‘	Ð,¨mÓ<ˆAð �K‰K˜
 AÓ&ˆØ�K‰K˜ aÓ(ˆàˆˆA‹ða0ðd €Jrf   ÚvariantÚ
pretrainedc                 ó~   — |j                  dd«      }t        t        | |ft        t	        |d¬«      t
        |    dœ|¤ŽS )NÚout_indices)r   r3   r¶   rO   T)rÙ  Úflatten_sequential)Úpretrained_filter_fnÚfeature_cfgÚdefault_cfg)Úpopr   r   rÕ  rP   Údefault_cfgs)rÖ  r×  rv  rÙ  s       rD   Ú_create_csatv2rà  L  sN   € Ø—*‘*˜]¨LÓ9€KÜÜØØðô 2Ü [ÀTÔJÜ  Ñ)ñð ñð rf   c                 ó   — t        d| fi |¤ŽS )Nr   )rà  )r×  rv  s     rD   r   r   Y  s   € ä˜( JÑ9°&Ñ9Ð9rf   c           	      óL   — t        ddd¬«      }t        d| fi t        |fi |¤Ž¤ŽS )N)é0   é`   éà   iÀ  )r¶   r¶   r¿  rL  )r   r   rO   r¶   )rU  rV  rW  Ú
csatv2_21m)rP   rà  )r×  rv  Ú
model_argss      rD   ræ  ræ  ^  s5   € ô Ø!ØØ)ô€Jô ˜,¨
ÑQ´d¸:Ñ6PÈÑ6PÑQÐQrf   r*  )r±   )r£  r®  )Er‡   r¢   rf  Ú	functoolsr   r   Útypingr   r   r   r   Únumpyr4   rQ   Útorch.nnr½   Útorch.nn.functionalÚ
functionalr~   Útimm.layersr	   r
   r   r   r   r   r   r   Útimm.layers.grnr   Útimm.models._builderr   Útimm.models._featuresr   Útimm.models._manipulater   r   Ú	_registryr   r   Ú__all__rÐ   rÑ   rˆ   rE   r‰   rŠ   re   rj   r°  rl   rŽ   r­   r¯   rí   rô   r  r	  r7  r  r   r»  rß  rP   rÕ  r¯  rà  r   ræ  r™   rf   rD   ú<module>rõ     sX  ðñó Û ß %ß /Ó /ã Û Ý ß Ð ç }× }Ó }Ý .Ý 5Ý 6ß >ß <à�XÐ
€ð€	ð6€ð8˜cð ¨ð °°c±ó ð( Øñ	Øðàðð
 ‡\�\óð: Øñ	YØðYàðYð
 ‡\�\óYô4ˆB�I‰Iô 4ô,UˆB�I‰Iô Uñ&˜Có ô"Q3�R—Y‘Yô Q3ôh #�—‘ô  #ôF',ˆB�I‰Iô ',ôT0˜bŸi™iô 0ôf�r—y‘yô ô0O�r—y‘yô Oôd,ˆb�i‰iô ,ô*A$ˆR�Y‰Yô A$óHñ %ÙØôñ  $ØØ Øô ñ
  $ØØØô ñ&ó €ð"O Tð O°"·)±)ð OÀó Oñd
˜Cð 
¨Tð 
Èó 
ð ñ:�tð :°&ò :ó ð:ð ñR˜4ð R°fò Ró ñRrf   