ó
    ÷“,jš  ã                   óF  • S SK rS SKJr  S SKJrJrJrJr  S SK	r	S SK	J
r
  S SK	Jr  S SKJr  0 S4S jrS	 r\" S
5      r\" S5      r\" S5      r\" S5      rS rSS/S4S jrS r  SS\S\\\\\   4      S\S\\\   \4   4S jjrS\\\\S4   4   S\\S4   4S jrg)é    N)Úrepeat)ÚListÚOptionalÚTupleÚUnion)Únn)Ú_assert)ÚFrozenBatchNorm2dÚ c                 óà  • U nSnU(       a  X!;   nU(       Ga  [        U [        R                  R                  R                  [        R                  R                  R
                  45      (       Ga'  [        U R                  5      nU R                  Ul        U R                  Ul        U R                  (       a‚  U R                  R                  R                  5       R                  5       UR                  l
        U R                  R                  R                  5       R                  5       UR                  l
        U R                  R                  UR                  l
        U R                  R                  UR                  l
        U R                   Ul        U$ U R#                  5        HC  u  pVU(       a  SR%                  X%/5      OUn['        XaU5      nX†Ld  M2  UR)                  XX5        ME     U$ )a¢  
Converts all `BatchNorm2d` and `SyncBatchNorm` layers of provided module into `FrozenBatchNorm2d`. If `module` is
itself an instance of either `BatchNorm2d` or `SyncBatchNorm`, it is converted into `FrozenBatchNorm2d` and
returned. Otherwise, the module is walked recursively and submodules are converted in place.

Args:
    module (torch.nn.Module): Any PyTorch module.
    module_match (dict): Dictionary of full module names to freeze (all if empty)
    name (str): Full module name (prefix)

Returns:
    torch.nn.Module: Resulting module

Inspired by https://github.com/pytorch/pytorch/blob/a5895f85be0f10212791145bfedc0261d364f103/torch/nn/modules/batchnorm.py#L762
TÚ.)Ú
isinstancer   ÚmodulesÚ	batchnormÚBatchNorm2dÚSyncBatchNormr
   Únum_featuresÚaffineÚweightÚdataÚcloneÚdetachÚbiasÚrunning_meanÚrunning_varÚepsÚnamed_childrenÚjoinÚfreeze_batch_norm_2dÚ
