+
    UV-jA  ã                   óv  € R t ^ RIt^ RIHtHtHt ^ RIHt ^ RI	H
t
 ^RIHt ^RIHtHt  ! R R]
P                   4      t ! R R]
P                   4      t ! R	 R
]
P                   4      t ! R R]
P                   4      t ! R R]
P                   4      t ! R R]
P                   4      tR R ltR R lt ! R R]
P                   4      t ! R R]
P                   4      t ! R R]
P                   4      t ! R R]
P                   4      t ! R R]
P                   4      t ! R R ]
P                   4      tR! R" ltR# )#z4DINOv2 backbone and MultiScaleProjector for RF-DETR.N)ÚDictÚListÚTuple)Úbicubic_interpolate)ÚDINOv2ConfigÚProjectorConfigc                   ób   a a€ ] tR t^t oV3R lV 3R lltV3R lR ltV3R lR ltRtVtV ;t	# )ÚDINOv2Embeddingsc                ó    <€ V ^8„  d   QhRS[ /# ©é   Úconfig©r   )ÚformatÚ__classdict__s   "€Úm/Volumes/fast/ai/experiments/ui-tars-smoke/.venv/lib/python3.14/site-packages/mlx_vlm/models/rfdetr/vision.pyÚ__annotate__ÚDINOv2Embeddings.__annotate__   s   ø€ ÷ 8ñ 8™|ñ 8ó    c                óz  <€ \         SV `  4        Wn        ^V n        \        P
                  ! ^^VP                  34      V n        VP                  ;'       g    VP                  VP                  ,          p\        P
                  ! ^^W",          ,           VP                  34      V n        \        V4      V n        R# )é   N)ÚsuperÚ__init__r   Únum_windowsÚmxÚzerosÚhidden_sizeÚ	cls_tokenÚpositional_encoding_sizeÚ
image_sizeÚ
patch_sizeÚposition_embeddingsÚPatchEmbeddingsÚpatch_embeddings)Úselfr   Úpe_gridÚ	__class__s   && €r   r   ÚDINOv2Embeddings.__init__   sž   ø€ Ü‰ÑÔØŒØˆÔÜŸš 1 a¨×);Ñ);Ð"<Ó=ˆŒà×1Ñ1÷ 
ð 
Ø×Ñ ×!2Ñ!2Õ2ð 	ô $&§8¢8Ø��GÕ%Õ% v×'9Ñ'9Ð:ó$
ˆÔ ô !0°Ó 7ˆÖr   c                óZ   <€ V ^8„  d   QhRS[ P                  RS[RS[RS[ P                  /# )r   ÚxÚhÚwÚreturn©r   ÚarrayÚint)r   r   s   "€r   r   r      s1   ø€ ÷ <ñ <©"¯(©(ð <±sð <¹sð <ÁrÇxÁxñ <r   c                óx  € VP                   ^,          ^,
          pV P                  pVP                   ^,          ^,
          pWF8X  d   V# VR,          pVR,          pVP                   R,          p	\        \        P                  ! V4      4      ;r«W P
                  P                  ,          pW0P
                  P                  ,          pVP                  ^W«V	4      pVP                  ^ ^^^4      p\        WŒV3RR7      pVP                  ^ ^^^4      pVP                  ^RV	4      p\        P                  ! Wx.^R7      # )z>Interpolate position embeddings for variable input resolution.T)ÚsizeÚ	antialias©Úaxis©ºNNN:Né   Nr6   ©r6   :r7   NNr6   éÿÿÿÿ)Úshaper!   r/   ÚmathÚsqrtr   r    ÚreshapeÚ	transposer   r   Úconcatenate)r$   r)   r*   r+   Únum_patchesÚ	pos_embedÚnum_positionsÚcls_posÚ	patch_posÚdimÚorig_hÚorig_wÚnew_hÚnew_ws   &&&&          r   Úinterpolate_pos_encodingÚ)DINOv2Embeddings.interpolate_pos_encoding   s  € à—g‘g˜a•j 1•nˆØ×,Ñ,ˆ	Ø!Ÿ™¨Õ*¨QÕ.ˆàÔ'ØÐà˜HÕ%ˆØ˜hÕ'ˆ	à�o‰o˜bÕ!ˆÜœdŸiši¨Ó6Ó7Ð7ˆØ—[‘[×+Ñ+Õ+ˆØ—[‘[×+Ñ+Õ+ˆð ×%Ñ% a¨¸Ó=ˆ	Ø×'Ñ'¨¨1¨a°Ó3ˆ	ô (¨	À¸ÐRVÔWˆ	ð ×'Ñ'¨¨1¨a°Ó3ˆ	Ø×%Ñ% a¨¨SÓ1ˆ	Ü�~Š~˜wÐ2¸Ô;Ð;r   c                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# ©r   r)   r,   ©r   r.   )r   r   s   "€r   r   r   ;   s#   ø€ ÷ ñ ™"Ÿ(™(ð ¡r§x¡xñ r   c                ó`  € VP                   w  r#rEV P                  pV P                  P                  pW0P                  P                  ,          pW@P                  P                  ,          p	V P                  V4      p\        P                  ! V P                  V^V34      p
