Ë
    éÓ^jfb  ã                   óÄ  — d Z ddlZddlZddlmZmZmZmZmZm	Z	 ddl
Z
ddl
mZ ddlmc mZ ddlmZmZ ddlmZ ddlmZ  ej,                  e«      Z G d	„ d
ej2                  «      Z G d„ de«      Z	 	 	 d"dee   dededefd„Ze
j@                  Z!e!fdeeef   deeef   dedede
jD                  de
jF                  de
jH                  fd„Z%e!fde
jH                  de
jH                  deeef   de
jF                  de
jF                  de
jH                  fd„Z&	 	 	 d"de
jH                  dee   dededef
d„Z' G d„ dej2                  «      Z( G d „ d!ej2                  «      Z)y)#a?   Image to Patch Embedding using Conv2d

A convolution based approach to patchifying a 2D image w/ embedding projection.

Based on code in:
  * https://github.com/google-research/vision_transformer
  * https://github.com/google-research/big_vision/tree/main/big_vision

Hacked together by / Copyright 2020 Ross Wightman
é    N)ÚCallableÚDictÚListÚOptionalÚTupleÚUnion)Únné   )ÚFormatÚnchw_to)Ú	to_2tuple)Ú_assertc                   ó†  ‡ — e Zd ZU dZeed<   ej                  j                  e	   ed<   	 	 	 	 	 	 	 	 	 	 	 	 dde
eeeeef   f      dededede
e   d	e	de
e   d
e	de	de	fˆ fd„Zdeeeeef   f   fd„Z	 	 dde
eeeeef   f      de
eeeeef   f      fd„Zddeeeef   ef   fd„Zdeeef   deeef   fd„Zd„ Zˆ xZS )Ú
PatchEmbedú! 2D Image to Patch Embedding
    Ú
output_fmtÚdynamic_img_padÚimg_sizeÚ
patch_sizeÚin_chansÚ	embed_dimÚ
norm_layerÚflattenÚbiasÚstrict_img_sizec                 ó°  •— ||dœ}t         ‰| �  «        t        |«      | _        | j	                  |«      \  | _        | _        | _        |�d| _        t        |«      | _
        n|| _        t        j                  | _
        |	| _        |
| _        t        j                  ||f|||dœ|¤Ž| _        |r ||fi |¤Ž| _        y t        j"                  «       | _        y )N©ÚdeviceÚdtypeF)Úkernel_sizeÚstrider   )ÚsuperÚ__init__r   r   Ú_init_img_sizer   Ú	grid_sizeÚnum_patchesr   r   r   ÚNCHWr   r   r	   ÚConv2dÚprojÚIdentityÚnorm)Úselfr   r   r   r   r   r   r   r   r   r   r   r   ÚddÚ	__class__s                 €úb/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/layers/patch_embed.pyr#   zPatchEmbed.__init__    sÃ   ø€ ð ¨Ñ/ˆÜ‰ÑÔÜ# JÓ/ˆŒØ:>×:MÑ:MÈhÓ:WÑ7ˆŒ�t”~ tÔ'7àÐ!Ø ˆDŒLÜ$ ZÓ0ˆD�Oð #ˆDŒLÜ$Ÿk™kˆDŒOØ.ˆÔØ.ˆÔä—I‘I˜h¨	Ðn¸zÐR\ÐcgÑnÐkmÑnˆŒ	Ù3=‘J˜yÑ/¨BÑ/ˆ�	Ä2Ç;Á;Ã=ˆ�	ó    c                 óÐ   — | j                   sJ ‚|€yt        |«      }t        t        || j                   «      D ��cg c]
  \  }}||z  ‘Œ c}}«      }|d   |d   z  }|||fS c c}}w )N)NNNr   r
   )r   r   ÚtupleÚzip)r,   r   ÚsÚpr%   r&   s         r/   r$   zPatchEmbed._init_img_sizeA   sn   € Ø�ŠÐˆØÐØ#Ü˜XÓ&ˆÜ¬c°(¸D¿O¹OÓ.L×M¡d a¨˜1 ›6ÓMÓNˆ	Ø ‘l Y¨q¡\Ñ1ˆØ˜ KÐ/Ð/ùó Ns   »A"