add_module)	ÚmoduleÚmodule_matchÚnameÚresÚis_matchÚ
child_nameÚchildÚfull_child_nameÚ	new_childs	            Ú�C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\open_clip/utils.pyr   r      sa  € ð  €CØ€HÞØÑ'ˆß”J˜v¬¯
©
×(<Ñ(<×(HÑ(HÌ"Ï*É*×J^ÑJ^×JlÑJlÐ'm×nÒnÜ × 3Ñ 3Ó4ˆØ!×.Ñ.ˆÔØ—]‘]ˆŒ
Ø�=�=Ø$Ÿm™m×0Ñ0×6Ñ6Ó8×?Ñ?ÓAˆC�J‰JŒOØ"ŸK™K×,Ñ,×2Ñ2Ó4×;Ñ;Ó=ˆC�H‰HŒMØ &× 3Ñ 3× 8Ñ 8ˆ×ÑÔØ%×1Ñ1×6Ñ6ˆ�‰ÔØ—*‘*ˆŒð €Jð "(×!6Ñ!6Ö!8ÑˆJÞ>B˜cŸh™h¨Ð'9Ô:È
ˆOÜ,¨UÀ/ÓRˆIØÔ%Ø—‘˜zÖ5ñ	 "9ð
 €Jó    c                 ó   ^ • U 4S jnU$ )Nc                 ó„   >• [        U [        R                  R                  5      (       a  U $ [	        [        U T5      5      $ ©N)r   ÚcollectionsÚabcÚIterableÚtupler   )ÚxÚns    €r*   ÚparseÚ_ntuple.<locals>.parse4   s0   ø€ Ü�aœŸ™×1Ñ1×2Ñ2ØˆHÜ”V˜A˜q“\Ó"Ð"r+   © )r4   r5   s   ` r*   Ú_ntupler8   3   s   ø€ õ#ð €Lr+   é   é   é   é   c                 ó$   • [        U 5      " U5      $ r.   )r8   )r4   r3   s     r*   Ú<lambda>r>   ?   s   € œ œ Aœr+   Úc_fcÚc_projTc                 óà  • U R                  5        GHX  u  pE[        [        UR                  5       5      5      S:”  a  [	        XQX#5        [        U[        R                  R                  5      (       d  Mc  XB;   d  Mj  U R                  U   nU" UR                  UR                  UR                  S L5      U R                  U'   U(       d  M¹  U R                  U   R                  R                  R                  UR                  R                  5        U R                  U   R                  c  GM  U R                  U   R                  R                  R                  UR                  5        GM[     U $ ©Nr   )r   ÚlenÚlistÚchildrenÚreplace_linearr   Útorchr   ÚLinearÚ_modulesÚin_featuresÚout_featuresr   r   r   Úcopy_)ÚmodelÚlinear_replacementÚinclude_modulesÚcopy_weightsr#   r!   Ú
old_modules          r*   rF   rF   C   s  € Ø×,Ñ,×.‰ˆÜŒt�F—O‘OÓ%Ó&Ó'¨!Ó+Ü˜6°ÔUä�fœeŸh™hŸo™o×.Ó.°4Õ3JØŸ™¨Ñ-ˆJÙ#5Ø×"Ñ"Ø×#Ñ#Ø—‘ 4Ð'ó$ˆE�N‰N˜4Ñ ÷
 ˆ|Ø—‘˜tÑ$×+Ñ+×0Ñ0×6Ñ6°z×7HÑ7H×7MÑ7MÔNØ—>‘> $Ñ'×,Ñ,Ô8Ø—N‘N 4Ñ(×-Ñ-×2Ñ2×8Ñ8¸¿¹×Iñ /ð  €Lr+   c                 ó°   • U R                  5        HB  n[        US5      (       d  M  UR                  R                  nUR	                  5         X!l        MD     g )NÚprepare_for_eval)r   Úhasattrr   ÚdtyperS   Úint8_original_dtype)rM   ÚmrV   s      r*   Ú$convert_int8_model_to_inference_moderX   V   s@   € Ø�]‰]Ž_ˆÜ�1Ð(×)Ó)Ø"#§(¡(§.¡.ÐØ×ÑÔ Ø$7Ö!ò	 r+   r   ÚindicesÚas_setÚreturnc           	      ó
  • Uc  U n[        U[        5      (       aG  [        SUs=:  =(       a    U :*  Os  SU SU  S35        [        U5       Vs/ s H
  o0U-
  U-   PM     nnOQ/ nU HI  nUS:  a  X-   OUn[        SUs=:*  =(       a    U :  Os  SU SU S-
   S35        UR	                  U5        MK     [
        R                  R                  5       (       d  U(       a  [        U5      [        U5      4$ U[        U5      4$ s  snf )a  Determine the absolute feature indices to 'take' from.

Note: This function can be called in forward() so must be torchscript compatible,
which requires some incomplete typing and workaround hacks.

Args:
    num_features: total number of features to select from
    indices: indices to select,
      None -> select all
      int -> select last n
      list/tuple of int -> return specified (-ve indices specify from end)
    as_set: return as a set

Returns:
    List (or set) of absolute (from beginning) indices, Maximum index
r   zlast-n (z) is out of range (1 to Ú)zfeature index z is out of range (0 to r9   )
r   Úintr	   ÚrangeÚappendrG   ÚjitÚis_scriptingÚsetÚmax)r   rY   rZ   ÚiÚtake_indicesÚidxs         r*   Úfeature_take_indicesrh   ^   s  € ð* �Øˆä�'œ3×Ñä��G×+Ó+˜|Ô+¨x¸°yÐ@XÐYeÐXfÐfgÐ-hÔiÜ<AÀ'¼NÓKºN°q wÑ.°Ô2¹NˆÐKˆà"$ˆÛˆAØ&'¨!£e�,Ò"°ˆCÜ�A˜×+Ó+˜|Ô+¨~¸c¸UÐBYÐZfÐijÑZjÐYkÐklÐ-mÔnØ×Ñ Ö$ñ ô
 �9‰9×!Ñ!×#Ñ#®Ü�<Ó ¤# lÓ"3Ð3Ð3àœ˜\Ó*Ð*Ð*ùò Ls   ÁD r3   .c                 ón   • [        U [        5      (       a  [        [        U * S5      5      $ [        U 5      $ rB   )r   r^   r2   r_   )r3   s    r*   Ú_out_indices_as_tuplerj   ‡   s+   € Ü�!”S×Ñä”U˜A˜2˜q“\Ó"Ð"Ü�‹8€Or+   )NF)Úcollections.abcr/   Ú	itertoolsr   Útypingr   r   r   r   rG   r   r	   Útorchvision.ops.miscr
   r   r8   Ú	to_1tupleÚ	to_2tupleÚ	to_3tupleÚ	to_4tupleÚ	to_ntuplerF   rX   r^   Úboolrh   rj   r7   r+   r*   Ú<module>ru      sñ   ðÛ Ý ß /Ó /ã Ý Ý Ý 2ð /1°rô $òPñ �A‹J€	Ù�A‹J€	Ù�A‹J€	Ù�A‹J€	Ù&€	ð @FÀxÐ>PÐ_cô ò&8ð 48Øñ&+Øð&+à˜%  T¨#¡Y Ñ/Ñ0ð&+ð ð&+ð ˆ4�‰9�cˆ>Ñõ	&+ðR˜U 3¨¨c°3¨h©Ð#7Ñ8ð ¸UÀ3ÈÀ8¹_õ r+   