\        P                  ! W¡.^R7      pWP                  WV4      ,           pV^8”  dX   VR,          pVR,          p\        WÈW–4      p\        P                  ! W¶V,          ^^34      p\        P                  ! WÜ.^R7      pV# )r7   r3   r5   r8   )r:   r   r   r   r    r#   r   Úbroadcast_tor   r?   rJ   Ú_window_partitionÚtile)r$   r)   ÚBÚHÚWÚCÚnwÚDÚpatch_hÚpatch_wÚ
cls_tokensÚcls_with_posÚpatchesÚcls_windoweds   &&            r   Ú__call__ÚDINOv2Embeddings.__call__;   s   € Ø—W‘W‰
ˆˆaØ×ÑˆØ�K‰K×#Ñ#ˆØ—{‘{×-Ñ-Õ-ˆØ—{‘{×-Ñ-Õ-ˆð ×!Ñ! !Ó$ˆä—_’_ T§^¡^°a¸¸A°YÓ?ˆ
Ü�NŠN˜J˜?°Ô3ˆà×-Ñ-¨a°AÓ6Õ6ˆð �Œ6Ø˜X�;ˆLØ˜•kˆGô (Ø 'óˆGô
 Ÿ7š7 <°rµ'¸1¸a°ÓAˆLô —’ Ð6¸QÔ?ˆAàˆr   )r   r   r   r#   r!   )
Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   rJ   r_   Ú__static_attributes__Ú__classdictcell__Ú__classcell__©r&   r   s   @@r   r	   r	      s(   ù‡ € ÷8ó 8÷<ð <÷:÷ ð r   r	   c                   óP   a a€ ] tR t^]t oV3R lV 3R lltV3R lR ltRtVtV ;t# )r"   c                ó    <€ V ^8„  d   QhRS[ /# r   r   )r   r   s   "€r   r   ÚPatchEmbeddings.__annotate__^   s   ø€ ÷ 
ñ 
™|ñ 
r   c                ó²   <€ \         SV `  4        \        P                  ! VP                  VP
                  VP                  VP                  R 7      V n        R# ))Úin_channelsÚout_channelsÚkernel_sizeÚstrideN)r   r   ÚnnÚConv2dÚnum_channelsr   r    Ú
projection©r$   r   r&   s   &&€r   r   ÚPatchEmbeddings.__init__^   sB   ø€ Ü‰ÑÔÜŸ)š)Ø×+Ñ+Ø×+Ñ+Ø×)Ñ)Ø×$Ñ$ô	
ˆŽr   c                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# rM   rN   )r   r   s   "€r   r   rk   g   s#   ø€ ÷ ñ ™"Ÿ(™(ð ¡r§x¡xñ r   c                óx   € V P                  V4      pVP                  w  r#rEVP                  W#V,          V4      pV# ©N)rt   r:   r=   )r$   r)   rS   rT   rU   rX   s   &&    r   r_   ÚPatchEmbeddings.__call__g   s6   € à�O‰O˜AÓˆØ—W‘W‰
ˆˆaØ�I‰I�a˜Q� Ó"ˆØˆr   )rt   ©	ra   rb   rc   rd   r   r_   re   rf   rg   rh   s   @@r   r"   r"   ]   s   ù‡ € ÷
ó 
÷÷ ð r   r"   c                   óP   a a€ ] tR t^ot oV3R lV 3R lltV3R lR ltRtVtV ;t# )ÚDINOv2Attentionc                ó    <€ V ^8„  d   QhRS[ /# r   r   )r   r   s   "€r   r   ÚDINOv2Attention.__annotate__p   s   ø€ ÷ Sñ S™|ñ Sr   c                ó†  <€ \         SV `  4        VP                  V n        VP                  VP                  ,          V n        V P
                  R,          V n        \        P                  ! VP                  VP                  VP                  R7      V n
        \        P                  ! VP                  VP                  VP                  R7      V n        \        P                  ! VP                  VP                  VP                  R7      V n        \        P                  ! VP                  VP                  RR7      V n        R# )g      à?)ÚbiasTNg      à¿)r   r   Únum_attention_headsÚ	num_headsr   Úhead_dimÚscalerq   ÚLinearÚqkv_biasÚq_projÚk_projÚv_projÚo_projru   s   &&€r   r   ÚDINOv2Attention.__init__p   sÞ   ø€ Ü‰ÑÔØ×3Ñ3ˆŒØ×*Ñ*¨f×.HÑ.HÕHˆŒØ—]‘] DÕ(ˆŒ