c           
      ón  — d }|�t        |«      }|��Q|| j                  k7  �rAt        j                  «       5  t	        j
                  | j                  j                  | j                  j                  ||| j                  j                  d u| j                  j                  j                  | j                  j                  j                  ¬«      }|j                  j                  t        | j                  j                  |d¬«      «       | j                  j                  �/|j                  j                  | j                  j                  «       || _        d d d «       || _        |xs | j                  }|| j                  k7  s|�%| j!                  |«      \  | _        | _        | _        y y # 1 sw Y   ŒWxY w)N)r    r!   r   r   r   T)Úverbose)r   r   ÚtorchÚno_gradr	   r(   r)   Úin_channelsÚout_channelsr   Úweightr   r   Úcopy_Úresample_patch_embedr   r$   r%   r&   )r,   r   r   Únew_patch_sizeÚnew_projs        r/   Úset_input_sizezPatchEmbed.set_input_sizeJ   sQ  € ð
 ˆØÐ!Ü& zÓ2ˆNØÑ%¨.¸D¿O¹OÓ*KÜ—‘“ñ %ÜŸ9™9Ø—I‘I×)Ñ)Ø—I‘I×*Ñ*Ø .Ø)ØŸ™Ÿ™¨tÐ3ØŸ9™9×+Ñ+×2Ñ2ØŸ)™)×*Ñ*×0Ñ0ô�ð —‘×%Ñ%Ô&:¸4¿9¹9×;KÑ;KÈ^ÐeiÔ&jÔkØ—9‘9—>‘>Ð-Ø—M‘M×'Ñ'¨¯	©	¯©Ô7Ø$�”	÷%ð -ˆDŒOØÒ,˜tŸ}™}ˆØ�t—}‘}Ò$¨Ð(BØ>B×>QÑ>QÐRZÓ>[Ñ;ˆDŒM˜4œ>¨4Õ+;ð )C÷!%ð %ús   ·DF+Æ+F4Úreturnc                 óH   — |rt        | j                  «      S | j                  S ©N)Úmaxr   )r,   Ú	as_scalars     r/   Ú
feat_ratiozPatchEmbed.feat_ratiof   s   € ÙÜ�t—‘Ó'Ð'à—?‘?Ð"r0   c                 ó  — | j                   rPt        j                  |d   | j                  d   z  «      t        j                  |d   | j                  d   z  «      fS |d   | j                  d   z  |d   | j                  d   z  fS )z¤ Get grid (feature) size for given image size taking account of dynamic padding.
        NOTE: must be torchscript compatible so using fixed tuple indexing
        r   r
   )r   ÚmathÚceilr   )r,   r   s     r/   Údynamic_feat_sizezPatchEmbed.dynamic_feat_sizel   sƒ   € ð ×ÒÜ—9‘9˜X a™[¨4¯?©?¸1Ñ+=Ñ=Ó>ÄÇ	Á	È(ÐSTÉ+ÐX\×XgÑXgÐhiÑXjÑJjÓ@kÐkÐkà˜A‘; $§/¡/°!Ñ"4Ñ4°h¸q±kÀTÇ_Á_ÐUVÑEWÑ6WÐWÐWr0   c                 ó  — |j                   \  }}}}| j                  �ß| j                  rat        || j                  d   k(  d|› d| j                  d   › d�«       t        || j                  d   k(  d|› d| j                  d   › d�«       nr| j                  sft        || j
                  d   z  dk(  d|› d| j
                  d   › d�«       t        || j
                  d   z  dk(  d|› d| j
                  d   › d�«       | j                  r~| j
                  d   || j
                  d   z  z
  | j
                  d   z  }| j
                  d   || j
                  d   z  z
  | j
                  d   z  }t        j                  |d|d|f«      }| j                  |«      }| j                  r"|j                  d«      j                  dd«      }n3| j                  t        j                  k7  rt        || j                  «      }| j                  |«      }|S )	Nr   zInput height (z) doesn't match model (ú).r
   zInput width (z%) should be divisible by patch size (é   )Úshaper   r   r   r   r   ÚFÚpadr)   r   Ú	transposer   r   r'   r   r+   )r,   ÚxÚBÚCÚHÚWÚpad_hÚpad_ws           r/   ÚforwardzPatchEmbed.forwardu   sý  € Ø—W‘W‰
