+
    UV-j2A  ã                   ó  € 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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 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# )z³SAM3 Vision Encoder: ViT backbone with windowed/global attention + FPN neck.

Weight key prefix: detector_model.vision_encoder.backbone.* and detector_model.vision_encoder.neck.*
N)ÚListÚOptionalÚTuple)ÚVisionEncoderConfigÚ	ViTConfig)Úapply_rotary_encÚcompute_axial_cisc                   óT   a a€ ] tR t^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	# )ÚPatchProjectionzHInner projection layer to match weight key: patch_embeddings.projection.c                ó    <€ V ^8„  d   QhRS[ /# ©é   Úconfig©r   )ÚformatÚ__classdict__s   "€Úk/Volumes/fast/ai/experiments/ui-tars-smoke/.venv/lib/python3.14/site-packages/mlx_vlm/models/sam3/vision.pyÚ__annotate__ÚPatchProjection.__annotate__   s   ø€ ÷ 
ñ 
™yñ 
ó    c                ó´   <€ \         SV `  4        \        P                  ! VP                  VP
                  VP                  VP                  R R7      V n        R# )F)Úkernel_sizeÚstrideÚbiasN)ÚsuperÚ__init__ÚnnÚConv2dÚnum_channelsÚhidden_sizeÚ
patch_sizeÚ
projection©Úselfr   Ú	__class__s   &&€r   r   ÚPatchProjection.__init__   sE   ø€ Ü‰ÑÔÜŸ)š)Ø×ÑØ×ÑØ×)Ñ)Ø×$Ñ$Øô
ˆŽr   c                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# ©r   ÚxÚreturn©ÚmxÚarray)r   r   s   "€r   r   r   !   s#   ø€ ÷ "ñ "™"Ÿ(™(ð "¡r§x¡xñ "r   c                ó$   € V P                  V4      # ©N©r!   ©r#   r(   s   &&r   Ú__call__ÚPatchProjection.__call__!   s   € Ø�‰˜qÓ!Ð!r   r/   ©
Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r1   Ú__static_attributes__Ú__classdictcell__Ú__classcell__©r$   r   s   @@r   r
   r
      s!   ù‡ € ÙR÷
ó 
÷"÷ "ð "r   r
   c                   óT   a a€ ] tR t^%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	# )ÚPatchEmbeddingszcPatch embedding with Conv2d projection.

Weight key: embeddings.patch_embeddings.projection.weight
c                ó    <€ V ^8„  d   QhRS[ /# r   r   )r   r   s   "€r   r   ÚPatchEmbeddings.__annotate__+   s   ø€ ÷ Rñ R™yñ Rr   c                óÚ   <€ \         SV `  4        \        V4      V n        VP                  VP
                  ,          ^,          p\        P                  ! ^W!P                  34      V n	        R# )r   N)
r   r   r
   Úpatch_embeddingsÚpretrain_image_sizer    r+   Úzerosr   Úposition_embeddings)r#   r   Únum_patchesr$   s   && €r   r   ÚPatchEmbeddings.__init__+   sR   ø€ Ü‰ÑÔÜ /°Ó 7ˆÔà×1Ñ1°V×5FÑ5FÕFÈ1ÕLˆÜ#%§8¢8¨Q°×=OÑ=OÐ,PÓ#QˆÖ r   c                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# r'   r*   )r   r   s   "€r   r   r@   2   s#   ø€ ÷ 
ñ 
™"Ÿ(™(ð 
¡r§x¡xñ 
r   c                óx   € V P                  V4      pVP                  w  r#rEVP                  W#V,          V4      pV# )zg
Args:
    x: (B, H, W, C) image in MLX channel-last format