ä—i’iØ×Ñ × 2Ñ 2¸¿¹ô
ˆŒô —i’iØ×Ñ × 2Ñ 2¸¿¹ô
ˆŒô —i’iØ×Ñ × 2Ñ 2¸¿¹ô
ˆŒô —i’i × 2Ñ 2°F×4FÑ4FÈTÔRˆŽr   c                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# rM   rN   )r   r   s   "€r   r   r   �   s#   ø€ ÷ ñ ™"Ÿ(™(ð ¡r§x¡xñ r   c                óÌ  € VP                   w  r#pV P                  V4      P                  W#V P                  V P                  4      P                  ^ ^^^4      pV P                  V4      P                  W#V P                  V P                  4      P                  ^ ^^^4      pV P                  V4      P                  W#V P                  V P                  4      P                  ^ ^^^4      pWVP                  ^ ^^^4      ,          V P                  ,          p\        P                  ! VRR7      pW‡,          P                  ^ ^^^4      P                  W#V4      pV P                  V4      # )é    r3   r9   )r:   rˆ   r=   rƒ   r„   r>   r‰   rŠ   r…   r   Úsoftmaxr‹   )	r$   r)   rS   ÚNrX   ÚqÚkÚvÚattns	   &&       r   r_   ÚDINOv2Attention.__call__�   s  € Ø—'‘'‰ˆˆaà�K‰K˜‹Nß‰W�Q˜4Ÿ>™>¨4¯=©=Ó9ß‰Y�q˜!˜Q Ó"ð 	
ð �K‰K˜‹Nß‰W�Q˜4Ÿ>™>¨4¯=©=Ó9ß‰Y�q˜!˜Q Ó"ð 	
ð �K‰K˜‹Nß‰W�Q˜4Ÿ>™>¨4¯=©=Ó9ß‰Y�q˜!˜Q Ó"ð 	
ð —K‘K  1 a¨Ó+Õ+¨t¯z©zÕ9ˆÜ�zŠz˜$ RÔ(ˆØ�X× Ñ   A q¨!Ó,×4Ñ4°Q¸1Ó=ˆØ�{‰{˜1‹~Ðr   )r„   r‰   rƒ   r‹   rˆ   r…   rŠ   r{   rh   s   @@r   r}   r}   o   s    ù‡ € ÷Só S÷"÷ ð r   r}   c                   óP   a a€ ] tR t^™t oV3R lV 3R lltV3R lR ltRtVtV ;t# )Ú	DINOv2MLPc                ó    <€ V ^8„  d   QhRS[ /# r   r   )r   r   s   "€r   r   ÚDINOv2MLP.__annotate__š   s   ø€ ÷ Kñ K™|ñ Kr   c                óä   <€ \         SV `  4        \        P                  ! VP                  VP
                  4      V n        \        P                  ! VP
                  VP                  4      V n        R # ry   )r   r   rq   r†   r   Úintermediate_sizeÚfc1Úfc2ru   s   &&€r   r   ÚDINOv2MLP.__init__š   sJ   ø€ Ü‰ÑÔÜ—9’9˜V×/Ñ/°×1IÑ1IÓJˆŒÜ—9’9˜V×5Ñ5°v×7IÑ7IÓJˆŽr   c                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# rM   rN   )r   r   s   "€r   r   rš   Ÿ   s#   ø€ ÷ .ñ .™"Ÿ(™(ð .¡r§x¡xñ .r   c                ój   € V P                  \        P                  ! V P                  V4      4      4      # ry   )rž   rq   Úgelur�   ©r$   r)   s   &&r   r_   ÚDINOv2MLP.__call__Ÿ   s"   € Ø�x‰xœŸš §¡¨£Ó,Ó-Ð-r   )r�   rž   r{   rh   s   @@r   r˜   r˜   ™   s    ù‡ € ÷Kó K÷
.÷ .ð .r   r˜   c                   óP   a a€ ] tR t^£t oV3R lV 3R lltV3R lR ltRtVtV ;t# )ÚDINOv2Layerc                ó    <€ V ^8„  d   QhRS[ /# r   r   )r   r   s   "€r   r   ÚDINOv2Layer.__annotate__¤   s   ø€ ÷ ;ñ ;™|ñ ;r   c                óÀ  <€ \         SV `  4        \        V4      V n        \	        V4      V n        \        P                  ! VP                  VP                  R 7      V n
        \        P                  ! VP                  VP                  R 7      V n        \        P                  ! VP                  34      V n        \        P                  ! VP                  34      V n        R# )©ÚepsN)r   r   r}   Ú	attentionr˜   Úmlprq   Ú	LayerNormr   Úlayer_norm_epsÚnorm1Únorm2r   ÚonesÚlayer_scale1Úlayer_scale2ru   s   &&€r   r   ÚDINOv2Layer.__init__¤   s–   ø€ Ü‰ÑÔÜ(¨Ó0ˆŒÜ˜VÓ$ˆŒÜ—\’\ &×"4Ñ"4¸&×:OÑ:OÔPˆŒ
Ü—\’\ &×"4Ñ"4¸&×:OÑ:OÔPˆŒ
äŸGšG V×%7Ñ%7Ð$9Ó:ˆÔÜŸGšG V×%7Ñ%7Ð$9Ó:ˆÖr   c                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# rM   rN   )r   r   s   "€r   r   r¨   ®   s#   ø€ ÷ ñ ™"Ÿ(™(ð ¡r§x¡xñ r   c                óú   € TpV P                  V4      pV P                  V4      pW P                  V,          ,           pTpV P                  V4      pV P	                  V4      pW P
                  V,          ,           pV# ry   )r°   r¬   r³   r±   r­   r´   )r$   r)   Úresiduals   && r   r_   ÚDINOv2Layer.__call__®   sn   € àˆØ�J‰J�q‹MˆØ�N‰N˜1ÓˆØ×(Ñ(¨1Õ,Õ,ˆð ˆØ�J‰J�q‹MˆØ�H‰H�Q‹KˆØ×(Ñ(¨1Õ,Õ,ˆØˆr   )r¬   r³   r´   r­   r°   r±   r{   rh   s   @@r   r¦   r¦   £   s   ù‡ € ÷;ó ;÷÷ ð r   r¦   c                   óP   a a€ ] tR t^½t oV3R lV 3R lltV3R lR ltRtVtV ;t# )ÚDINOv2Encoderc                ó    <€ V ^8„  d   QhRS[ /# r   r   )r   r   s   "€r   r   ÚDINOv2Encoder.__annotate__¾   s   ø€ ÷ Uñ U™|ñ Ur   c                ó”   <€ \         SV `  4        \        VP                  4       Uu. uF  p\	        V4      NK  	  upV n        R # u upi ry   )r   r   ÚrangeÚnum_hidden_layersr¦   Úlayers)r$   r   Ú_r&   s   && €r   r   ÚDINOv2Encoder.__init__¾   s9   ø€ Ü‰ÑÔÜ49¸&×:RÑ:RÔ4SÓTÑ4S¨q”{ 6Ö*Ñ4SÑTˆŽùÒTs   §Ac          	      óž   <€ V ^8„  d   QhRS[ P                  RS[S[,          RS[S[ P                  S[S[ P                  ,          3,          /# )r   r)   Úoutput_indicesr,   )r   r.   r   r/   r   )r   r   s   "€r   r   r½   Â   sC   ø€ ÷ ñ Ù—‘ðÙ+/±­9ðá	‰r�x‰x™™bŸh™h�Ð'Õ	(ñr   c                óŠ   € . p\        V P                  4       F&  w  rEV! V4      pWB9   g   K  VP                  V4       K(  	  W3# ry   )Ú	enumeraterÁ   Úappend)r$   r)   rÅ   ÚfeaturesÚiÚlayers   &&&   r   r_   ÚDINOv2Encoder.__call__Â   sC   € ð ˆÜ! $§+¡+Ö.‰HˆAÙ�a“ˆAØÖ"Ø—‘ Ö"ñ /ð ˆ{Ðr   )rÁ   r{   rh   s   @@r   r»   r»   ½   s    ù‡ € ÷Uó U÷÷ ð r   r»   c          
      ó|   € V ^8„  d   QhR\         P                  R\        R\        R\        R\         P                  /# )r   r)   rY   rZ   r   r,   r-   )r   s   "r   r   r   Í   s<   € ÷ ñ Ü	‡x�xðÜðÜ(+ðÜ:=ðä‡X�Xñr   c                ó  € V P                   w  rEpW,          pW#,          pV P                  WAW&4      p V P                  WCWsW†4      p V P                  ^ ^^^^^4      p V P                  WC,          V,          Wx,          V4      p V # )zåPartition spatial tokens into windows.

Args:
    x: (B, H*W, D) patch tokens (no cls)
    patch_h, patch_w: spatial dimensions
    num_windows: number of windows per side
Returns:
    (B * num_windows^2, window_h * window_w, D)
©r:   r=   r>   )	r)   rY   rZ   r   rS   r‘   rX   ÚwhÚwws	   &&&&     r   rQ   rQ   Í   s{   € ð �g‰g�G€Aˆ!Ø	Õ	€BØ	Õ	€Bà	�	‰	�!˜gÓ)€AØ	�	‰	�! "°2Ó9€AØ	�‰�A�q˜!˜Q  1Ó%€AØ	�	‰	�!•/ KÕ/°µ¸!Ó<€AØ€Hr   c                óˆ   € V ^8„  d   QhR\         P                  R\        R\        R\        R\        R\         P                  /# )r   r)   rS   rY   rZ   r   r,   r-   )r   s   "r   r   r   ä   sD   € ÷ ñ Ü	‡x�xðÜðÜ"%ðÜ03ðÜBEðä‡X�Xñr   c                óÔ   € W$,          pW4,          pV P                   R,          pTpV P                  WW…Wg4      p V P                  ^ ^^^^^4      p V P                  WV,          V4      p V # )a  Unpartition windows back to full spatial sequence.