ˆˆ1ˆa�Ø�=‰=Ð$Ø×#Ò#Ü˜˜TŸ]™]¨1Ñ-Ñ-°À¸sÐBYÐZ^×ZgÑZgÐhiÑZjÐYkÐkmÐ/nÔoÜ˜˜TŸ]™]¨1Ñ-Ñ-°¸q¸cÐAXÐY]×YfÑYfÐghÑYiÐXjÐjlÐ/mÕnØ×)Ò)ÜØ˜Ÿ™¨Ñ*Ñ*¨aÑ/Ø$ Q CÐ'LÈTÏ_É_Ð]^ÑM_ÐL`Ð`bÐcôô Ø˜Ÿ™¨Ñ*Ñ*¨aÑ/Ø# A 3Ð&KÈDÏOÉOÐ\]ÑL^ÐK_Ð_aÐbôð ×ÒØ—_‘_ QÑ'¨!¨d¯o©o¸aÑ.@Ñ*@Ñ@ÀDÇOÁOÐTUÑDVÑVˆEØ—_‘_ QÑ'¨!¨d¯o©o¸aÑ.@Ñ*@Ñ@ÀDÇOÁOÐTUÑDVÑVˆEÜ—‘�a˜!˜U A uÐ-Ó.ˆAØ�I‰I�a‹LˆØ�<Š<Ø—	‘	˜!“×&Ñ& q¨!Ó,‰AØ�_‰_¤§¡Ò+Ü˜˜4Ÿ?™?Ó+ˆAØ�I‰I�a‹LˆØˆr0   )éà   é   é   é   NTNTTFNN)NN)T)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__annotations__r8   ÚjitÚFinalÚboolr   r   Úintr   r   Ústrr#   r$   rA   rG   rK   rZ   Ú__classcell__©r.   s   @r/   r   r      s“  ø… ñàÓØ—Y‘Y—_‘_ TÑ*Ó*ð ?BØ ØØ Ø-1Ø Ø(,ØØ$(Ø$)ØØñQà˜u S¨%°°S°©/Ð%9Ñ:Ñ;ðQð ðQð ð	Qð
 ðQð ! Ñ*ðQð ðQð ! ™ðQð ðQð "ðQð "õQðB0 u¨S°%¸¸S¸±/Ð-AÑ'Bó 0ð ?CØ@Dñ\à˜u S¨%°°S°©/Ð%9Ñ:Ñ;ð\ð !  s¨E°#°s°(©OÐ';Ñ!<Ñ=ó\ñ8#¨E°%¸¸S¸±/À3Ð2FÑ,Gó #ðX¨%°°S°©/ð X¸eÀCÈÀH¹oó Xör0   r   c                   ó¼   ‡ — e Zd ZU dZeed<   	 	 	 	 	 	 	 	 	 	 ddeeee	eef   f      dedededee
   dedee   d	efˆ fd
„Zde	ej                  ee   f   fd„Zˆ xZS )ÚPatchEmbedWithSizer   r   r   r   r   r   r   r   r   c                 ó8   •— t         ‰| �  |||||||||	|
¬«
       y )N)
r   r   r   r   r   r   r   r   r   r   )r"   r#   )r,   r   r   r   r   r   r   r   r   r   r   r.   s              €r/   r#   zPatchEmbedWithSize.__init__–   s5   ø€ ô 	‰ÑØØ!ØØØ!ØØ!ØØØð 	õ 	
r0   rB   c                 ó4  — |j                   \  }}}}| j                  �ft        || j                  d   z  dk(  d|› d| j                  d   › d�«       t        || j                  d   z  dk(  d|› d| j                  d   › d�«       | j	                  |«      }|j                   dd  }| j
                  r"|j                  d«      j                  dd«      }n3| j                  t        j                  k7  rt        || j                  «      }| j                  |«      }||fS )	Nr   zInput image height (z#) must be divisible by patch size (rM   r
   zInput image width (éþÿÿÿrN   )rO   r   r   r   r)   r   rR   r   r   r'   r   r+   )r,   rS   rT   rU   rV   rW   Ú	feat_sizes          r/   rZ   zPatchEmbedWithSize.forward°   s+  € Ø—W‘W‰
