ó
    ÷“,j¿"  ã                   óÐ   • S r SSKrSSKJr  SSKJrJrJrJrJ	r	  SSK
r
SSKJr   SSKrSSKJr  SSKJr  SSKJrJr  SS	KJr   " S
 S\R.                  5      rg! \ a    Sr N&f = f)zƒtimm model adapter

Wraps timm (https://github.com/rwightman/pytorch-image-models) models for use as a vision tower in CLIP model.
é    N)ÚOrderedDict)ÚDictÚListÚOptionalÚTupleÚUnion)ÚRotAttentionPool2d)ÚAttentionPool2d)ÚMlpÚ	to_2tupleé   )Úfreeze_batch_norm_2dc                   ó´  ^ • \ rS rSrSr        SS\S\S\\\\\4   4   S\S\S\	S	\
S
\\
   S\\
   S\	4U 4S jjjrS S\S\	4S jjr\R                  R                   S!S\	4S jj5       r      S"S\R$                  S\\\\\   4      S\	S\	S\	S\S\	S\\\\R$                  \\R$                     4   4   4S jjrS\\\\\4   4   4S jrS rSrU =r$ )#Ú	TimmModelé   ztimm model adapter
    Ú
model_nameÚ	embed_dimÚ
image_sizeÚpoolÚprojÚ	proj_biasÚdropÚ	drop_pathÚ
patch_dropÚ
pretrainedc                 óð  >• [         TU ]  5         [        c  [        S5      e[	        U5      U l        0 nUb  X‹S'   U	b  X›S'   US;   nU(       a  US;   d   eUS;   nU(       d4  U(       d-  US:X  a  SOUn[        R                  " U4UUU
S	.UD6U l        UnO½[        R                  " U4S
U
0UD6U l        U R                  R                  R                  SS 5      nU(       d  SOSnU(       a#  US:X  d   eU R                  R                  SSS9  O.U(       a	  [        US9O0 nU R                  R                  " S0 UD6  U R                  R                  n[        5       nUS:X  a  [        UWUS9US'   UnOUS:X  a  [        XòS9US'   UnUS:X  a2  [         R"                  " U5      US'   [         R$                  " XòUS9US'   OUS:X  a  ['        USU-  X'S4SU4S9US'   [         R(                  " U5      U l        g )NzMPlease install the latest timm (`pip install timm`) to use timm based models.Údrop_path_rateÚpatch_drop_rate)Úabs_attnÚrot_attn)ÚlinearÚmlpÚnone)r!   r"   r#   r   )Únum_classesÚglobal_poolr   r   Ú	pool_sizer   é   Ú )r%   r   )Ú	feat_sizeÚout_featuresr   r    )r*   r!   r   )Úbiasr   r"   T)r   r+   )r   )ÚsuperÚ__init__ÚtimmÚRuntimeErrorr   r   Úcreate_modelÚtrunkÚdefault_cfgÚgetÚreset_classifierÚdictÚnum_featuresr   ÚAbsAttentionPool2dr	   ÚnnÚDropoutÚLinearr   Ú
SequentialÚhead)Úselfr   r   r   r   r   r   r   r   r   r   Útimm_kwargsÚcustom_poolÚ
extra_projÚproj_dimÚprev_chsr)   Úfeature_ndimÚreset_kwargsÚhead_layersÚ	__class__s                       €Ú¢C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\open_clip/timm_model.pyr-   ÚTimmModel.__init__   s   ø€ ô 	‰ÑÔÜ‰<ÜÐnÓoÐoÜ# JÓ/ˆŒð ˆØÑ Ø,5Ð(Ñ)ØÑ!Ø-7Ð)Ñ*àÐ6Ñ6ˆÞØÐ4Ó4Ð4Ð4ØÐ.Ñ.ˆ
Þ¦+ð ! F›N‘q°	ˆHÜ×*Ò*Øðà$Ø Ø%ñ	ð
 ñˆDŒJð !‰Hä×*Ò*Øñà%ðð ñˆDŒJð
 Ÿ
™
×.Ñ.×2Ñ2°;ÀÓEˆIÞ$-™1°1ˆLÞØ# qÓ(Ð(Ð(à—
‘
×+Ñ+¨A¸2Ð+Ò>ö :>œt°Ò5À2�Ø—
‘
×+Ò+Ñ>°Ò>Ø—z‘z×.Ñ.ˆHä!“mˆð �:ÓÜ"4°XÈÐajÑ"kˆK˜ÑØ ‰HØ�ZÓÜ"4°XÑ"VˆK˜ÑØ ˆHð �8ÓÜ"$§*¢*¨TÓ"2ˆK˜ÑÜ"$§)¢)¨HÀiÑ"PˆK˜ÒØ�U‹]Ü!$ X¨q°9©}¸iÐUVÈiÐ_cÐenÐ^oÑ!pˆK˜Ñä—M’M +Ó.ˆ�	ó    Úunlocked_groupsÚfreeze_bn_statsc                 ó¼  • U(       dF  U R                   R                  5        H
  nSUl        M     U(       a  [        U R                   5        gg SSKJnJn  U R                   R                  5       nU" U R                   U5      n[        UR                  5       5      nX�-
  n[        US-   5       H0  n	Xy   n
U
 H#  nSU R                   R                  U5      l        M%     M2     U(       aT  U" U R                   USS9nUR                  5        VVs1 s H  u  pÍXØ::  d  M  UiM     nnn[        U R                   U5        gg! [         a    [        S5      ef = fs  snnf )	z^lock modules
Args:
    unlocked_groups (int): leave last n layer groups unlocked (default: 0)
Fr   )Úgroup_parametersÚgroup_modulesz^Please install latest timm `pip install git+https://github.com/rwightman/pytorch-image-models`r   T)ÚreverseN)r1   Ú
parametersÚrequires_gradr   Útimm.models.helpersrM   rN   ÚImportErrorr/   Úgroup_matcherÚmaxÚkeysÚrangeÚget_parameterÚitems)r=   rJ   rK   ÚparamrM   rN   ÚmatcherÚgparamsÚmax_layer_idÚ	group_idxÚgroupÚgmodulesÚkÚvs                 rG   ÚlockÚTimmModel.locki   s4  € ö
 àŸ™×.Ñ.Ö0�Ø&+�Ö#ñ 1æÜ$ T§Z¡ZÕ0ð ðvçOð —j‘j×.Ñ.Ó0ˆGÙ& t§z¡z°7Ó;ˆGÜ˜wŸ|™|›~Ó.ˆLØ'Ñ9ˆLÜ" <°!Ñ#3Ö4�	ØÑ*�Û"�EØDI�D—J‘J×,Ñ,¨UÓ3ÖAó #ñ 5ö Ù(¨¯©°WÀdÑK�Ø*2¯.©.Ô*:ÔPÒ*:¡$ !¸aÑ>OŸAÑ*:�ÑPÜ$ T§Z¡Z°Õ:ð øô ó vÜ"Øtóvð vðvüó Qs   ÁD? ÄEÄEÄ?EÚenablec                 ó–   •  U R                   R                  U5        g ! [         a   n[        R                  " S5         S nAg S nAff = f)NzQgrad checkpointing not supported for this timm image tower, continuing without...)r1   Úset_grad_checkpointingÚ	ExceptionÚloggingÚwarning)r=   re   Úes      rG   rg   Ú TimmModel.set_grad_checkpointing‰   s<   € ð	qØ�J‰J×-Ñ-¨fÕ5øÜó 	qÜ�OŠOÐo×pÑpûð	qús   ‚ ž
A¨AÁAÚxÚindicesÚ
stop_earlyÚnormalize_intermediatesÚintermediates_onlyÚ
output_fmtÚoutput_extra_tokensÚreturnc           	      óÀ  • 0 nU(       a  SUS'   U R                   R                  " U4UUUUUS.UD6n	0 n
U(       a  U	OU	S   nU(       aK  U(       aD  [        US   [        5      (       a,  U Vs/ s H  oÌS   PM	     nnU Vs/ s H  oÌS   PM	     nnXÚS'   XºS'   U(       a  U
$ U R                   R	                  U	S   5      nU R                  U5      nXêS'   U
$ s  snf s  snf )	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
    stop_early: Stop iterating over blocks when last desired intermediate hit
    normalize_intermediates: Apply norm layer to all intermediates
    intermediates_only: Only return intermediate features
    output_fmt: Shape of intermediate feature outputs
    output_extra_tokens: Return both prefix and spatial intermediate tokens
Returns:
TÚreturn_prefix_tokens)rn   rq   Únormro   rr   r   r   Úimage_intermediates_prefixÚimage_intermediatesÚimage_features)r1   Úforward_intermediatesÚ
isinstanceÚtupleÚforward_headr<   )r=   rm   rn   ro   rp   rq   rr   rs   Ú
extra_argsÚtrunk_outputÚreturn_dictÚintermediatesÚxiÚintermediates_prefixrz   s                  rG   r{   ÚTimmModel.forward_intermediates�   sý   € ð, ˆ
ÞØ15ˆJÐ-Ñ.Ø—z‘z×7Ò7ØðàØ#5Ø,Ø%Ø%ñð ñˆð ˆÞ(:™ÀÈQÁˆÞ¦=´ZÀÈaÑ@PÔRW×5XÑ5XÙ4AÓ#B²M¨b q¤E±MÐ Ð#BÙ-:Ó;ª] r œU©]ˆMÐ;Ø8LÐ4Ñ5à-:Ð)Ñ*ÞØÐàŸ™×0Ñ0°¸a±ÓAˆØŸ™ >Ó2ˆØ(6Ð$Ñ%ØÐùò $CùÚ;s   Á,CÂ Cc                 ó  • [        U5      U l        [        U R                  S5      (       a  U R                  R	                  U5        g[
        R                  " SU R                  R                  R                   S35        g)zûSet the input image size for the model after initialization.

This method attempts to call set_input_size on the underlying timm model
if it supports dynamic input size adjustment.

Args:
    image_size: New image size as int (square) or tuple (h, w)
Úset_input_sizeztimm model z/ does not have set_input_size method. Skipping.N)	r   r   Úhasattrr1   r‡   ri   ÚinforF   Ú__name__)r=   r   s     rG   r‡   ÚTimmModel.set_input_sizeÃ   s]   € ô $ JÓ/ˆŒô �4—:‘:Ð/×0Ñ0Ø�J‰J×%Ñ% jÕ1ä�LŠL˜; t§z¡z×';Ñ';×'DÑ'DÐ&EÐEtÐuÕvrI   c                 óJ   • U R                  U5      nU R                  U5      nU$ )N)r1   r<   )r=   rm   s     rG   ÚforwardÚTimmModel.forwardÔ   s!   € Ø�J‰J�q‹MˆØ�I‰I�a‹LˆØˆrI   )r<   r   r1   )éà   Úavgr!   Fg        NNF)r   F)T)NFFFÚNCHWF)rŠ   Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__ÚstrÚintr   r   ÚboolÚfloatr   r-   rc   ÚtorchÚjitÚignorerg   ÚTensorr   r   r{   r‡   r�   Ú__static_attributes__Ú__classcell__)rF   s   @rG   r   r      sº  ø† ñð 7:ØØ Ø#ØØ)-Ø*.Ø$ñL/àðL/ð ðL/ð ˜c 5¨¨c¨¡?Ð2Ñ3ð	L/ð
 ðL/ð ðL/ð ðL/ð ðL/ð   ‘ðL/ð ! ™ðL/ð ÷L/ð L/ñ\; Cð ;¸dõ ;ð@ ‡Y�Y×Ññq¨Tô qó ðqð 8<Ø$Ø,1Ø',Ø$Ø(-ñ1à�|‰|ð1ð ˜e C¨¨c© NÑ3Ñ4ð1ð ð	1ð
 &*ð1ð !%ð1ð ð1ð "&ð1ð 
ˆc�5˜Ÿ™ t¨E¯L©LÑ'9Ð9Ñ:Ð:Ñ	;õ1ðfw¨¨s°E¸#¸s¸(±OÐ/CÑ)Dô w÷"ð rI   r   )r•   ri   Úcollectionsr   Útypingr   r   r   r   r   rš   Útorch.nnr8   r.   Útimm.layersr	   r
   r7   r   r   rS   Úutilsr   ÚModuler   © rI   rG   Ú<module>r§      s\   ðñó Ý #ß 5Õ 5ã Ý ðÛÝ.ÝAß*õ (ô@�—	‘	õ @øð ó Ø‚Dðús   ¦A ÁA%Á$A%