Ë
    éÓ^jT  ã                   óÄ  — d 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 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	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$ 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,d„Z) e e)d ¬!«       e)d ¬!«       e)d ¬!«       e)d ¬!«       e)d ¬!«       e)d ¬!«       e)d ¬!«       e)d ¬!«       e)d ¬!«       e)d ¬!«       e)d ¬!«       e)d ¬!«       e)d ¬!«      d"œ«      Z*d-d#„Z+ed-d$„«       Z,ed-d%„«       Z-ed-d&„«       Z.ed-d'„«       Z/ed-d(„«       Z0ed-d)„«       Z1ed-d*„«       Z2ed-d+„«       Z3y).aÄ   RepViT

Paper: `RepViT: Revisiting Mobile CNN From ViT Perspective`
    - https://arxiv.org/abs/2307.09283

@misc{wang2023repvit,
      title={RepViT: Revisiting Mobile CNN From ViT Perspective},
      author={Ao Wang and Hui Chen and Zijia Lin and Hengjun Pu and Guiguang Ding},
      year={2023},
      eprint={2307.09283},
      archivePrefix={arXiv},
      primaryClass={cs.CV}
}

Adapted from official impl at https://github.com/jameslahm/RepViT
é    )ÚListÚOptionalÚTupleÚUnionÚTypeN©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)ÚSqueezeExciteÚtrunc_normal_Ú	to_ntupleÚ	to_2tupleé   )Úbuild_model_with_cfg)Úfeature_take_indices)Ú
checkpointÚcheckpoint_seq)Úregister_modelÚgenerate_default_cfgsÚRepVitc                   ó€   ‡ — e Zd Z	 	 	 	 	 	 	 	 ddedededededededefˆ fd	„Z ej                  «       d
„ «       Zˆ xZ	S )ÚConvNormÚin_dimÚout_dimÚksÚstrideÚpadÚdilationÚgroupsÚbn_weight_initc                 ó¤  •— |	|
dœ}t         ‰| �  «        | j                  dt        j                  |||||||fddi|¤Ž«       | j                  dt        j
                  |fi |¤Ž«       t        j                  j                  | j                  j                  |«       t        j                  j                  | j                  j                  d«       y )N©ÚdeviceÚdtypeÚcÚbiasFÚbnr   )ÚsuperÚ__init__Ú
add_moduleÚnnÚConv2dÚBatchNorm2dÚinitÚ	constant_r'   Úweightr&   )Úselfr   r   r   r   r   r   r   r    r#   r$   ÚddÚ	__class__s               €ú]/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/repvit.pyr)   zConvNorm.__init__!   sž   ø€ ð ¨Ñ/ˆÜ‰ÑÔØ�‰˜œRŸY™Y v¨w¸¸FÀCÈÐSYÑlÐ`eÐlÐikÑlÔmØ�‰˜œbŸn™n¨WÑ;¸Ñ;Ô<Ü
�‰×Ñ˜$Ÿ'™'Ÿ.™.¨.Ô9Ü
�‰×Ñ˜$Ÿ'™'Ÿ,™,¨Õ*ó    c           
      ób  — | j                   j                  «       \  }}|j                  |j                  |j                  z   dz  z  }|j                  |d d …d d d f   z  }|j
                  |j                  |j                  z  |j                  |j                  z   dz  z  z
  }t        j                  |j                  d«      | j                  j                  z  |j                  d«      |j                  dd  | j                  j                  | j                  j                  | j                  j                  | j                  j                  |j                  j                   ¬«      }|j                  j"                  j%                  |«       |j
                  j"                  j%                  |«       |S )Nç      à?r   r   é   )r   Úpaddingr   r   r#   )Ú_modulesÚvaluesr0   Úrunning_varÚepsr&   Úrunning_meanr+   r,   Úsizer%   r   Úshaper   r9   r   r#   ÚdataÚcopy_)r1   r%   r'   ÚwÚbÚms         r4   ÚfusezConvNorm.fuse5   s/  € à—‘×$Ñ$Ó&‰ˆˆ2Ø�I‰I˜Ÿ™¨"¯&©&Ñ0°SÑ8Ñ8ˆØ�H‰H�qš˜D $¨Ð,Ñ-Ñ-ˆØ�G‰G�b—o‘o¨¯	©	Ñ1°R·^±^ÀbÇfÁfÑ5LÐQTÑ4TÑTÑTˆÜ�I‰IØ�F‰F�1‹I˜Ÿ™Ÿ™Ñ%Ø�F‰F�1‹IØ�G‰G�A�BˆKØ—6‘6—=‘=Ø—F‘F—N‘NØ—V‘V—_‘_Ø—6‘6—=‘=Ø—8‘8—?‘?ô	
ˆð 	
�‰�‰×Ñ˜AÔØ	�‰�‰×Ñ˜!ÔØˆr5   )r   r   r   r   r   r   NN)
Ú__name__Ú
__module__Ú__qualname__ÚintÚfloatr)   ÚtorchÚno_gradrF   Ú__classcell__©r3   s   @r4   r   r       sŒ   ø„ ð
 ØØØØØ$%ØØñ+àð+ð ð+ð ð	+ð
 ð+ð ð+ð ð+ð ð+ð "õ+ð( €U‡]�]ƒ_ñó ôr5   r   c            	       óh   ‡ — e Zd Z	 	 	 	 ddedededefˆ fd„Z ej                  «       d„ «       Z	ˆ xZ