ˆˆ1ˆa�Ø�=‰=Ð$Ü�A˜Ÿ™¨Ñ*Ñ*¨aÑ/Ð3GÈÀsÐJmÐnr×n}Ñn}Ð~ñ  oAð  nBð  BDð  2Eô  FÜ�A˜Ÿ™¨Ñ*Ñ*¨aÑ/Ð3FÀqÀcÐIlÐmq×m|Ñm|Ð}~Ñmð  mAð  ACð  2Dô  Eà�I‰I�a‹LˆØ—G‘G˜B˜C�Lˆ	Ø�<Š<Ø—	‘	˜!“×&Ñ& q¨!Ó,‰AØ�_‰_¤§¡Ò+Ü˜˜4Ÿ?™?Ó+ˆAØ�I‰I�a‹LˆØ�)ˆ|Ðr0   )
r[   r\   r]   r^   NTNTNN)r_   r`   ra   rb   r   rc   r   r   rg   r   r   rf   rh   r#   r8   ÚTensorr   rZ   ri   rj   s   @r/   rl   rl   ‘   sÀ   ø… ñàÓð ?BØ ØØ Ø-1Ø Ø(,ØØØñ
à˜u S¨%°°S°©/Ð%9Ñ:Ñ;ð
ð ð
ð ð	
ð
 ð
ð ! Ñ*ð
ð ð
ð ! ™ð
ð õ
ð4˜E %§,¡,°°S±	Ð"9Ñ:÷ r0   rl   Únew_sizeÚinterpolationÚ	antialiasr7   c           	      ó®  ‡‡‡‡‡‡— ddl Š	 ddlm} t        | j                  «      dk(  sJ d«       ‚t        ‰«      dk(  sJ d«       ‚| j                  dd }t        |«      t        ‰«      k(  r| S |r)t        j                  d	| j                  › d
‰› d‰› d�«       ˆˆfd„Šˆˆfd„} ||‰«      }t        j                  ‰j                  j                  |j                  «      | j                  ¬«      Šˆˆfd„}	 | ||	dd«      dd«      }
| j                  }| j!                  «       }  |
| «      } | j#                  |«      } | S # t        $ r
 ddlm} Y �ŒAw xY w)a/  Resample the weights of the patch embedding kernel to target resolution.
    We resample the patch embedding kernel by approximately inverting the effect
    of patch resizing.

    Code based on:
      https://github.com/google-research/big_vision/blob/b00544b81f8694488d5f36295aeb7972f3755ffe/big_vision/models/proj/flexi/vit.py

    With this resizing, we can for example load a B/8 filter into a B/16 model
    and, on 2x larger input image, the result will match.

    Args:
        patch_embed: original parameter to be resized.
        new_size (tuple(int, int): target shape (height, width)-only.
        interpolation (str): interpolation for resize
        antialias (bool): use anti-aliasing filter in resize
        verbose (bool): log operation
    Returns:
        Resized patch embedding kernel.
    r   N)Úvmapé   zFour dimensions expectedrN   zNew shape should only be hwro   zResize patch embedding z to z, w/ z interpolation.c                 óŒ   •— t        j                  | «      d   }t        j                  ||‰‰¬«      d   j	                  «       }|S )N)NN.)ÚsizeÚmodert   )r   r   .)r8   rq   rP   ÚinterpolateÚnumpy)Úx_npÚ	_new_sizeÚx_tfÚx_upsampledrt   rs   s       €€r/   Úresizez(resample_patch_embed_old.<locals>.resizeê   sI   ø€ Ü�|‰|˜DÓ! /Ñ2ˆÜ—m‘mØ�y }À	ôKØKTñVßV[ÑV[ÓV]ð 	àÐr0   c                 ó  •— g }t        ‰j                  | «      «      D ]O  }‰j                  | «      }d|‰j                  || «      <   |j	                   ‰||«      j                  d«      «       ŒQ ‰j                  |«      j                  S )Ng      ð?éÿÿÿÿ)ÚrangeÚprodÚzerosÚunravel_indexÚappendÚreshapeÚstackÚT)Ú	_old_sizer~   ÚmatÚiÚ	basis_vecÚnpr�   s        €€r/   Úget_resize_matz0resample_patch_embed_old.<locals>.get_resize_matð   s~   ø€ ØˆÜ�r—w‘w˜yÓ)Ó*ò 	AˆAØŸ™ Ó+ˆIØ8:ˆI�b×&Ñ& q¨)Ó4Ñ5Ø�J‰J‘v˜i¨Ó3×;Ñ;¸BÓ?Õ@ð	Að �x‰x˜‹}�‰Ðr0   )r   c                 óN   •— ‰| j                  d«      z  }|j                  ‰«      S )Nrƒ   )r‰   )ÚkernelÚresampled_kernelrr   Úresize_mat_pinvs     €€r/   Úresample_kernelz1resample_patch_embed_old.<locals>.resample_kernelû   s(   ø€ Ø*¨V¯^©^¸BÓ-?Ñ?ÐØ×'Ñ'¨Ó1Ð1r0   r
   )r|   r8   rv   ÚImportErrorÚ	functorchÚlenrO   r2   Ú_loggerÚinfoÚtensorÚlinalgÚpinvr‹   r   r   ÚfloatÚto)Úpatch_embedrr   rs   rt   r7   rv   Úold_sizer‘   Ú
resize_matr–   Úv_resample_kernelÚ
orig_dtyper�   r�   r•   s    ```        @@@r/   Úresample_patch_embed_oldr¦   Á   sM  ý€ ó4 ð#Ýô ˆ{× Ñ Ó! QÒ&ÐBÐ(BÓBÐ&Üˆx‹=˜AÒÐ<Ð<Ó<ÐØ× Ñ   Ð%€HÜˆXƒœ% ›/Ò)ØÐáÜ�‰Ð.¨{×/@Ñ/@Ð.AÀÀhÀZÈuÐUbÐTcÐcrÐsÔtõõñ   ¨(Ó3€JÜ—l‘l 2§9¡9§>¡>°*·,±,Ó#?È×HZÑHZÔ[€Oõ2ñ ™T /°1°aÓ8¸!¸QÓ?ÐØ×"Ñ"€JØ×#Ñ#Ó%€KÙ# KÓ0€KØ—.‘. Ó,€KØÐøôM ò #ß"Ð"ð#ús   ŒE ÅEÅEr¢   r   r   rB   c                 ó  — | \  }}|\  }}	||z  }
||	z  }t        j                  |
||¬«      }|j                  |
d||«      }t        j                  ||||d¬«      }|j                  d«      j                  ddd«      j                  ||
«      }|S )zKComputes the resize matrix basis vectors and interpolates them to new_size.r   r
   F)ry   rz   rt   Úalign_cornersrN   r   )r8   Úeyer‰   rP   r{   ÚsqueezeÚpermute)r¢   rr   rs   rt   r   r   Úold_hÚold_wÚnew_hÚnew_wÚ	old_totalÚ	new_totalÚ