Returns:
    (B, num_patches, hidden_size)
)rB   ÚshapeÚreshape)r#   r(   ÚBÚHÚWÚCs   &&    r   r1   ÚPatchEmbeddings.__call__2   s:   € ð ×!Ñ! !Ó$ˆØ—W‘W‰
ˆˆaØ�I‰I�a˜Q� Ó"ˆØˆr   )rB   rE   r3   r<   s   @@r   r>   r>   %   s%   ù‡ € ñ÷
Ró R÷
÷ 
ð 
r   r>   c                   ó\   a a€ ] tR t^?t oRtRV3R lV 3R llltRV3R lR lltRtVtV ;t	# )	ÚVitAttentionzBMulti-head attention with optional windowed attention and 2D RoPE.c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r   r   Úuse_rope©r   Úbool)r   r   s   "€r   r   ÚVitAttention.__annotate__B   s   ø€ ÷ !ñ !™yð !±Dñ !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        W n        R# )ç      à?)r   TNg      à¿)r   r   Únum_attention_headsÚ	num_headsr   Úhead_dimÚscaler   ÚLinearÚqkv_biasÚq_projÚk_projÚv_projÚo_projrT   )r#   r   rT   r$   s   &&&€r   r   ÚVitAttention.__init__B   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                ó¢   <€ V ^8„  d   QhRS[ P                  RS[S[ P                  ,          RS[S[ P                  ,          RS[ P                  /# ©r   r(   Úrope_cosÚrope_sinr)   ©r+   r,   r   )r   r   s   "€r   r   rW   U   sM   ø€ ÷ 0ñ 0á�8‰8ð0ñ ™2Ÿ8™8Õ$ð0ñ ™2Ÿ8™8Õ$ð	0ñ
 
�‰ñ0r   c                ó¬  € VP                   pVP                  ^8X  d+   VP                   w  rVrxWg,          p	VP                  WYV4      pMVP                   w  rYpV P                  V4      P                  WYV P                  V P
                  4      P                  ^ ^^^4      p
V P                  V4      P                  WYV P                  V P
                  4      P                  ^ ^^^4      pV P                  V4      P                  WYV P                  V P
                  4      P                  ^ ^^^4      pV P                  '       d   Ve   \        W«W#4      w  r«\        P                  P                  W«WÀP                  R7      pVP                  ^ ^^^4      P                  WYV4      pV P                  V4      p\!        V4      ^8X  d   VP                  V4      pV# )z™
Args:
    x: (B, N, C) input (or (B, H, W, C) spatial)
    rope_cos: (N, D) cosine RoPE
    rope_sin: (N, D) sine RoPE
Returns:
    same shape as input
)r]   )rJ   ÚndimrK   r`   r[   r\   Ú	transposera   rb   rT   r   r+   ÚfastÚscaled_dot_product_attentionr]   rc   Úlen)r#   r(   rg   rh   Úinput_shaperL   rM   rN   rO   ÚNÚqÚkÚvÚouts   &&&&          r   r1   ÚVitAttention.__call__U   s{  € ð —g‘gˆØ�6‰6�QŒ;ØŸ™‰JˆA�!Ø•ˆAØ—	‘	˜! Ó"‰Aà—g‘g‰Gˆ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 Ó"ð 	
ð �=�=ˆ=˜XÒ1Ü# A¨(Ó=‰DˆAä�g‰g×2Ñ2°1¸Ç*Á*Ð2ÓMˆØ�m‰m˜A˜q ! QÓ'×/Ñ/°°aÓ8ˆØ�k‰k˜#Óˆäˆ{Ó˜qÔ Ø—+‘+˜kÓ*ˆCØˆ
r   )r\   ra   r[   rc   r`   r]   rT   rb   )T©NNr3   r<   s   @@r   rR   rR   ?   s!   ù‡ € ÙL÷!õ !÷&0÷ 0ò 0r   rR   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# )ÚVitMLPc                ó    <€ V ^8„  d   QhRS[ /# r   r   )r   r   s   "€r   r   ÚVitMLP.__annotate__‰   s   ø€ ÷ Kñ K™yñ Kr   c                óä   <€ \         SV `  4        \        P                  ! VP                  VP
                  4      V n        \        P                  ! VP
                  VP                  4      V n        R # r.   )r   r   r   r^   r   Úintermediate_sizeÚfc1Úfc2r"   s   &&€r   r   ÚVitMLP.__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                  /# r'   r*   )r   r   s   "€r   r   r{   Ž   s#   ø€ ÷ .ñ .™"Ÿ(™(ð .¡r§x¡xñ .r   c                ój   € V P                  \        P                  ! V P                  V4      4      4      # r.   )r   r   Úgelur~   r0   s   &&r   r1   ÚVitMLP.__call__Ž   s"   € Ø�x‰xœŸš §¡¨£Ó,Ó-Ð-r   )r~   r   )	r4   r5   r6   r7   r   r1   r9   r:   r;   r<   s   @@r   ry   ry   ˆ   s    ù‡ € ÷Kó K÷