S )Ú
NormLinearr   r   r&   Ústdc                 óz  •— ||dœ}t         ‰| �  «        | j                  dt        j                  |fi |¤Ž«       | j                  dt        j
                  ||fd|i|¤Ž«       t        | j                  j                  |¬«       |r5t        j                  j                  | j                  j                  d«       y y )Nr"   r'   Úlr&   )rR   r   )r(   r)   r*   r+   ÚBatchNorm1dÚLinearr   rT   r0   r.   r/   r&   )	r1   r   r   r&   rR   r#   r$   r2   r3   s	           €r4   r)   zNormLinear.__init__K   s�   ø€ ð ¨Ñ/ˆÜ‰ÑÔØ�‰˜œbŸn™n¨VÑ:°rÑ:Ô;Ø�‰˜œRŸY™Y v¨wÑH¸TÐHÀRÑHÔIÜ�d—f‘f—m‘m¨Õ-ÙÜ�G‰G×Ñ˜dŸf™fŸk™k¨1Õ-ð r5   c                 ól  — | j                   j                  «       \  }}|j                  |j                  |j                  z   dz  z  }|j
                  | j                  j                  | j                  j                  z  |j                  |j                  z   dz  z  z
  }|j                  |d d d …f   z  }|j
                  €$|| j                  j                  j                  z  }n<|j                  |d d …d f   z  j                  d«      | j                  j
                  z   }t        j                  |j                  d«      |j                  d«      |j                  j                  ¬«      }|j                  j                  j!                  |«       |j
                  j                  j!                  |«       |S )Nr7   éÿÿÿÿr   r   ©r#   )r:   r;   r0   r<   r=   r&   r'   r>   rT   ÚTÚviewr+   rV   r?   r#   rA   rB   )r1   r'   rT   rC   rD   rE   s         r4   rF   zNormLinear.fuse\   s6  € à—‘×$Ñ$Ó&‰ˆˆAØ�I‰I˜Ÿ™¨"¯&©&Ñ0°SÑ8Ñ8ˆØ�G‰G�d—g‘g×*Ñ*¨T¯W©W¯^©^Ñ;¸r¿~¹~ÐPR×PVÑPVÑ?VÐ[^Ñ>^Ñ^Ñ^ˆØ�H‰H�q˜šq˜‘zÑ!ˆØ�6‰6ˆ>Ø�D—F‘F—M‘M—O‘OÑ#‰Aà—‘˜Aša ˜g™JÑ&×,Ñ,¨RÓ0°4·6±6·;±;Ñ>ˆAÜ�I‰I�a—f‘f˜Q“i §¡¨£°1·8±8·?±?ÔCˆØ	�‰�‰×Ñ˜AÔØ	�‰�‰×Ñ˜!ÔØˆr5   )Tg{®Gáz”?NN)rG   rH   rI   rJ   ÚboolrK   r)   rL   rM   rF   rN   rO   s   @r4   rQ   rQ   J   sX   ø„ ð
 ØØØñ.àð.ð ð.ð ð	.ð
 õ.ð" €U‡]�]ƒ_ñó ôr5   rQ   c                   óh   ‡ — e Zd Z	 	 	 ddededefˆ fd„Zd„ Z ej                  «       d„ «       Z	ˆ xZ
S )ÚRepVggDwÚedÚkernel_sizeÚlegacyc                 ó`  •— ||dœ}t         ‰| �  «        t        |||d|dz
  dz  fd|i|¤Ž| _        |r1t        ||dddfd|i|¤Ž| _        t        j                  «       | _        n<t        j                  ||dddfd|i|¤Ž| _        t        j                  |fi |¤Ž| _        || _
        || _        y )Nr"   r   r8   r   r   )r(   r)   r   ÚconvÚconv1r+   ÚIdentityr'   r,   r-   Údimra   )r1   r_   r`   ra   r#   r$   r2   r3   s          €r4   r)   zRepVggDw.__init__m   s¶   ø€ ð ¨Ñ/ˆÜ‰ÑÔÜ˜R  [°!°kÀA±oÈ!Ñ5KÑ]ÐTVÐ]ÐZ\Ñ]ˆŒ	ÙÜ! " b¨!¨Q°ÑC¸"ÐCÀÑCˆDŒJä—k‘k“mˆD�GäŸ™ 2 r¨1¨a°ÑD¸2ÐDÀÑDˆDŒJÜ—n‘n RÑ.¨2Ñ.ˆDŒGØˆŒØˆ�r5   c                 ól   — | j                  | j                  |«      | j                  |«      z   |z   «      S ©N)r'   rc   rd   ©r1   Úxs     r4   ÚforwardzRepVggDw.forward‚   s+   € Ø�w‰w�t—y‘y “| d§j¡j°£mÑ3°aÑ7Ó8Ð8r5   c           	      ó”  — | j                   j                  «       }| j                  r| j                  j                  «       }n| j                  }|j                  }|j
                  }|j                  }|j
                  }t        j                  j                  |g d¢«      }t        j                  j                  t        j                  |j                  d   |j                  d   dd|j                  ¬«      g d¢«      }||z   |z   }||z   }	|j                  j                  j                  |«       |j
                  j                  j                  |	«       | j                  sç| j                  }