eye_matrixÚbasis_vectors_batchÚresized_basis_vectors_batchÚresize_matrixs                   r/   Ú_compute_resize_matrixr¶   
  s¥   € ð �L€Eˆ5Ø�L€Eˆ5Ø˜‘€IØ˜‘€Iä—‘˜9¨V¸5ÔA€JØ$×,Ñ,¨Y¸¸5À%ÓHÐÜ"#§-¡-ØØØØØô#Ðð 0×7Ñ7¸Ó:×BÑBÀ1ÀaÈÓK×SÑSÐT]Ð_hÓi€MØÐr0   r¡   Úpinv_matrixÚnew_size_tupler¥   Úintermediate_dtypec                 óà   — | j                   ^}}}| j                  ||d«      j                  |¬«      } |j                  |¬«      }| |z  } |j                  ||g|¢­Ž j                  |¬«      }|S )zW Simplified resampling w/o vmap use.
    As proposed by https://github.com/stas-sl
    rƒ   )r   )rO   r‰   r    )	r¡   r·   r¸   r¥   r¹   Úc_outÚc_inÚ_Úresampled_patch_embeds	            r/   Ú_apply_resamplingr¿   %  s„   € ð "×'Ñ'€O€Eˆ4�!Ø×%Ñ% e¨T°2Ó6×9Ñ9Ð@RÐ9ÓS€KØ—.‘.Ð'9�.Ó:€KØ'¨+Ñ5ÐØ9Ð1×9Ñ9¸%ÀÐWÈÒW×ZÑZÐakÐZÓlÐØ Ð r0   c                 ó~  — t        | j                  «      dk(  sJ d«       ‚t        |«      dk(  sJ d«       ‚t        | j                  dd «      }t        |«      }||k(  r| S | j                  }| j                  }t        |||||t        «      }	t        j                  j                  |	«      }
t        | |
||t        «      }|S )z5 Standalone function (computes matrix on each call). rw   z/Input tensor should be 4D (out_ch, in_ch, h, w)rN   z+New shape should only be hw (height, width)ro   N)r™   rO   r2   r   r   r¶   ÚDTYPE_INTERMEDIATEr8   r�   rž   r¿   )r¡   rr   rs   rt   r7   Úold_size_tupler¸   r   r¥   r£   r·   r¾   s               r/   r>   r>   7  sÌ   € ô ˆ{× Ñ Ó! QÒ&ÐYÐ(YÓYÐ&Üˆx‹=˜AÒÐLÐLÓLÐä&+¨K×,=Ñ,=¸b¸cÐ,BÓ&C€NÜ&+¨H£o€Nà˜Ò'ØÐà×Ñ€FØ×"Ñ"€Jä'Ø˜¨°yÀ&ÔJ\ó€Jô —,‘,×#Ñ# JÓ/€KÜ-Ø�[ .°*Ô>PóÐð !Ð r0   c            	       óä   ‡ — e Zd ZdZ	 	 ddeeef   dedefˆ fd„Ze	fdeeef   de
j                  de
j                  d	e
j                  fd
„Zde
j                  dee   d	e
j                  fd„Zˆ xZS )Ú PatchEmbedResamplerFixedOrigSizez…
    Resample patch embedding weights from a fixed original size,
    caching the pseudoinverse matrix based on the target size.
    Ú	orig_sizers   rt   c                 ó¤   •— t         ‰| �  «        t        |t        «      rt	        |«      dk(  sJ d«       ‚|| _        || _        || _        i | _        y)zû
        Args:
            orig_size (Tuple[int, int]): The expected original (height, width) of input patch_embed tensors.
            interpolation (str): Interpolation mode.
            antialias (bool): Use anti-aliasing filter in resize.
        rN   z.`orig_size` must be a tuple of (height, width)N)	r"   r#   Ú