.÷ .ð .r   ry   c                   ó\   a a€ ] tR t^’t oRtRV3R lV 3R llltRV3R lR lltRtVtV ;t	# )	ÚVitBlockz|ViT transformer block with optional windowed attention.

Operates on spatial (B, H, W, C) tensors matching HF Sam3ViTLayer.
c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r   r   Ú	is_globalrU   )r   r   s   "€r   r   ÚVitBlock.__annotate__˜   s   ø€ ÷ #ñ #™yð #±Tñ #r   c                ój  <€ \         SV `  4        \        P                  ! VP                  VP
                  R 7      V n        \        V4      V n        \        P                  ! VP                  VP
                  R 7      V n	        \        V4      V n        V'       d   ^ MVP                  V n        W n        R# )©ÚepsN)r   r   r   Ú	LayerNormr   Úlayer_norm_epsÚlayer_norm1rR   Ú	attentionÚlayer_norm2ry   ÚmlpÚwindow_sizerˆ   )r#   r   rˆ   r$   s   &&&€r   r   ÚVitBlock.__init__˜   sz   ø€ Ü‰ÑÔÜŸ<š<¨×(:Ñ(:À×@UÑ@UÔVˆÔÜ% fÓ-ˆŒÜŸ<š<¨×(:Ñ(:À×@UÑ@UÔVˆÔÜ˜&“>ˆŒß )™1¨v×/AÑ/AˆÔØ"Žr   c                ó¢   <€ V ^8„  d   QhRS[ P                  RS[S[ P                  ,          RS[S[ P                  ,          RS[ P                  /# rf   ri   )r   r   s   "€r   r   r‰   ¡   sM   ø€ ÷ ñ á�8‰8ðñ ™2Ÿ8™8Õ$ðñ ™2Ÿ8™8Õ$ð	ñ
 
�‰ñr   c                ó¨  € TpV P                  V4      pV P                  ^ 8”  dh   VP                  ^,          VP                  ^,          re\        WP                  4      w  rV P	                  WV4      p\        WP                  WuV34      pMV P	                  WV4      pWA,           pTpV P                  V4      pV P                  V4      pWA,           pV# )z‚
Args:
    x: (B, H, W, C) spatial features
    rope_cos: (N, D) cosine RoPE embeddings
    rope_sin: (N, D) sine RoPE embeddings
)r�   r“   rJ   Ú_window_partitionr�   Ú_window_unpartitionr‘   r’   )r#   r(   rg   rh   ÚresidualrM   rN   Úpad_hws   &&&&    r   r1   ÚVitBlock.__call__¡   s»   € ð ˆØ×Ñ˜QÓˆà×Ñ˜aÔØ—7‘7˜1•:˜qŸw™w q�zˆqÜ)¨!×-=Ñ-=Ó>‰IˆAØ—‘˜q¨HÓ5ˆAÜ# A×'7Ñ'7¸ÀQÀÓH‰Aà—‘˜q¨HÓ5ˆAà�LˆØˆØ×Ñ˜QÓˆØ�H‰H�Q‹KˆØ�LˆØˆr   )r�   rˆ   r�   r‘   r’   r“   )Frw   r3   r<   s   @@r   r†   r†   ’   s#   ù‡ € ñ÷
#õ #÷÷ ò r   r†   c          
      ó¨   € V ^8„  d   QhR\         P                  R\        R\        \         P                  \        \        \        3,          3,          /# )r   r(   r“   r)   ©r+   r,   Úintr   )r   s   "r   r   r   À   s>   € ÷ ñ Ü	‡x�xðÜ!ðä