|
j                  |
j                   |
j"                  z   dz  z  }|j                  |d d …d d d f   z  }|
j
                  |j
                  |
j$                  z
  |
j                  z  |
j                   |
j"                  z   dz  z  z   }|j                  j                  j                  |«       |j
                  j                  j                  |«       |S )N)r   r   r   r   r   r   rY   r7   )rc   rF   ra   rd   r0   r&   r+   Ú
functionalr   rL   Úonesr@   r#   rA   rB   r'   r<   r=   r>   )r1   rc   rd   Úconv_wÚconv_bÚconv1_wÚconv1_bÚidentityÚfinal_conv_wÚfinal_conv_br'   rC   rD   s                r4   rF   zRepVggDw.fuse…   s´  € à�y‰y�~‰~Óˆà�;Š;Ø—J‘J—O‘OÓ%‰Eà—J‘JˆEà—‘ˆØ—‘ˆØ—,‘,ˆØ—*‘*ˆä—-‘-×#Ñ# Gª\Ó:ˆä—=‘=×$Ñ$Ü�J‰J�w—}‘} QÑ'¨¯©°qÑ)9¸1¸aÈÏÉÔWÒYeó
ˆð  Ñ'¨(Ñ2ˆØ Ñ'ˆà�‰×Ñ×Ñ˜|Ô,Ø�	‰	�‰×Ñ˜\Ô*à�{Š{Ø—‘ˆBØ—	‘	˜RŸ^™^¨b¯f©fÑ4¸Ñ<Ñ<ˆAØ—‘˜a¢ 4¨¨tÐ 3Ñ4Ñ4ˆAØ—‘˜4Ÿ9™9 r§¡Ñ6¸"¿)¹)ÑCÀrÇ~Á~ÐXZ×X^ÑX^ÑG^ÐcfÑFfÑfÑfˆAØ�K‰K×Ñ×"Ñ" 1Ô%Ø�I‰I�N‰N× Ñ  Ô#Øˆr5   ©FNN)rG   rH   rI   rJ   r\   r)   rk   rL   rM   rF   rN   rO   s   @r4   r^   r^   l   sP   ø„ ð
 !ØØñàðð ðð õ	ò*9ð €U‡]�]ƒ_ñ ó ô r5   r^   c                   óR   ‡ — e Zd Z	 	 ddededeej                     fˆ fd„Zd„ Zˆ xZ	S )Ú	RepVitMlpr   Ú
hidden_dimÚ	act_layerc                 óœ   •— ||dœ}t         ‰| �  «        t        ||dddfi |¤Ž| _         |«       | _        t        ||dddfddi|¤Ž| _        y )Nr"   r   r   r    )r(   r)   r   rd   ÚactÚconv2)r1   r   ry   rz   r#   r$   r2   r3   s          €r4   r)   zRepVitMlp.__init__ª   sZ   ø€ ð ¨Ñ/ˆÜ‰ÑÔÜ˜f j°!°Q¸Ñ@¸RÑ@ˆŒ
Ù“;ˆŒÜ˜j¨&°!°Q¸ÑRÈ!ÐRÈrÑRˆ�
r5   c                 ó`   — | j                  | j                  | j                  |«      «      «      S rh   )r}   r|   rd   ri   s     r4   rk   zRepVitMlp.forward¸   s"   € Ø�z‰z˜$Ÿ(™( 4§:¡:¨a£=Ó1Ó2Ð2r5   ©NN©
rG   rH   rI   rJ   r   r+   ÚModuler)   rk   rN   rO   s   @r4   rx   rx   ©   s=   ø„ ð ØñSàðSð ðSð ˜BŸI™I‘õ	Sö3r5   rx   c                   ó`   ‡ — e Zd Z	 	 	 d	dededededeej                     defˆ fd„Z	d„ Z
ˆ xZS )
ÚRepViTBlockr   Ú	mlp_ratior`   Úuse_serz   ra   c	                 óÎ   •— ||dœ}	t         ‰
| �  «        t        |||fi |	¤Ž| _        |rt	        |dfi |	¤Žnt        j                  «       | _        t        |||z  |fi |	¤Ž| _	        y )Nr"   g      Ð?)
r(   r)   r^   Útoken_mixerr   r+   re   Úserx   Úchannel_mixer)r1   r   r„   r`   r…   rz   ra   r#   r$   r2   r3   s             €r4   r)   zRepViTBlock.__init__½   si   ø€ ð ¨Ñ/ˆÜ‰ÑÔÜ# F¨K¸ÑFÀ2ÑFˆÔÙ7=”- ¨Ñ3°Ò3Ä2Ç;Á;Ã=ˆŒÜ& v¨v¸	Ñ/AÀ9ÑSÐPRÑSˆÕr5   c                 óv   — | j                  |«      }| j                  |«      }|}| j                  |«      }||z   S rh   )r‡   rˆ   r‰   ©r1   rj   rs   s      r4   rk   zRepViTBlock.forwardÎ   s>   € Ø×Ñ˜QÓˆØ�G‰G�A‹JˆØˆØ×Ñ˜qÓ!ˆØ˜!‰|Ðr5   rv   )rG   rH   rI   rJ   rK   r\   r   r+   r�   r)   rk   rN   rO   s   @r4   rƒ   rƒ   ¼   sa   ø„ ð !ØØñTàðTð ðTð ð	Tð
 ðTð ˜BŸI™I‘ðTð õTö"r5   rƒ   c                   óR   ‡ — e Zd Z	 	 ddededeej                     fˆ fd„Zd„ Zˆ xZ	S )Ú