isinstancer2   r™   rÅ   rs   rt   Ú_pinv_cache_map)r,   rÅ   rs   rt   r.   s       €r/   r#   z)PatchEmbedResamplerFixedOrigSize.__init__Z  sS   ø€ ô 	‰ÑÔÜ˜)¤UÔ+´°I³À!Ò0Cð 	=Ø<ó	=ÐCà"ˆŒØ*ˆÔØ"ˆŒà;=ˆÕr0   rr   r   r   rB   c                 óÜ  — |}| j                   j                  |«      }|r8t        | |«      r,t        | |«      }|j                  |k(  r|j
                  |k(  r|S t        | j                  || j                  | j                  ||«      }t        j                  j                  |«      }d|d   › d|d   › �}t        | |«      rt        | |«       | j                  ||«       || j                   |<   |S )zRRetrieves the cached pinv matrix or computes and caches it for the given new_size.Úpinv_r   rS   r
   )rÈ   ÚgetÚhasattrÚgetattrr   r   r¶   rÅ   rs   rt   r8   r�   rž   ÚdelattrÚregister_buffer)r,   rr   r   r   Ú	cache_keyÚbuffer_namer·   r£   s           r/   Ú_get_or_create_pinv_matrixz;PatchEmbedResamplerFixedOrigSize._get_or_create_pinv_matrixo  sì   € ð ˆ	Ø×*Ñ*×.Ñ.¨yÓ9ˆáœ7 4¨Ô5Ü! $¨Ó4ˆKØ×!Ñ! VÒ+°×0AÑ0AÀUÒ0JØ#Ð#ô ,Ø�N‰N˜H d×&8Ñ&8¸$¿.¹.È&ÐRWó
ˆ
ô —l‘l×'Ñ'¨
Ó3ˆð ˜h q™k˜]¨!¨H°Q©K¨=Ð9ˆÜ�4˜Ô%Ü�T˜;Ô'Ø×Ñ˜[¨+Ô6Ø*5ˆ×Ñ˜YÑ'àÐr0   r¡   c                 ó~  — t        |j                  «      dk(  sJ ‚t        |«      dk(  sJ ‚t        |j                  dd «      }|| j                  k(  sJ d|› d| j                  › �«       ‚t        |«      }| j                  |k(  r|S |j                  }|j
                  }| j                  ||«      }t        ||||«      }|S )a   Resamples the patch embedding weights to new_size.

        Args:
            patch_embed (torch.Tensor): Original weights (out_ch, in_ch, H_orig, W_orig).
            new_size (List[int]): Target [height, width].

        Returns:
            torch.Tensor: Resampled weights.
        rw   rN   ro   NzInput patch_embed spatial size z0 does not match module's expected original size )r™   rO   r2   rÅ   r   r   rÒ   r¿   )	r,   r¡   rr   Ú