Œ2�8‰8”Uœ3¤˜8•_Ð$Õ%ñr   c                ó®  € V P                   w  r#rETpWcV,          ,
          V,          pWdV,          ,
          V,          pV^ 8”  g   V^ 8”  d    \        P                  ! V R^ V3^ V3R.4      p W7,           WH,           r©W–,          W¦,          rËV P                  W+WlWe4      p V P	                  ^ ^^^^^4      p V P                  W+,          V,          WfV4      p W	V
33# )zÉPartition spatial features into non-overlapping windows.

Args:
    x: (B, H, W, C) spatial features
Returns:
    windows: (B*nH*nW, ws, ws, C) windowed features
    pad_hw: (Hp, Wp) padded dimensions
)é    r    )rJ   r+   ÚpadrK   rl   )r(   r“   rL   rM   rN   rO   ÚwsÚpad_hÚpad_wÚHpÚWpÚnHÚnWs   &&           r   r—   r—   À   sÈ   € ð —‘�J€Aˆ!Ø	€Bà�b•&�[˜BÕ€EØ�b•&�[˜BÕ€EØˆq„y�E˜A”IÜ�FŠF�1�v  5˜z¨A¨u¨:°vÐ>Ó?ˆØ�Y˜�	ˆà�X�r•xˆØ	�	‰	�!˜ Ó'€AØ	�‰�A�q˜!˜Q  1Ó%€AØ	�	‰	�!•&˜2•+˜r qÓ)€AØ�2ˆhˆ;Ðr   c          
      óÀ   € V ^8„  d   QhR\         P                  R\        R\        \        \        3,          R\        \        \        3,          R\         P                  /# )r   r(   r“   rš   Úoriginal_hwr)   r�   )r   s   "r   r   r   Û   sR   € ÷ ñ Ü	‡x�xðäðô ”#”s�(�Oðô ”sœC�x•ð	ô
 ‡X�Xñr   c                óN  € TpVw  rVVw  rxWT,          Wd,          r©V P                   ^ ,          Wš,          ,          pV P                   R,          pV P                  W¹W¤WL4      p V P                  ^ ^^^^^4      p V P                  WµWl4      p WW8”  g   Wh8”  d   V RRV1RV1R3,          p V # )zWReverse window partition.

Args:
    x: (B*nH*nW, ws, ws, C)
Returns:
    (B, H, W, C)
ºNNNNéÿÿÿÿ)rJ   rK   rl   )r(   r“   rš   rª   r¢   r¥   r¦   rM   rN   r§   r¨   rL   rO   s   &&&&         r   r˜   r˜   Û   s¤   € ð 
€BØ�F€BØ�D€AØ�X�r•xˆØ	�‰��
�r•wÕ€AØ	�‰��€Aà	�	‰	�!˜ Ó'€AØ	�‰�A�q˜!˜Q  1Ó%€AØ	�	‰	�!˜Ó€Aà	„v�”Øˆa��!��R�a�R˜ˆl�Oˆà€Hr   c                   ój   a a€ ] tR t^ùt oRtV3R lV 3R lltV3R lR ltR	V3R lR lltRtVt	V ;t
# )
ÚViTBackbonez�Vision Transformer backbone with windowed + global attention and 2D RoPE.

Weight keys: detector_model.vision_encoder.backbone.*
c                ó    <€ V ^8„  d   QhRS[ /# r   r   )r   r   s   "€r   r   ÚViTBackbone.__annotate__ÿ   s   ø€ ÷ 
ñ 
™yñ 
r   c                óÆ  <€ \         SV `  4        Wn        \        V4      V n        VP
                  VP                  ,          pW n        \        P                  ! VP                  VP                  R 7      V n        \        VP                  4      p\        VP                   4       Uu. uF  p\#        WV9   R7      NK  	  upV n        \'        VP                  VP(                  ,          VP*                  VP*                  VP,                  R7      w  V n        V n        \'        VP                  VP(                  ,          VVVP,                  R7      w  V n        V n        R# u upi )r‹   )rˆ   ©ÚthetaN)r   r   r   r>   Ú
embeddingsÚ
image_sizer    Ú	feat_sizer   r�   r   rŽ   Ú
layer_normÚsetÚglobal_attn_indexesÚrangeÚnum_hidden_layersr†   Úlayersr   rZ   r“   Ú
rope_thetaÚ_rope_window_cosÚ_rope_window_sinÚ_rope_global_cosÚ_rope_global_sin)r#   r   r·   Ú
global_setÚir$   s   &&   €r   r   ÚViTBackbone.__init__ÿ   s$  ø€ Ü‰ÑÔØŒÜ)¨&Ó1ˆŒà×%Ñ%¨×):Ñ):Õ:ˆ	Ø"ŒäŸ,š, v×'9Ñ'9¸v×?TÑ?TÔUˆŒä˜×3Ñ3Ó4ˆ
ô ˜6×3Ñ3Ô4ó
á4�ô �V¨Z©×9Ù4ñ
ˆŒô 8IØ×Ñ &×"<Ñ"<Õ<Ø×ÑØ×ÑØ×#Ñ#ô	8
Ñ4ˆÔ˜tÔ4ô 8IØ×Ñ &×"<Ñ"<Õ<ØØØ×#Ñ#ô	8
Ñ4ˆÔ˜tÖ4ùò
s   Â&Ec                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# r'   r*   )r   r   s   "€r   r   r±     s#   ø€ ÷ )ñ )™"Ÿ(™(ð )¡r§x¡xñ )r   c                ód  € VP                   ^ ,          pVP                   ^,          VP                   ^,          rCW0P                  P                  ,          pW@P                  P                  ,          pV P                  V4      pV P	                  V P                  P
                  WV4      pW,           pVP                  W%VR4      pV P                  V4      pWPP                  8w  g   W`P                  8w  dX   V P                  P                  V P                  P                  ,          p\        VVVV P                  P                  R7      w  ršMV P                  p	V P                  p
V P                   F=  pVP                   '       d   V! WV
4      pK   V! WP"                  V P$                  4      pK?  	  V# )uƒ   
Args:
    x: (B, H, W, C) image â€” supports any resolution divisible by patch_size
Returns:
    (B, feat_H, feat_W, hidden_size)
r³   r­   )rJ   r   r    rµ   Ú_tile_pos_embedrE   rK   r¸   r·   r   rZ   r   r¾   rÁ   rÂ   r½   rˆ   r¿   rÀ   )r#   r(   rL   Úinput_hÚinput_wrM   rN   Úposr\   Ú
global_cosÚ
global_sinÚlayers   &&          r   r1   ÚViTBackbone.__call__  sS  € ð �G‰G�A�JˆØŸ7™7 1�: q§w¡w¨q¥z�Ø—{‘{×-Ñ-Õ-ˆØ—{‘{×-Ñ-Õ-ˆà�O‰O˜AÓˆð ×"Ñ" 4§?¡?×#FÑ#FÈÓMˆØ�Gˆð �I‰I�a˜A˜rÓ"ˆØ�O‰O˜AÓˆð —‘Ô !§~¡~Ô"5Ø—{‘{×.Ñ.°$·+±+×2QÑ2QÕQˆHÜ%6ØØØØ—k‘k×,Ñ,ô	&Ñ"ˆJ˜
ð ×.Ñ.ˆJØ×.Ñ.ˆJà—[”[ˆEØ��ˆÙ˜!¨Ó4’á˜!×2Ñ2°D×4IÑ4IÓJ’ñ	 !ð ˆr   c                óz   <€ V ^8„  d   QhRS[ P                  RS[S[,          RS[S[,          RS[ P                  /# )r   rË   Útarget_hÚtarget_wr)   )r+   r,   r   rž   )r   r   s   "€r   r   r±   H  sC   ø€ ÷ ñ á�X‰Xðñ ™3•-ðñ ™3•-ð	ñ
 
�‰ñr   c                óî  € VP                   ^,          p\        \        P                  ! V4      4      pT;'       g    V P                  pT;'       g    V P                  pVP                   R,          pWR8X  d	   WS8X  d   V# VP                  ^WUV4      pW%,          ^,           pW5,          ^,           p\        P                  ! V^Wx^34      pVRRV1RV1R3,          pVP                  ^W#,          V4      pV# )z™Tile position embeddings to match target spatial dimensions.

HF SAM3 uses tiling (repeating), not interpolation.
pos: (1, pretrain_size^2, hidden_size)
r¬   Nr­   )rJ   rž   ÚmathÚsqrtr·   rK   r+   Útile)	r#   rË   rÑ   rÒ   rq   Úpretrain_sizer   Úrepeat_hÚrepeat_ws	   &&&&     r   rÈ   ÚViTBackbone._tile_pos_embedH  sÞ   € ð �I‰I�a�LˆÜœDŸIšI a›LÓ)ˆØ×-Ð-˜tŸ~™~ˆØ×-Ð-˜tŸ~™~ˆØ—i‘i •mˆàÔ$¨Ô)BØˆJà�k‰k˜!˜]¸;ÓGˆð Õ,¨qÕ0ˆØÕ,¨qÕ0ˆô �gŠg�c˜A˜x°1Ð5Ó6ˆà�!�Y�h�Y 	  	¨1Ð,Õ-ˆØ�k‰k˜!˜XÕ0°+Ó>ˆØˆ
r   )	rÁ   rÂ   r¿   rÀ   r   rµ   r·   r¸   r½   rw   )r4   r5   r6   r7   r8   r   r1   rÈ   r9   r:   r;   r<   s   @@r   r¯   r¯   ù   s.   ù‡ € ñ÷

ó 
÷<)ð )÷V÷ ò 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	# )	ÚFPNLayerio  zðSingle FPN scale: upscale -> project -> refine.

For 4x upscaling: scale_layers = {0: ConvT, 2: ConvT} (GELU at index 1 has no weight)
For 2x upscaling: scale_layers = {0: ConvT}
Weight indices must match PyTorch's nn.Sequential numbering.
c          
      ó8   <€ V ^8„  d   QhRS[ RS[ RS[RS[ RS[ /# )r   Úin_channelsÚout_channelsÚscale_factorÚfpn_kernel_sizeÚ
fpn_stride)rž   Úfloat)r   r   s   "€r   r   ÚFPNLayer.__annotate__w  s=   ø€ ÷ 9
ñ 9
áð9
ñ ð9
ñ ð	9
ñ
 ð9
ñ ñ9
r   c           	     ó0  <€ \         S	V `  4        W0n        ^ V n        TpVR8¼  dU   V^,          pV^,          p\        P
                  ! VVVVR7      R\        P
                  ! WxWER7      .V n        Tp^V n        MAVR8¼  d4   V^,          p\        P
                  ! VVVVR7      .V n        Tp^V n        M. V n        V P                  ^ 8„  V n        VR8*  V n        \        P                  ! Wb^RR7      V n
        \        P                  ! W"^^RR7      V n        R# )	r    g      @)r   r   Ng       @rY   T)r   r   )r   Úpaddingr   )r   r   rà   Únum_upscaler   ÚConvTranspose2dÚscale_layersÚhas_scale_layersÚis_downsampler   Úproj1Úproj2)
r#   rÞ   rß   rà   rá   râ   Úcurrent_channelsÚmidÚmid2r$   s
   &&&&&&   €r   r   ÚFPNLayer.__init__w  s.  ø€ ô 	‰ÑÔØ(ÔØˆÔð 'ÐØ˜3ÔØ" aÕ'ˆCØ˜!•8ˆDô ×"Ò"Ø$ØØ /Ø%ô	ð Ü×"Ò"Ø¨?ôð!ˆDÔð  $ÐØ ˆDÕØ˜SÔ Ø" aÕ'ˆCä×"Ò"Ø$ØØ /Ø%ô	ð!ˆDÔð  #ÐØ ˆDÕà "ˆDÔà $× 0Ñ 0°1Ñ 4ˆÔØ)¨SÑ0ˆÔô —Y’YÐ/È1ÐSWÔXˆŒ
Ü—Y’YØ°A¸qÀtô
ˆŽ
r   c                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# r'   r*   )r   r   s   "€r   r   rä   ²  s#   ø€ ÷ ñ ™"Ÿ(™(ð ¡r§x¡xñ r   c                ó–  € V P                   '       d9   V P                   F'  pVf   \        P                  ! V4      pK  V! V4      pK)  	  M\V P                  '       dK   VP
                  w  r4rVVP                  W4^,          ^V^,          ^V4      p\        P                  ! VRR7      pV P                  V4      pV P                  V4      pV# )zN
Args:
    x: (B, H, W, C) feature map
Returns:
    (B, H', W', out_channels)
)Úaxis)r   é   )rê   ré   r   rƒ   rë   rJ   rK   r+   Úmaxrì   rí   )r#   r(   rÎ   rL   rM   rN   rO   s   &&     r   r1   ÚFPNLayer.__call__²  s£   € ð × × Ð Ø×*Ô*�Ø’=ÜŸš ›
’Aá˜a›’Aò	 +ð
 ××ÐàŸ™‰JˆA�!Ø—	‘	˜! !�V Q¨¨Q­°°1Ó5ˆAÜ—’�q˜vÔ&ˆAà�J‰J�q‹MˆØ�J‰J�q‹MˆØˆr   )rê   rë   rç   rì   rí   rà   ré   )r   r   r3   r<   s   @@r   rÜ   rÜ   o  s$   ù‡ € ñ÷9
õ 9
÷v÷ ð 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	# )ÚFPNNeckiÊ  z\Feature Pyramid Network neck.

Weight keys: detector_model.vision_encoder.neck.fpn_layers.*
c                ó    <€ V ^8„  d   QhRS[ /# r   ©r   )r   r   s   "€r   r   ÚFPNNeck.__annotate__Ð  s   ø€ ÷ 
ñ 
Ñ2ñ 
r   c           
     óö   <€ \         SV `  4        VP                  pVP                  pVP                   Uu. uF0  p\        VVP                  VVP                  VP                  4      NK2  	  upV n	        R # u upi r.   )
r   r   Úbackbone_configr   Úscale_factorsrÜ   Úfpn_hidden_sizerá   râ   Ú
fpn_layers)r#   r   rþ   rÞ   Úsfr$   s   &&   €r   r   ÚFPNNeck.__init__Ð  sz   ø€ Ü‰ÑÔØ ×0Ñ0ˆØ%×1Ñ1ˆð ×*Ò*ó	
ñ +�ô ØØ×&Ñ&ØØ×&Ñ&Ø×!Ñ!öñ +ñ	
ˆŽùò 	
s   ¶6A6c                ó˜   <€ V ^8„  d   QhRS[ P                  RS[S[S[ P                  ,          S[S[ P                  ,          3,          /# r'   )r+   r,   r   r   )r   r   s   "€r   r   rü   à  s9   ø€ ÷ 
ñ 
™"Ÿ(™(ð 
¡u©T±"·(±(­^¹TÁ"Ç(Á(½^Ð-KÕ'Lñ 
r   c                ó^   € . pV P                    F  pVP                  V! V4      4       K  	  V# )zp
Args:
    x: (B, H, W, C) backbone output
Returns:
    features: list of (B, H_i, W_i, D) multi-scale features
)r  Úappend)r#   r(   ÚfeaturesrÎ   s   &&  r   r1   ÚFPNNeck.__call__à  s,   € ð ˆØ—_”_ˆEØ�O‰O™E !›HÖ%ñ %àˆr   )r  r3   r<   s   @@r   rù   rù   Ê  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	# )ÚVisionEncoderiò  z`Complete vision encoder: ViT backbone + FPN neck.

Weight keys: detector_model.vision_encoder.*
c                ó    <€ V ^8„  d   QhRS[ /# r   rû   )r   r   s   "€r   r   ÚVisionEncoder.__annotate__ø  s   ø€ ÷ $ñ $Ñ2ñ $r   c                óx   <€ \         SV `  4        \        VP                  4      V n        \        V4      V n        R # r.   )r   r   r¯   rþ   Úbackbonerù   Úneckr"   s   &&€r   r   ÚVisionEncoder.__init__ø  s+   ø€ Ü‰ÑÔÜ# F×$:Ñ$:Ó;ˆŒÜ˜F“OˆŽ	r   c                ó^   <€ V ^8„  d   QhRS[ P                  RS[S[ P                  ,          /# r'   ©r+   r,   r   )r   r   s   "€r   r   r  ý  s'   ø€ ÷ 	ñ 	™"Ÿ(™(ð 	¡t©B¯H©H¥~ñ 	r   c                óJ   € V P                  V4      pV P                  V4      pV# )zP
Args:
    x: (B, H, W, C) image
Returns:
    Multi-scale feature list from FPN
©r  r  )r#   r(   r  Úfpn_featuress   &&  r   r1   ÚVisionEncoder.__call__ý  s&   € ð —=‘= Ó#ˆØ—y‘y Ó*ˆØÐr   r  r3   r<   s   @@r   r
  r
  ò  s#   ù‡ € ñ÷
$ó $÷
	÷ 	ð 	r   r
  c                   ód   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 4       tRt	Vt
V ;t# )	ÚVisionModeli	  z"Wrapper for mlx-vlm compatibility.c                ó    <€ V ^8„  d   QhRS[ /# r   rû   )r   r   s   "€r   r   ÚVisionModel.__annotate__  s   ø€ ÷ 4ñ 4Ñ2ñ 4r   c                óD   <€ \         SV `  4        \        V4      V n        R # r.   )r   r   r
  Úvision_encoderr"   s   &&€r   r   ÚVisionModel.__init__  s   ø€ Ü‰ÑÔÜ+¨FÓ3ˆÖr   c                ó^   <€ V ^8„  d   QhRS[ P                  RS[S[ P                  ,          /# r'   r  )r   r   s   "€r   r   r    s'   ø€ ÷ &ñ &™"Ÿ(™(ð &¡t©B¯H©H¥~ñ &r   c                ó$   € V P                  V4      # r.   ©r  r0   s   &&r   r1   ÚVisionModel.__call__  s   € Ø×"Ñ" 1Ó%Ð%r   c                ó   € V # )z2No-op: all sanitization handled in Model.sanitize.© )Úweightss   &r   ÚsanitizeÚVisionModel.sanitize  s	   € ð ˆr   r   )r4   r5   r6   r7   r8   r   r1   Ústaticmethodr%  r9   r:   r;   r<   s   @@r   r  r  	  s5   ù‡ € Ù,÷4ó 4÷&ð &ð ñó ÷ð r   r  )r8   rÔ   Útypingr   r   r   Úmlx.coreÚcorer+   Úmlx.nnr   r   r   r   Úpositionr   r   ÚModuler
   r>   rR   ry   r†   r—   r˜   r¯   rÜ   rù   r
  r  r#  r   r   Ú<module>r.     sÖ   ðñó
 ß (Ñ (å Ý ç 2ß 9ô"�b—i‘iô "ô"�b—i‘iô ô4F�2—9‘9ô FôR.ˆR�Y‰Yô .ô+ˆr�y‰yô +õ\õ6ô<n�"—)‘)ô nôlXˆr�y‰yô Xôv ˆb�i‰iô  ôP�B—I‘Iô ô.�"—)‘)ö r   