RepVitStemÚin_chsÚout_chsrz   c                 ó²   •— ||dœ}t         ‰| �  «        t        ||dz  dddfi |¤Ž| _         |«       | _        t        |dz  |dddfi |¤Ž| _        d| _        y )Nr"   r8   é   r   é   )r(   r)   r   rd   Úact1r}   r   )r1   rŽ   r�   rz   r#   r$   r2   r3   s          €r4   r)   zRepVitStem.__init__×   sd   ø€ ð ¨Ñ/ˆÜ‰ÑÔÜ˜f g°¡l°A°q¸!ÑB¸rÑBˆŒ
Ù“KˆŒ	Ü˜g¨™l¨G°Q¸¸1ÑCÀÑCˆŒ
Øˆ�r5   c                 ó`   — | j                  | j                  | j                  |«      «      «      S rh   )r}   r“   rd   ri   s     r4   rk   zRepVitStem.forwardæ   s"   € Ø�z‰z˜$Ÿ)™) D§J¡J¨q£MÓ2Ó3Ð3r5   r   r€   rO   s   @r4   r�   r�   Ö   s9   ø„ ð Øñàðð ðð ˜BŸI™I‘õ	ö4r5   r�   c                   ó`   ‡ — e Zd Z	 	 	 d	dededededeej                     defˆ fd„Z	d„ Z
ˆ xZS )
ÚRepVitDownsampler   r„   r   r`   rz   ra   c	                 óè   •— ||dœ}	t         ‰
| �  «        t        |||fd||dœ|	¤Ž| _        t	        |||fd|dz
  dz  |dœ|	¤Ž| _        t	        ||ddfi |	¤Ž| _        t        |||z  |fi |	¤Ž| _        y )Nr"   F)r…   rz   ra   r8   r   )r   r   r   )	r(   r)   rƒ   Ú	pre_blockr   Úspatial_downsampleÚchannel_downsamplerx   Úffn)r1   r   r„   r   r`   rz   ra   r#   r$   r2   r3   s             €r4   r)   zRepVitDownsample.__init__ë   s¸   ø€ ð ¨Ñ/ˆÜ‰ÑÔÜ$ØØØð
ð ØØñ
ð ñ
ˆŒô #+ØØØð#
ð Ø˜q‘ QÑ&Øñ#
ð ñ#
ˆÔô #+¨6°7¸A¸qÑ"GÀBÑ"GˆÔÜ˜W g°	Ñ&9¸9ÑKÈÑKˆ�r5   c                 ó˜   — | j                  |«      }| j                  |«      }| j                  |«      }|}| j                  |«      }||z   S rh   )r˜   r™   rš   r›   r‹   s      r4   rk   zRepVitDownsample.forward  sL   € Ø�N‰N˜1ÓˆØ×#Ñ# AÓ&ˆØ×#Ñ# AÓ&ˆØˆØ�H‰H�Q‹KˆØ�8‰|Ðr5   rv   ©rG   rH   rI   rJ   rK   r   r+   r�   r\   r)   rk   rN   rO   s   @r4   r–   r–   ê   sb   ø„ ð !ØØñ Làð Lð ð Lð ð	 Lð
 ð Lð ˜BŸI™I‘ð Lð õ LöDr5   r–   c            	       ón   ‡ — e Zd Z	 	 	 	 ddedededefˆ fd„Zd„ Z ej                  «       d„ «       Z