input_sizer¸   r   r¥   r·   r¾   s	            r/   rZ   z(PatchEmbedResamplerFixedOrigSize.forward�  sâ   € ô �;×$Ñ$Ó%¨Ò*Ð*Ð*Ü�8‹} Ò!Ð!Ð!ô ˜;×,Ñ,¨R¨SÐ1Ó2ˆ
Ø˜TŸ^™^Ò+ð 	@Ø-¨j¨\ð :/Ø/3¯~©~Ð.>ð@ó	@Ð+ô +0°«/ˆð �>‰>˜^Ò+ØÐà×#Ñ#ˆØ ×&Ñ&ˆ
ð ×5Ñ5°nÀfÓMˆô !2°+¸{ÈNÐ\fÓ gÐà$Ð$r0   )ÚbicubicT)r_   r`   ra   rb   r   rg   rh   rf   r#   rÁ   r8   r   r   rq   rÒ   r   rZ   ri   rj   s   @r/   rÄ   rÄ   U  s£   ø„ ñð "+Ø"ñ	>à˜S #˜X‘ð>ð ð>ð õ	>ð2 "4ñ	à˜C ˜H‘oðð —L‘Lðð —;‘;ð	ð
 
�‰óð<"% 5§<¡<ð "%¸4À¹9ð "%ÈÏÉ÷ "%r0   rÄ   c                   ól  ‡ — e Zd ZdZ	 	 	 	 	 ddeeef   dededededefˆ fd„Zd	e	j                  d
eeef   de	j                  fd„Zd	e	j                  d
eeef   de	j                  fd„Z	 	 	 dde	j                  de	j                  dee	j                     deeeef      dede	j                  fd„Zˆ xZS )ÚPatchEmbedInterpolatoraÍ  Dynamically interpolates patch embedding weights for variable patch sizes.

    This module wraps patch embedding weight resampling functionality to support
    on-the-fly patch size variation during training. It handles both Conv2d and
    Linear patch embeddings.

    Args:
        base_patch_size: The original patch size the model was initialized with
        in_chans: Number of input channels
        embed_dim: Embedding dimension
        interpolation: Interpolation mode for resampling
        antialias: Whether to use antialiasing during interpolation
        channels_last: Per-patch flat layout of the linear weight / patches:
            True -> (ph, pw, C) [NaFlex default], False -> (C, ph, pw).
    Úbase_patch_sizer   r   rs   rt   Úchannels_lastc                 óv   •— t         ‰| �  «        || _        || _        || _        || _        || _        || _        y rD   )r"   r#   rØ   r   r   rs   rt   rÙ   )r,   rØ   r   r   rs   rt   rÙ   r.   s          €r/   r#   zPatchEmbedInterpolator.__init__Ã  s=   ø€ ô 	‰ÑÔØ.ˆÔØ ˆŒØ"ˆŒØ*ˆÔØ"ˆŒØ*ˆÕr0   r<   Útarget_patch_sizerB   c                 óø  — || j                   k(  r|S |j                  d   }| j                   \  }}|\  }}| j                  r1|j                  |||| j                  «      j                  dddd«      }n|j                  || j                  ||«      }t        |||g| j                  | j                  d¬«      }	| j                  r&|	j                  dddd«      j                  |d«      }
|
S |	j                  |d«      }
|
S )a/  Resample linear patch embedding weights for a new patch size.

        Args:
            weight: Linear weight tensor of shape [embed_dim, patch_h * patch_w * in_chans]
            target_patch_size: Target (patch_h, patch_w) to resample to

        Returns:
            Resampled weight tensor
        r   r]   r
   rN   F©rr   rs   rt   r7   rƒ   )	rØ   rO   rÙ   r‰   r   r«   r>   rs   rt   )r,   r<   rÛ   r   Úbase_phÚbase_pwÚ	target_phÚ	target_pwÚweight_convÚweight_conv_resampledÚweight_resampleds              r/   Úresample_linear_weightz-PatchEmbedInterpolator.resample_linear_weightÔ  s  € ð  × 4Ñ 4Ò4ØˆMà—L‘L ‘Oˆ	Ø×/Ñ/Ñˆ�Ø0Ñˆ	�9ð ×ÒØ Ÿ.™.¨°G¸WÀdÇmÁmÓT×\Ñ\Ð]^Ð`aÐcdÐfgÓh‰Kà Ÿ.™.¨°D·M±MÀ7ÈGÓTˆKô !5ØØ Ð+Ø×,Ñ,Ø—n‘nØô!
Ðð ×ÒØ4×<Ñ<¸QÀÀ1ÀaÓH×PÑPÐQZÐ\^Ó_Ðð  Ðð  5×<Ñ<¸YÈÓKÐàÐr0   c                 ó‚   — || j                   k(  r|S t        |t        |«      | j                  | j                  d¬«      }|S )a-  Resample conv2d patch embedding weights for a new patch size.

        Args:
            weight: Conv2d weight tensor of shape [embed_dim, in_chans, patch_h, patch_w]
            target_patch_size: Target (patch_h, patch_w) to resample to

        Returns:
            Resampled weight tensor
        FrÝ   )rØ   r>   Úlistrs   rt   )r,   r<   rÛ   rä   s       r/   Úresample_conv_weightz+PatchEmbedInterpolator.resample_conv_weight  sK   € ð  × 4Ñ 4Ò4ØˆMô 0ØÜÐ+Ó,Ø×,Ñ,Ø—n‘nØô
Ðð  Ðr0   ÚpatchesÚproj_weightÚ	proj_biasr   Ú	is_linearc                 ó  — |€| j                   }|rò|| j                   k7  rz|j                  dk(  sJ d«       ‚|j                  dd \  }}| j                  ||«      }|j	                  ||d«      }	t
        j                  j                  j                  |	||«      }