Args:
    x: (B * num_windows^2, window_h * window_w, D)
    B: original batch size
    patch_h, patch_w: spatial dimensions
    num_windows: number of windows per side
Returns:
    (B, H*W, D) patch tokens
r9   rÏ   )	r)   rS   rY   rZ   r   rÐ   rÑ   rX   rW   s	   &&&&&    r   Ú_window_unpartitionrÔ   ä   sj   € ð 
Õ	€BØ	Õ	€BØ	�‰��€AØ	€Bà	�	‰	�!˜ Ó'€AØ	�‰�A�q˜!˜Q  1Ó%€AØ	�	‰	�!˜wÕ&¨Ó*€AØ€Hr   c                   óP   a a€ ] tR t^üt oV3R lV 3R lltV3R lR ltRtVtV ;t# )ÚDINOv2Backbonec                ó    <€ V ^8„  d   QhRS[ /# r   r   )r   r   s   "€r   r   ÚDINOv2Backbone.__annotate__ý   s   ø€ ÷ Uñ U™|ñ Ur   c                ó�  <a€ \         SV `  4        SV n        ^V n        SP                  e   \        SP                  4      V n        M-\        V3R l\        SP                  4       4       4      V n        \        S4      V n	        \        S4      V n        \        P                  ! SP                  SP                  R7      V n        R# )r   Nc              3   óN   <"  € T F  pVSP                   9  g   K  Vx € K  	  R # 5iry   )Úout_feature_indexes)Ú.0rÊ   r   s   & €r   Ú	<genexpr>Ú*DINOv2Backbone.__init__.<locals>.<genexpr>  s(   øé € ð ,á8�AØ˜F×6Ñ6Ñ6÷ ’Û8ùs   ƒ%›
%rª   )r   r   r   r   Úwindow_block_indexesÚsetr¿   rÀ   r	   Ú
embeddingsr»   Úencoderrq   r®   r   r¯   Ú	layernormru   s   &f€r   r   ÚDINOv2Backbone.__init__ý   s™   ù€ Ü‰ÑÔØˆŒØˆÔà×&Ñ&Ò2Ü(+¨F×,GÑ,GÓ(HˆDÕ%ä(+ô ,ä˜v×7Ñ7Ô8ó,ó )ˆDÔ%ô
 +¨6Ó2ˆŒÜ$ VÓ,ˆŒÜŸš f×&8Ñ&8¸f×>SÑ>SÔTˆŽr   c                ó^   <€ V ^8„  d   QhRS[ P                  RS[S[ P                  ,          /# rM   )r   r.   r   )r   r   s   "€r   r   rØ     s'   ø€ ÷ -ñ -™"Ÿ(™(ð -¡t©B¯H©H¥~ñ -r   c                óÐ  € VP                   w  r#rEW0P                  P                  ,          pW@P                  P                  ,          pV P                  pWˆ,          p	V P	                  V4      p
. p\        V P                  P                  4       FÔ  w  rÍWÀP                  9  pV'       d*   V
P                   w  pppV
P                  W)V,          V4      p
V! V
4      p
V'       d   V
P                  W),          XX4      p
WÀP                  P                  9   g   K‰  V P                  V
4      pVR,          p\        VW&Wx4      pVP                  W&VR4      pVP                  V4       KÖ  	  V# )zw
Args:
    x: (B, H, W, C) channel-last image
Returns:
    List of feature maps at specified layers, each (B, h, w, D)
r8   r9   )r:   r   r    r   rá   rÇ   râ   rÁ   rß   r=   rÛ   rã   rÔ   rÈ   )r$   r)   rS   rT   rU   rV   rY   rZ   rW   Únw2ÚhiddenrÉ   rÊ   rË   Ú	is_globalÚBwÚTrX   Únormedr]   Úfeats   &&                   r   r_   ÚDINOv2Backbone.__call__  s1  € ð —W‘W‰
ˆˆaØ—{‘{×-Ñ-Õ-ˆØ—{‘{×-Ñ-Õ-ˆØ×ÑˆØ�gˆð —‘ Ó#ˆð ˆÜ! $§,¡,×"5Ñ"5Ö6‰HˆAØ×!:Ñ!:Ñ:ˆIçð "Ÿ<™<‘��A�qØŸ™¨°­7°AÓ6�ñ ˜6“]ˆFçàŸ™¨­°°AÓ6�à—K‘K×3Ñ3Ö3àŸ™¨Ó/�à  Õ*�Ü-Ø˜Q¨ó�ð —‘ q°7¸BÓ?�Ø—‘ Ö%ñ3 7ð6 ˆr   )r   rá   râ   rã   r   rß   r{   rh   s   @@r   rÖ   rÖ   ü   s    ù‡ € ÷Uó U÷"-÷ -ð -r   rÖ   c                   óX   a a€ ] tR tRt oRtRV3R lV 3R llltV3R lR ltRtVtV ;t	# )	ÚConvBNiA  zRConv2d + LayerNorm (weights stored as 'bn' in checkpoint despite being LayerNorm).c          
      ó8   <€ V ^8„  d   QhRS[ RS[ RS[ RS[ RS[ /# )r   rm   rn   ro   rp   Úpadding©r/   )r   r   s   "€r   r   ÚConvBN.__annotate__D  s=   ø€ ÷ -ñ -áð-ñ ð-ñ ð	-ñ
 ð-ñ ñ-r   c           	     óœ   <€ \         SV `  4        \        P                  ! VVVVVR R7      V n        \        P
                  ! V4      V n        R# )F)rp   rò   r�   N)r   r   rq   rr   Úconvr®   Úbn)r$   rm   rn   ro   rp   rò   r&   s   &&&&&&€r   r   ÚConvBN.__init__D  sD   ø€ ô 	‰ÑÔÜ—I’IØØØØØØô
ˆŒ	ô —,’,˜|Ó,ˆŽr   c                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# rM   rN   )r   r   s   "€r   r   rô   W  s#   ø€ ÷ ñ ™"Ÿ(™(ð ¡r§x¡xñ r   c                ór   € V P                  V4      pV P                  V4      p\        P                  ! V4      # ry   )rö   r÷   rq   Úsilur£   s   &&r   r_   ÚConvBN.__call__W  s*   € Ø�I‰I�a‹LˆØ�G‰G�A‹JˆÜ�wŠw�q‹zÐr   )r÷   rö   )r7   r7   r�   ©
ra   rb   rc   rd   Ú__doc__r   r_   re   rf   rg   rh   s   @@r   rð   rð   A  s!   ù‡ € Ù\÷-õ -÷&÷ ð r   rð   c                   óT   a a€ ] tR tRt oRtV3R lV 3R lltV3R lR ltRtVtV ;t	# )Ú
Bottlenecki]  zTBottleneck block with two 3x3 convolutions. No residual (shortcut=False in RF-DETR).c                ó    <€ V ^8„  d   QhRS[ /# )r   Úchannelsró   )r   r   s   "€r   r   ÚBottleneck.__annotate__`  s   ø€ ÷ Hñ H¡ñ Hr   c                óp   <€ \         SV `  4        \        W^^R7      V n        \        W^^R7      V n        R# )é   )ro   rò   N)r   r   rð   Úcv1Úcv2)r$   r  r&   s   &&€r   r   ÚBottleneck.__init__`  s.   ø€ Ü‰ÑÔÜ˜(¸!ÀQÔGˆŒÜ˜(¸!ÀQÔGˆŽr   c                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# rM   rN   )r   r   s   "€r   r   r  e  s#   ø€ ÷ %ñ %™"Ÿ(™(ð %¡r§x¡xñ %r   c                óB   € V P                  V P                  V4      4      # ry   )r  r  r£   s   &&r   r_   ÚBottleneck.__call__e  s   € Ø�x‰x˜Ÿ™ ›Ó$Ð$r   )r  r  rý   rh   s   @@r   r   r   ]  s#   ù‡ € Ù^÷Hó H÷
%÷ %ð %r   r   c                   óX   a a€ ] tR tRt oRtRV3R lV 3R llltV3R lR ltRtVtV ;t	# )	ÚC2fii  zECross Stage Partial bottleneck with 2 convolutions (C2f from YOLOv8).c                ó2   <€ V ^8„  d   QhRS[ RS[ RS[ RS[ /# )r   rm   rn   Únum_bottlenecksÚbottleneck_channelsró   )r   r   s   "€r   r   ÚC2f.__annotate__l  s9   ø€ ÷ Hñ HáðHñ ðHñ ð	Hñ
 !ñHr   c                óæ   <€ \         SV `  4        \        W^R7      V n        \	        V4       Uu. uF  p\        V4      NK  	  upV n        W$V,          ,           p\        Wb^R7      V n        R# u upi )r7   )ro   N)r   r   rð   r  r¿   r   Úmr  )r$   rm   rn   r  r  rÂ   Úconcat_channelsr&   s   &&&&&  €r   r   ÚC2f.__init__l  sb   ø€ ô 	‰ÑÔä˜+ÀÔCˆŒä;@ÀÔ;QÓRÑ;Q°a”*Ð0Ö1Ñ;QÑRˆŒà&¸Õ)NÕNˆÜ˜/ÀQÔGˆŽùò Ss   ¯A.c                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# rM   rN   )r   r   s   "€r   r   r  |  s#   ø€ ÷ ñ ™"Ÿ(™(ð ¡r§x¡xñ r   c                ó@  € V P                  V4      pVP                  R,          ^,          pVRRV13,          pVRVR13,          pV.pTpV P                   F  pV! V4      pVP                  V4       K  	  \        P
                  ! VRR7      pV P                  V4      # )r7   .Nr3   r9   )r  r:   r  rÈ   r   r?   r  )r$   r)   Ú	split_dimÚx1Úx2ÚoutputsÚyÚ
bottlenecks   &&      r   r_   ÚC2f.__call__|  s’   € à�H‰H�Q‹KˆØ—G‘G˜B•K 1Õ$ˆ	Øˆs�J�Y�JˆÕˆØˆs�I‘JˆÕˆà�#ˆØˆØŸ&œ&ˆJÙ˜1“ˆAØ�N‰N˜1Öñ !ô
 �NŠN˜7¨Ô,ˆØ�x‰x˜‹{Ðr   )r  r  r  )r  é€   rý   rh   s   @@r   r  r  i  s#   ù‡ € ÙO÷Hõ H÷ ÷ ð r   r  c                   óT   a a€ ] tR tRt oRtV3R lV 3R lltV3R lR ltRtVtV ;t	# )ÚMultiScaleProjectoriŽ  zFProjects concatenated multi-scale backbone features through C2f block.c                ó    <€ V ^8„  d   QhRS[ /# r   )r   )r   r   s   "€r   r   Ú MultiScaleProjector.__annotate__‘  s   ø€ ÷ 	*ñ 	*™ñ 	*r   c                óä   <€ \         SV `  4        \        VP                  VP                  VP
                  VP                  R 7      p\        P                  ! VP                  4      pW#..V n	        R# ))rm   rn   r  r  N)
r   r   r  rm   Ú
hidden_dimr  r  rq   r®   Ústages)r$   r   Úc2fÚ
final_normr&   s   &&  €r   r   ÚMultiScaleProjector.__init__‘  s_   ø€ Ü‰ÑÔÜØ×*Ñ*Ø×*Ñ*Ø"×2Ñ2Ø &× :Ñ :ô	
ˆô —\’\ &×"3Ñ"3Ó4ˆ
ØÐ(Ð)ˆŽr   c                ó^   <€ V ^8„  d   QhRS[ S[P                  ,          RS[P                  /# )r   rÉ   r,   )r   r   r.   )r   r   s   "€r   r   r#  œ  s'   ø€ ÷ ñ ¡¡b§h¡h¥ð ±B·H±Hñ r   c                ó€   € \         P                  ! VRR7      pV P                  ^ ,          w  r4V! V4      pV! V4      pV# )z{
Args:
    features: list of (B, h, w, D) feature maps from backbone
Returns:
    (B, h, w, hidden_dim) projected features
r3   r9   )r   r?   r&  )r$   rÉ   r)   r'  r(  s   &&   r   r_   ÚMultiScaleProjector.__call__œ  s:   € ô �NŠN˜8¨"Ô-ˆàŸ+™+ a�.‰ˆÙ�‹FˆÙ�q‹MˆØˆr   )r&  rý   rh   s   @@r   r!  r!  Ž  s!   ù‡ € ÙP÷	*ó 	*÷÷ ð r   r!  c                   ó\   a a€ ] tR tRt oRtRV 3R lltR t]V3R lR l4       tRt	Vt
V ;t# )	ÚVisionModeli¯  z,Wrapper for mlx-vlm framework compatibility.c                ó$   <€ \         SV `  4        R # ry   )r   r   ru   s   &&€r   r   ÚVisionModel.__init__²  s   ø€ Ü‰ÑÖr   c                ó   € R # ry   © )r$   ÚargsÚkwargss   &*,r   r_   ÚVisionModel.__call__µ  s   € Ùr   c                óz   <€ V ^8„  d   QhRS[ S[S[P                  3,          RS[ S[S[P                  3,          /# )r   Úweightsr,   )r   Ústrr   r.   )r   r   s   "€r   r   ÚVisionModel.__annotate__¹  s5   ø€ ÷ ñ ™$™s¡B§H¡H˜}Õ-ð ±$±s¹B¿H¹H°}Õ2Eñ r   c                ó   € V # ry   r2  )r7  s   &r   ÚsanitizeÚVisionModel.sanitize¸  s   € àˆr   r2  ry   )ra   rb   rc   rd   rþ   r   r_   Ústaticmethodr;  re   rf   rg   rh   s   @@r   r.  r.  ¯  s+   ù‡ € Ù6÷òð ÷ó ÷ð r   r.  c                óp   € V ^8„  d   QhR\         P                  R\        R\        R\         P                  /# )r   r)   rH   rI   r,   r-   )r   s   "r   r   r   À  s0   € ÷ -ñ -”r—x‘xð -¬ð -´Cð -¼B¿H¹Hñ -r   c                óæ  € V P                   w  r4rVWA8X  d	   WR8X  d   V # \        P                  ! ^ V^,
          V4      p\        P                  ! ^ V^,
          V4      p\        P                  ! VR,          W34      p	\        P                  ! VR,          W34      p
\        P                  ! \        P
                  ! V	4      P                  \        P                  4      ^ V^,
          4      p\        P                  ! V^,           ^ V^,
          4      p\        P                  ! \        P
                  ! V
4      P                  \        P                  4      ^ V^,
          4      p\        P                  ! V^,           ^ V^,
          4      pW›P                  V	P                  4      ,
          R,          pW­P                  V
P                  4      ,
          R,          pV RW½R3,          pV RW¾R3,          pV RWÍR3,          pV RWÎR3,          pV^V,
          ,          ^V,
          ,          V^V,
          ,          V,          ,           VV,          ^V,
          ,          ,           VV,          V,          ,           pV# )z¯Bilinear interpolation for 2D feature maps.

Args:
    x: (B, H, W, C) input
    new_h, new_w: target spatial dimensions
Returns:
    (B, new_h, new_w, C) interpolated output
r6   )r6   N)Nr6   ).N)	r:   r   ÚlinspacerP   ÚclipÚfloorÚastypeÚint32Údtype)r)   rH   rI   rS   rT   rU   rV   Úy_coordsÚx_coordsÚyyÚxxÚy0Úy1Úx0r  ÚfyÚfxÚval_00Úval_01Úval_10Úval_11Úresults   &&&                   r   Ú_interpolate_2drT  À  sâ  € ð —‘�J€Aˆ!Ø„z�a”jØˆô �{Š{˜1˜a !�e UÓ+€HÜ�{Š{˜1˜a !�e UÓ+€Hô 
�Š˜ 'Õ*¨U¨NÓ	;€BÜ	�Š˜ 'Õ*¨U¨NÓ	;€Bô 
�Š”—’˜"“×$Ñ$¤R§X¡XÓ.°°1°qµ5Ó	9€BÜ	�Š��a•˜˜A �EÓ	"€BÜ	�Š”—’˜"“×$Ñ$¤R§X¡XÓ.°°1°qµ5Ó	9€BÜ	�Š��a•˜˜A �EÓ	"€Bð �y‰y˜Ÿ™Ó"Õ
" IÕ	.€BØ
�y‰y˜Ÿ™Ó"Õ
" IÕ	.€Bð ˆq�"˜!ˆ|�_€FØˆq�"˜!ˆ|�_€FØˆq�"˜!ˆ|�_€FØˆq�"˜!ˆ|�_€Fð 	�!�b•&Õ˜Q �VÕ$Ø
�A˜•FÕ
˜bÕ
 õ	!à
�2�+˜˜R�Õ
 õ	!ð �2�+˜Õ
õ	ð ð €Mr   ) rþ   r;   Útypingr   r   r   Úmlx.coreÚcorer   Úmlx.nnrq   Úkernelsr   r   r   r   ÚModuler	   r"   r}   r˜   r¦   r»   rQ   rÔ   rÖ   rð   r   r  r!  r.  rT  r2  r   r   Ú<module>r[     só   ðÙ :ã ß $Ñ $å Ý å )ß 1ô
K�r—y‘yô Kô\�b—i‘iô ô$'�b—i‘iô 'ôT.�—	‘	ô .ô�"—)‘)ô ô4�B—I‘Iô õ õ.ô0?�R—Y‘Yô ?ôJˆR�Y‰Yô ô8	%�—‘ô 	%ô"ˆ"�)‰)ô "ôJ˜"Ÿ)™)ô ôB�"—)‘)ô ÷"-r   