ˆ xZS )	ÚRepVitClassifierrf   Únum_classesÚdistillationÚdropc                 ó<  •— ||dœ}t         ‰| �  «        t        j                  |«      | _        |dkD  rt        ||fi |¤Žnt        j                  «       | _        || _        d| _	        || _
        |r,|dkD  rt        ||fi |¤Žnt        j                  «       | _        y y )Nr"   r   F)r(   r)   r+   ÚDropoutÚ	head_droprQ   re   Úheadr¡   Údistilled_trainingr    Ú	head_dist)	r1   rf   r    r¡   r¢   r#   r$   r2   r3   s	           €r4   r)   zRepVitClassifier.__init__  s‘   ø€ ð ¨Ñ/ˆÜ‰ÑÔÜŸ™ DÓ)ˆŒØ:EÈº/”J˜s KÑ6°2Ò6ÌrÏ{É{Ë}ˆŒ	Ø(ˆÔØ"'ˆÔØ&ˆÔÙØCNÐQRÂ?œZ¨¨[Ñ?¸BÒ?ÔXZ×XcÑXcÓXeˆD�Nð r5   c                 ó*  — | j                  |«      }| j                  rd| j                  |«      | j                  |«      }}| j                  r.| j
                  r"t        j                  j                  «       s||fS ||z   dz  S | j                  |«      }|S )Nr8   )	r¥   r¡   r¦   r¨   Útrainingr§   rL   ÚjitÚis_scripting)r1   rj   Úx1Úx2s       r4   rk   zRepVitClassifier.forward*  sz   € Ø�N‰N˜1ÓˆØ×ÒØ—Y‘Y˜q“\ 4§>¡>°!Ó#4�ˆBØ�}Š} ×!8Ò!8ÄÇÁ×AWÑAWÔAYØ˜2�v�à˜R™ 1‘}Ð$à—	‘	˜!“ˆAØˆHr5   c                 ó   — | j                   dkD  st        j                  «       S | j                  j	                  «       }| j
                  r„| j                  j	                  «       }|xj                  |j                  z  c_        |xj                  |j                  z  c_        |xj                  dz  c_        |xj                  dz  c_        |S |S )Nr   r8   )	r    r+   re   r¦   rF   r¡   r¨   r0   r&   )r1   r¦   r¨   s      r4   rF   zRepVitClassifier.fuse6  s’   € à×Ñ !Ò#Ü—;‘;“=Ð Ø�y‰y�~‰~ÓˆØ×ÒØŸ™×+Ñ+Ó-ˆIØ�KŠK˜9×+Ñ+Ñ+�KØ�IŠI˜Ÿ™Ñ'�IØ�KŠK˜1Ñ�KØ�IŠI˜‰N�IØˆKàˆKr5   )Fç        NN)rG   rH   rI   rJ   r\   rK   r)   rk   rL   rM   rF   rN   rO   s   @r4   rŸ   rŸ     sb   ø„ ð
 "'ØØØñfàðfð ðfð ð	fð
 õfò&
ð €U‡]�]ƒ_ñó ôr5   rŸ   c                   ól   ‡ — e Zd Z	 	 	 	 	 ddededededeej                     dededefˆ fd	„Z	d
„ Z
ˆ xZS )ÚRepVitStager   r   Údepthr„   rz   r`   Ú
downsamplera   c                 ó<  •— |	|
dœ}t         ‰| �  «        |rt        ||||f||dœ|¤Ž| _        n ||k(  sJ ‚t	        j
                  «       | _        g }d}t        |«      D ]%  }|j                  t        ||||||fi |¤Ž«       | }Œ' t	        j                  |Ž | _
        y )Nr"   )rz   ra   T)r(   r)   r–   r´   r+   re   ÚrangeÚappendrƒ   Ú
SequentialÚblocks)r1   r   r   r³   r„   rz   r`   r´   ra   r#   r$   r2   r¹   r…   Ú_r3   s                  €r4   r)   zRepVitStage.__init__G  sÁ   ø€ ð ¨Ñ/ˆÜ‰ÑÔÙÜ.ØØØØð	ð
 $Øñð ñˆD�Oð ˜WÒ$Ð$Ð$Ü Ÿk™k›mˆDŒOàˆØˆÜ�u“ò 	 ˆAØ�M‰Mœ+ g¨y¸+ÀvÈyÐZ`ÑgÐdfÑgÔhØ�Z‰Fð	 ô —m‘m VÐ,ˆ�r5   c                 óJ   — | j                  |«      }| j                  |«      }|S rh   )r´   r¹   ri   s     r4   rk   zRepVitStage.forwardl  s"   € Ø�O‰O˜AÓˆØ�K‰K˜‹NˆØˆr5   )r‘   TFNNr�   rO   s   @r4   r²   r²   F  su   ø„ ð  !Ø#Ø ØØñ#-àð#-ð ð#-ð ð	#-ð
 ð#-ð ˜BŸI™I‘ð#-ð ð#-ð ð#-ð õ#-öJr5   r²   c                   óö  ‡ — e Zd Zddddddddej                  dd	d
ddfdededeedf   deedf   dedededede	ej                     dededefˆ fd„Zej                  j                  d/d„«       Zej                  j                  d0d„«       Zej                  j                  dej                  fd„«       Zd1dedee   defd„Zej                  j                  d0d„«       Z	 	 	 	 	 d2d 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	 	 	 d3d!eeee   f   d'ed(efd)„Zd*„ Zd/d+efd,„Zd-„ Z ej<                  «       d.„ «       Zˆ xZ S )4r   r‘   éà   )é0   )r8   r8   Úavgéè  Tr°   FNÚin_chansÚimg_sizeÚ	embed_dim.r³   r„   Úglobal_poolr`   r    rz   r¡   Ú	drop_ratera   c                 ó–  •— t         ‰| �  «        ||dœ}d| _        || _        || _        || _        || _        |d   }t        |||	fi |¤Ž| _        | j                  j                  }t        t        t        |«      t        |«      «      D ��cg c]
  \  }}||z  ‘Œ c}}«      }t        |«      } t        |«      |«      }g | _        g }t!        |«      D ]‘  }|dk7  rdnd}|j#                  t%        |||   ||   f||   |	|||dœ|¤Ž«       |rdnd}||z  }t        |D �cg c]  }|dz
  |z  dz   ‘Œ c}«      }| xj                  t'        ||   |d|› �¬	«      gz  c_        ||   }Œ“ t)        j*                  |Ž | _        |d
   x| _        | _        t)        j2                  |«      | _        t7        |d
   ||