|
S |j                  dk(  r-|j	                  |j                  d   |j                  d   d«      }t
        j                  j                  j                  |||«      }
|
S || j                   k7  rB| j                  ||«      }t
        j                  j                  j                  ||||d¬«      }
|
S t
        j                  j                  j                  ||||d¬«      }
|
S )	aW  Apply patch embedding with dynamic weight resampling.

        Args:
            patches: Input patches
                - For linear mode with resampling: [B, N, Ph, Pw, C]
                - For linear mode without resampling: [B, N, Ph*Pw*C]
                - For conv mode: [B, C, H, W]
            proj_weight: Original projection weight
            proj_bias: Optional projection bias
            patch_size: Current patch size (if None, uses base_patch_size)
            is_linear: Whether using linear (True) or conv2d (False) projection

        Returns:
            Embedded patches
        Né   zKPatches must be 5-D ([B, N, Ph, Pw, C] or [B, N, C, Ph, Pw]) for resamplingrN   rƒ   r   r
   )r!   Úpadding)rØ   ÚndimrO   rå   r‰   r8   r	   Ú
functionalÚlinearrè   Úconv2d)r,   ré   rê   rë   r   rì   rT   ÚNrä   Úpatches_flatÚoutputs              r/   rZ   zPatchEmbedInterpolator.forward  sŒ  € ð. ÐØ×-Ñ-ˆJáØ˜T×1Ñ1Ò1ð —|‘| qÒ(ð bØaóbÐ(à—}‘} R aÐ(‘��1ð $(×#>Ñ#>¸{ÈJÓ#WÐ ð  'Ÿ™¨q°!°RÓ8�ÜŸ™×,Ñ,×3Ñ3°LÐBRÐT]Ó^�ð( ˆð# —<‘< 1Ò$Ø%Ÿo™o¨g¯m©m¸AÑ.>ÀÇÁÈaÑ@PÐRTÓU�GÜŸ™×,Ñ,×3Ñ3°G¸[È)ÓT�ð ˆð ˜T×1Ñ1Ò1Ø#'×#<Ñ#<¸[È*Ó#UÐ ÜŸ™×,Ñ,×3Ñ3ØÐ-¨yØ%¨qð 4ó �ð ˆô Ÿ™×,Ñ,×3Ñ3Ø˜[¨)Ø%¨qð 4ó �ð
 ˆr0   )r]   r^   rÕ   TT)NNT)r_   r`   ra   rb   r   rg   rh   rf   r#   r8   rq   rå   rè   r   rZ   ri   rj   s   @r/   r×   r×   ²  s0  ø„ ñð& Ø Ø!*Ø"Ø"&ñ+à" 3¨ 8™_ð+ð ð+ð ð	+ð
 ð+ð ð+ð  õ+ð"+ à—L‘Lð+ ð  % S¨# X™ð+ ð 
�‰ó	+ ðZ à—L‘Lð ð  % S¨# X™ð ð 
�‰ó	 ð@ 15Ø48Ø"ñ<à—\‘\ð<ð Ÿ™ð<ð   §¡Ñ-ð	<ð
 !  s¨C x¡Ñ1ð<ð ð<ð 
�‰÷<r0   r×   )rÕ   TF)*rb   ÚloggingrI   Útypingr   r   r   r   r   r   r8   r	   Útorch.nn.functionalrñ   rP   Úformatr   r   Úhelpersr   Útrace_utilsr   Ú	getLoggerr_   rš   ÚModuler   rl   rg   rh   rf   r¦   Úfloat32rÁ   r   r   rq   r¶   r¿   r>   rÄ   r×   © r0   r/   ú<module>r     sÝ  ðñ	ó Û ß ?× ?ã Ý ß Ð ç #Ý Ý  à
ˆ'×
Ñ
˜HÓ
%€ôt�—‘ô tôn,˜ô ,ðf 'ØØñCà�s‘)ðCð ðCð ð	Cð
 óCðL —]‘]Ð ð 0ñØ˜˜S˜‘/ðà˜˜S˜‘/ðð ðð ð	ð
 —‘ðð �{‰{ðð ‡\�\óð@ +=ñ!Ø—\‘\ð!à—\‘\ð!ð ˜c 3˜h™ð!ð —K‘Kð	!ð
 "ŸK™Kð!ð ‡\�\ó!ð* 'ØØñ!Ø—\‘\ð!à�s‘)ð!ð ð!ð ð	!ð
 ó!ô<Z% r§y¡yô Z%ôzg˜RŸY™Yõ gr0   