fi |¤Ž| _        y c c}}w c c}w )Nr"   Fr   T)r„   rz   r`   r´   ra   r8   r   zstages.)Únum_chsÚ	reductionÚmodulerX   )r(   r)   Úgrad_checkpointingrÄ   rÃ   r    rÁ   r�   Ústemr   ÚtupleÚzipr   Úlenr   Úfeature_infor¶   r·   r²   Údictr+   r¸   ÚstagesÚnum_featuresÚhead_hidden_sizer¤   r¥   rŸ   r¦   )r1   rÁ   rÂ   rÃ   r³   r„   rÄ   r`   r    rz   r¡   rÅ   ra   r#   r$   r2   r   r   ÚiÚpÚ
resolutionÚ
num_stagesÚ
mlp_ratiosrÑ   r´   Ústage_strideÚrr3   s                              €r4   r)   zRepVit.__init__s  sõ  ø€ ô" 	‰ÑÔØ¨Ñ/ˆØ"'ˆÔØ&ˆÔØ"ˆŒØ&ˆÔØ ˆŒà˜1‘ˆÜ˜x¨°ÑA¸bÑAˆŒ	Ø—‘×!Ñ!ˆÜ¬s´9¸XÓ3FÌ	ÐRXÓHYÓ/Z×[¡t q¨!˜A ›FÓ[Ó\ˆ
ä˜“^ˆ
Ø*”Y˜zÓ*¨9Ó5ˆ
àˆÔØˆÜ�zÓ"ò 	"ˆAØ!" a¢™¨UˆJØ�M‰MÜØØ˜a‘LØ˜!‘Hð
ð )¨™mØ'Ø +Ø)Ø!ñ
ð ñ
ôñ !+™1°ˆLØ�lÑ"ˆFÜÀZÖPÀ  Q¡¨<Ñ 7¸!Ó ;ÒPÓQˆJØ×Ò¤$¨y¸©|ÀvÐX_Ð`aÐ_bÐVcÔ"dÐ!eÑeÕØ˜q‘\‰Fð'	"ô( —m‘m VÐ,ˆŒà4=¸b±MÐAˆÔ˜DÔ1ÜŸ™ IÓ.ˆŒÜ$ Y¨r¡]°KÀÑTÐQSÑTˆ�	ùó? \ùò0  Qs   ÂG 
ÄG
c                 ó$   — t        dddg¬«      }|S )Nz^stem)z^blocks\.(\d+)N)z^norm)iŸ† )rË   r¹   )rÐ   )r1   ÚcoarseÚmatchers      r4   Úgroup_matcherzRepVit.group_matcher°  s   € ä˜HÐ.GÐI]Ð-^Ô_ˆØˆr5   c                 ó   — || _         y rh   )rÊ   ©r1   Úenables     r4   Úset_grad_checkpointingzRepVit.set_grad_checkpointingµ  s
   € à"(ˆÕr5   Úreturnc                 ó   — | j                   S rh   )r¦   )r1   s    r4   Úget_classifierzRepVit.get_classifier¹  s   € à�y‰yÐr5   c                 ón   — || _         |�|| _        ||dœ}t        | j                  d   ||fi |¤Ž| _        y )Nr"   rX   )r    rÄ   rŸ   rÃ   r¦   )r1   r    rÄ   r¡   r#   r$   r2   s          r4   Úreset_classifierzRepVit.reset_classifier½  sA   € Ø&ˆÔØÐ"Ø*ˆDÔØ¨Ñ/ˆÜ$ T§^¡^°BÑ%7¸ÀlÑYÐVXÑYˆ�	r5   c                 ó&   — || j                   _        y rh   )r¦   r§   rà   s     r4   Úset_distilled_trainingzRepVit.set_distilled_trainingÄ  s   € à'-ˆ�	‰	Õ$r5   rj   ÚindicesÚnormÚ
stop_earlyÚ
output_fmtÚintermediates_onlyc                 óà  — |dv sJ d«       ‚g }t        t        | j                  «      |«      \  }}	| j                  |«      }t        j
                  j                  «       s|s| j                  }
n| j                  d|	dz    }
t        |
«      D ]Z  \  }}| j                  r+t        j
                  j                  «       st        ||«      }n ||«      }||v sŒJ|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Ë   rL   r«   r¬   Ú	enumeraterÊ   r   r·   )r1   rj   rê   rë   rì   rí   rî   ÚintermediatesÚtake_indicesÚ	max_indexrÑ   Úfeat_idxÚstages                r4   Úforward_intermediateszRepVit.forward_intermediatesÈ  sæ   € ð* ˜YÑ&ÐDÐ(DÓDÐ&ØˆÜ"6´s¸4¿;¹;Ó7GÈÓ"QÑˆ�ið �I‰I�a‹LˆÜ�9‰9×!Ñ!Ô#©:Ø—[‘[‰Fà—[‘[  )¨a¡-Ð0ˆFä(¨Ó0ò 	(‰OˆH�eØ×&Ò&¬u¯y©y×/EÑ/EÔ/GÜ˜u aÓ(‘á˜!“H�Ø˜<Ò'Ø×$Ñ$ QÕ'ð	(ñ Ø Ð à�-ÐÐr5   Ú
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Ñ   rç   )r1   rê   rø   rù   ró   rô   s         r4   Úprune_intermediate_layersz RepVit.prune_intermediate_layersõ  sM   € ô #7´s¸4¿;¹;Ó7GÈÓ"QÑˆ�iØ—k‘k . 9¨q¡=Ð1ˆŒÙØ×!Ñ! ! RÔ(ØÐr5   c                 óÎ   — | j                  |«      }| j                  r6t        j                  j	                  «       st        | j                  |«      }|S | j                  |«      }|S rh   )rË   rÊ   rL   r«   r¬   r   rÑ   ri   s     r4   Úforward_featureszRepVit.forward_features  sR   € Ø�I‰I�a‹LˆØ×"Ò"¬5¯9©9×+AÑ+AÔ+CÜ˜tŸ{™{¨AÓ.ˆAð ˆð —‘˜A“ˆAØˆr5   Ú
pre_logitsc                 ó’   — | j                   dk(  r|j                  dd¬«      }| j                  |«      }|r|S | j                  |«      S )Nr¿   )r8   r‘   F)Úkeepdim)rÄ   Úmeanr¥   r¦   )r1   rj   rÿ   s      r4   Úforward_headzRepVit.forward_head  sF   € Ø×Ñ˜uÒ$Ø—‘�v u�Ó-ˆAØ�N‰N˜1ÓˆÙØˆHØ�y‰y˜‹|Ðr5   c                 óJ   — | j                  |«      }| j                  |«      }|S rh   )rþ   r  ri   s     r4   rk   zRepVit.forward  s'   € Ø×!Ñ! !Ó$ˆØ×Ñ˜aÓ ˆØˆr5   c                 ó    ‡— ˆfd„Š ‰| «       y )Nc                 óª   •— | j                  «       D ]?  \  }}t        |d«      r&|j                  «       }t        | ||«        ‰|«       Œ8 ‰|«       ŒA y )NrF   )Únamed_childrenÚhasattrrF   Úsetattr)ÚnetÚ
child_nameÚchildÚfusedÚfuse_childrens       €r4   r  z"RepVit.fuse.<locals>.fuse_children  sQ   ø€ Ø%(×%7Ñ%7Ó%9ò )Ñ!�
˜EÜ˜5 &Ô)Ø!ŸJ™J›L�EÜ˜C ¨UÔ3Ù! %Õ(á! %Õ(ñ)r5   © )r1   r  s    @r4   rF   zRepVit.fuse  s   ø€ ô	)ñ 	�dÕr5   ©F)T)NFNN)NFFrð   F)r   FT)!rG   rH   rI   r+   ÚGELUrJ   r   rK   Ústrr   r�   r\   r)   rL   r«   ÚignorerÞ   râ   rå   r   rç   ré   ÚTensorr   r   r÷   rü   rþ   r  rk   rM   rF   rN   rO   s   @r4   r   r   r  s€  ø„ ð ØØ%*Ø!%ØØ ØØØ%'§W¡WØ!ØØØØñ;Uàð;Uð ð;Uð ˜˜c˜‘?ð	;Uð
 �S˜#�X‰ð;Uð ð;Uð ð;Uð ð;Uð ð;Uð ˜Ÿ	™	‘?ð;Uð ð;Uð ð;Uð õ;Uðz ‡Y�Y×Ñòó ðð ‡Y�Y×Ñò)ó ð)ð ‡Y�Y×Ñð §	¡	ò ó ðñZ¨Cð Z¸hÀs¹mð ZÐbfó Zð ‡Y�Y×Ñò.ó ð.ð 8<ØØ$Ø$Ø',ñ+ à�|‰|ð+ ð ˜e C¨¨c© NÑ3Ñ4ð+ ð ð	+ ð
 ð+ ð ð+ ð !%ð+ ð 
ˆt�E—L‘LÑ! 5¨¯©°t¸E¿L¹LÑ7IÐ)IÑ#JÐJÑ	Kó+ ð^ ./Ø$Ø#ñ	à˜3  S¡	˜>Ñ*ðð ðð ó	òñ¨$ó òð
 €U‡]�]ƒ_ñ
ó ô
r5   c                 ó2   — | dddddt         t        dddd	œ|¥S )
NrÀ   )r‘   r½   r½   )é   r  gffffffî?Úbicubiczstem.conv1.c)zhead.head.lzhead.head_dist.lz
apache-2.0)Úurlr    Ú
input_sizeÚ	pool_sizeÚcrop_pctÚinterpolationr  rR   Ú
first_convÚ
classifierÚlicenser   )r  Úkwargss     r4   Ú_cfgr!  &  s7   € àØØ#ØØØ"Ü%Ü#Ø$Ø9Øñð ðð r5   ztimm/)Ú	hf_hub_id)zrepvit_m1.dist_in1kzrepvit_m2.dist_in1kzrepvit_m3.dist_in1kzrepvit_m0_9.dist_300e_in1kzrepvit_m0_9.dist_450e_in1kzrepvit_m1_0.dist_300e_in1kzrepvit_m1_0.dist_450e_in1kzrepvit_m1_1.dist_300e_in1kzrepvit_m1_1.dist_450e_in1kzrepvit_m1_5.dist_300e_in1kzrepvit_m1_5.dist_450e_in1kzrepvit_m2_3.dist_300e_in1kzrepvit_m2_3.dist_450e_in1kc                 óh   — |j                  dd«      }t        t        | |fdt        d|¬«      i|¤Ž}|S )NÚout_indices)r   r   r8   r‘   Úfeature_cfgT)Úflatten_sequentialr$  )Úpopr   r   rÐ   )ÚvariantÚ
pretrainedr   r$  Úmodels        r4   Ú_create_repvitr+  d  sG   € Ø—*‘*˜]¨LÓ9€KÜ ÜØØñô ¨D¸kÔJð	ð
 ñ€Eð €Lr5   c           	      óL   — t        ddd¬«      }t        dd| it        |fi |¤Ž¤ŽS )z&
    Constructs a RepViT-M1 model
    ©r¾   é`   éÀ   i€  ©r8   r8   é   r8   T©rÃ   r³   ra   r)  )Ú	repvit_m1©rÐ   r+  ©r)  r   Ú
model_argss      r4   r3  r3  p  s2   € ô
 Ð 2¸-ÐPTÔU€JÜÑ[°*Ð[ÄÀZÑ@ZÐSYÑ@ZÑ[Ð[r5   c           	      óL   — t        ddd¬«      }t        dd| it        |fi |¤Ž¤ŽS )z&
    Constructs a RepViT-M2 model
    ©é@   é€   é   i   ©r8   r8   é   r8   Tr2  r)  )Ú	repvit_m2r4  r5  s      r4   r>  r>  y  ó2   € ô
 Ð 3¸=ÐQUÔV€JÜÑ[°*Ð[ÄÀZÑ@ZÐSYÑ@ZÑ[Ð[r5   c           	      óL   — t        ddd¬«      }t        dd| it        |fi |¤Ž¤ŽS )z&
    Constructs a RepViT-M3 model
    r8  )r’   r’   é   r8   Tr2  r)  )Ú	repvit_m3r4  r5  s      r4   rB  rB  ‚  r?  r5   c           	      óJ   — t        dd¬«      }t        dd| it        |fi |¤Ž¤ŽS )z(
    Constructs a RepViT-M0.9 model
    r-  r0  ©rÃ   r³   r)  )Úrepvit_m0_9r4  r5  s      r4   rE  rE  ‹  s/   € ô
 Ð 2¸-ÔH€JÜÑ]°JÐ]Ä$ÀzÑB\ÐU[ÑB\Ñ]Ð]r5   c           	      óJ   — t        dd¬«      }t        dd| it        |fi |¤Ž¤ŽS )z(
    Constructs a RepViT-M1.0 model
    )é8   ép   r½   iÀ  r0  rD  r)  )Úrepvit_m1_0r4  r5  s      r4   rI  rI  ”  ó/   € ô
 Ð 3¸=ÔI€JÜÑ]°JÐ]Ä$ÀzÑB\ÐU[ÑB\Ñ]Ð]r5   c           	      óJ   — t        dd¬«      }t        dd| it        |fi |¤Ž¤ŽS )z(
    Constructs a RepViT-M1.1 model
    r8  r<  rD  r)  )Úrepvit_m1_1r4  r5  s      r4   rL  rL  �  rJ  r5   c           	      óJ   — t        dd¬«      }t        dd| it        |fi |¤Ž¤ŽS )z(
    Constructs a RepViT-M1.5 model
    r8  )r’   r’   é   r’   rD  r)  )Úrepvit_m1_5r4  r5  s      r4   rO  rO  ¦  rJ  r5   c           	      óJ   — t        dd¬«      }t        dd| it        |fi |¤Ž¤ŽS )z(
    Constructs a RepViT-M2.3 model
    )éP   é    i@  i€  )é   rS  é"   r8   rD  r)  )Úrepvit_m2_3r4  r5  s      r4   rU  rU  ¯  rJ  r5   )rû   r  )4Ú__doc__Útypingr   r   r   r   r   rL   Útorch.nnr+   Ú	timm.datar	   r
   Útimm.layersr   r   r   r   Ú_builderr   Ú	_featuresr   Ú_manipulater   r   Ú	_registryr   r   Ú__all__r¸   r   rQ   r�   r^   rx   rƒ   r�   r–   rŸ   r²   r   r!  Údefault_cfgsr+  r3  r>  rB  rE  rI  rL  rO  rU  r  r5   r4   ú<module>ra     sQ  ðñ÷  6Õ 5ã Ý ç Aß JÓ JÝ *Ý +ß 3ß <àˆ*€ô'ˆr�}‰}ô 'ôT�—‘ô ôD:ˆr�y‰yô :ôz3�—	‘	ô 3ô&�"—)‘)ô ô44�—‘ô 4ô()�r—y‘yô )ôX-�r—y‘yô -ô`)�"—)‘)ô )ôXqˆR�Y‰Yô qóhñ" %á#Øô 
ñ  $Øô 
ñ  $Øô 
ñ '+Øô'
ñ '+Øô'
ñ '+Øô'
ñ '+Øô'
ñ '+Øô'
ñ '+Øô'
ñ '+Øô'
ñ '+Øô'
ñ '+Øô'
ñ '+Øô'
ñK(ó*€óZ	ð ò\ó ð\ð ò\ó ð\ð ò\ó ð\ð ò^ó ð^ð ò^ó ð^ð ò^ó ð^ð ò^ó ð^ð ò^ó ñ^r5   