+
    UV-j!  ã                   ó   € R 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  ! 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 Segmentation Head and Dot Product Scoring.

Weight keys:
    detector_model.mask_decoder.*
    detector_model.dot_product_scoring.*
)ÚDictÚListÚOptionalN©ÚDetectorMaskDecoderConfig)ÚMultiheadAttentionc                   ój   a a€ ] tR t^t oRtR	V3R lV 3R llltV3R lR ltV3R lR ltRtVt	V ;t
# )
ÚPixelDecoderz„FPN-like upsampling decoder matching HF Sam3PixelDecoder.

Iterates from coarsest to finest, upsampling to match each level's size.
c                ó&   <€ V ^8„  d   QhRS[ RS[ /# )é   Úhidden_sizeÚnum_upsampling_stages©Úint)ÚformatÚ__classdict__s   "€Úq/Volumes/fast/ai/experiments/ui-tars-smoke/.venv/lib/python3.14/site-packages/mlx_vlm/models/sam3/segmentation.pyÚ__annotate__ÚPixelDecoder.__annotate__   s   ø€ ÷ 
ñ 
¡Cð 
Áñ 
ó    c           
     ó  <€ \         SV `  4        \        V4       Uu. uF  p\        P                  ! W^^R7      NK  	  upV n        \        V4       Uu. uF  p\        P                  ! ^V4      NK  	  upV n        R# u upi u upi )é   )Úkernel_sizeÚpaddingN)ÚsuperÚ__init__ÚrangeÚnnÚConv2dÚconv_layersÚ	GroupNormÚnorms)Úselfr   r   Ú_Ú	__class__s   &&& €r   r   ÚPixelDecoder.__init__   s|   ø€ Ü‰ÑÔô Ð0Ô1ó
á1�ô �IŠI�k¸AÀq×IÙ1ñ
ˆÔô
 38Ð8MÔ2Nó
Ù2N¨QŒB�LŠL˜˜KÖ(Ñ2Nñ
ˆŽ
ùò	
ùò
s   �"A>Á Bc                ó^   <€ V ^8„  d   QhRS[ S[P                  ,          RS[P                  /# )r   ÚfeaturesÚreturn)r   ÚmxÚarray)r   r   s   "€r   r   r   !   s'   ø€ ÷ ñ ¡¡b§h¡h¥ð ±B·H±Hñ r   c                óf  € VR,          p\        \        VRR 4      4       FŒ  w  r4VP                  ^,          VP                  ^,          reV P                  W%V4      pW$,           pV P                  V,          ! V4      pV P
                  V,          ! V4      p\        P                  ! V4      pKŽ  	  V# )a  
Args:
    features: list of (B, H_i, W_i, D) from LOW to HIGH resolution
              e.g. [72x72, 144x144, 288x288] (coarsest first when reversed from FPN)
              Actually: features[-1] is coarsest, features[0] is finest
Returns:
    (B, H_finest, W_finest, D)
Néÿÿÿÿ)Ú	enumerateÚreversedÚshapeÚ_interpolater   r!   r   Úrelu)r"   r'   ÚxÚiÚbackbone_featÚtarget_hÚtarget_ws   &&     r   Ú__call__ÚPixelDecoder.__call__!   sŸ   € ð �R�Lˆô !*¬(°8¸C¸R°=Ó*AÖ BÑˆAØ!.×!4Ñ!4°QÕ!7¸×9LÑ9LÈQÕ9O�hà×!Ñ! !¨xÓ8ˆAàÕ!ˆAà× Ñ  Ö# AÓ&ˆAØ—
‘
˜1–˜aÓ ˆAÜ—’˜“
ŠAñ !Cð ˆr   c                óZ   <€ V ^8„  d   QhRS[ P                  RS[RS[RS[ P                  /# )r   r2   r5   r6   r(   )r)   r*   r   )r   r   s   "€r   r   r   ;   s1   ø€ ÷ ñ ™bŸh™hð ±#ð Áð ÉÏÉñ r   c                ó˜   € VP                   w  rErgWR8X  d	   Wc8X  d   V# \        P                  ! W%,          W6,          3RR7      pV! V4      # )z4Nearest-neighbor interpolation to exact target size.Únearest)Úscale_factorÚmode)r/   r   ÚUpsample)	r"   r2   r5   r6   ÚBÚHÚWÚCÚups	   &&&&     r   r0   ÚPixelDecoder._interpolate;   s?   € à—W‘W‰
ˆˆaØŒ=˜Qœ]ØˆHÜ�[Š[ x¥|°Xµ\Ð&BÈÔSˆÙ�!‹uˆr   )r   r!   )r   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r7   r0   Ú__static_attributes__Ú__classdictcell__Ú__classcell__©r$   r   s   @@r   r	   r	      s-   ù‡ € ñ÷

õ 
÷ð ÷4÷ ð r   r	   c                   óT   a a€ ] tR t^Dt 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	# )ÚMaskEmbedderzA3-layer MLP that projects query features to mask embedding space.c                ó    <€ V ^8„  d   QhRS[ /# ©r   r   r   )r   r   s   "€r   r   ÚMaskEmbedder.__annotate__G   s   ø€ ÷ 
ñ 
¡Cñ 
r   c                ó°   <€ \         SV `  4        \        P                  ! W4      \        P                  ! W4      \        P                  ! W4      .V n        R # ©N)r   r   r   ÚLinearÚlayers©r"   r   r$   s   &&€r   r   ÚMaskEmbedder.__init__G   s;   ø€ Ü‰ÑÔä�IŠI�kÓ/Ü�IŠI�kÓ/Ü�IŠI�kÓ/ð
ˆŽr   c                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# ©r   r2   r(   ©r)   r*   )r   r   s   "€r   r   rR   O   s#   ø€ ÷ ñ ™"Ÿ(™(ð ¡r§x¡xñ r   c                óÄ   € \        V P                  4       FF  w  r#V! V4      pV\        V P                  4      ^,
          8  g   K0  \        P                  ! V4      pKH  	  V# )é   )r-   rV   Úlenr   r1   )r"   r2   r3   Úlayers   &&  r   r7   ÚMaskEmbedder.__call__O   sJ   € Ü! $§+¡+Ö.‰HˆAÙ�a“ˆAØ”3�t—{‘{Ó# aÕ'Ö'Ü—G’G˜A“J’ñ /ð ˆr   )rV   ©
rE   rF   rG   rH   rI   r   r7   rJ   rK   rL   rM   s   @@r   rO   rO   D   s!   ù‡ € ÙK÷
ó 
÷÷ ð r   rO   c                   óX   a a€ ] tR t^Wt oRtV3R lV 3R lltRV3R lR lltRtVtV ;t	# )ÚMaskDecoderz.Segmentation head matching HF Sam3MaskDecoder.c                ó    <€ V ^8„  d   QhRS[ /# )r   Úconfigr   )r   r   s   "€r   r   ÚMaskDecoder.__annotate__Z   s   ø€ ÷ Bñ BÑ8ñ Br   c                ó†  <€ \         SV `  4        VP                  p\        W!P                  4      V n        \        V4      V n        \        W!P                  4      V n
        \        P                  ! W!P                  R 7      V n        \        P                  ! V^^R7      V n        \        P                  ! W"^R7      V n        R# ))Úeps)r   N)r   r   r   r	   r   Úpixel_decoderrO   Úmask_embedderr   Únum_attention_headsÚprompt_cross_attnr   Ú	LayerNormÚlayer_norm_epsÚprompt_cross_attn_normr   Úsemantic_projectionÚinstance_projection)r"   re   Údr$   s   && €r   r   ÚMaskDecoder.__init__Z   sŠ   ø€ Ü‰ÑÔØ×Ñˆä)¨!×-IÑ-IÓJˆÔÜ)¨!›_ˆÔä!3°A×7QÑ7QÓ!RˆÔÜ&(§l¢l°1×:OÑ:OÔ&PˆÔ#ä#%§9¢9¨Q°¸qÔ#AˆÔ Ü#%§9¢9¨Q¸qÔ#AˆÖ r   c                ó  <€ V ^8„  d   QhRS[ P                  RS[S[ P                  ,          RS[S[ P                  ,          RS[S[ P                  ,          RS[S[ P                  ,          RS[S[S[ P                  3,          /# )r   Úobj_queriesÚbackbone_featuresÚencoder_hidden_statesÚprompt_featuresÚprompt_maskr(   )r)   r*   r   r   r   Ústr)r   r   s   "€r   r   rf   g   sƒ   ø€ ÷ @
ñ @
á—X‘Xð@
ñ  ¡§¡�>ð@
ñ  (©¯©Õ1ð	@
ñ
 "¡"§(¡(Õ+ð@
ñ ™bŸh™hÕ'ð@
ñ 
‰c‘2—8‘8ˆmÕ	ñ@
r   c                ó  € Vem   Vei   TpV P                  V4      pRpVe5   ^VR,          P                  \        P                  4      ,
          R,          pV P	                  WtWHR7      p	Wi,           p\        V4      p
VeF   V
R,          pVP                  w  rÍrïWÞ,          pVRRV1R3,          pVP                  WÍWï4      pVV
R&   V P                  V
4      pV P                  V4      pV P                  V4      pVP                  w  rÍrïVP                  WÍV,          V4      p\        P                  ! VVP                  ^ ^^4      4      pVP                  VRWÞ4      pV P                  V4      pVP                  ^ ^^^4      pRVRV/# )	a  
Args:
    obj_queries: (B, Q, D) decoder output queries
    backbone_features: list of (B, H_i, W_i, D) multi-scale FPN features
    encoder_hidden_states: (B, HW, D) DETR encoder output
    prompt_features: (B, P, D) for cross-attention
    prompt_mask: (B, P)
NºNNN)ÚmaskÚ
pred_masksÚsemantic_seg)r|   NNr|   g    eÍÍÁr,   )ro   Úastyper)   Úfloat32rl   Úlistr/   Úreshaperi   rq   rj   ÚmatmulÚ	transposerp   )r"   ru   rv   rw   rx   ry   ÚresidualÚnormedÚ
cross_maskÚattn_outÚfeats_for_fpnÚfinestr?   r@   rA   ÚDÚspatial_dimÚencoder_visualÚpixel_embedÚinstance_embedÚmask_embeddingsÚinstance_flatr~   r   s   &&&&&&                  r   r7   ÚMaskDecoder.__call__g   s²  € ð" Ò&Ð+@Ò+LØ,ˆHØ×0Ñ0Ð1FÓGˆFØˆJØÒ&à˜Ð$4Õ5×<Ñ<¼R¿Z¹ZÓHÕHØõ�
ð ×-Ñ-Ø¨ð .ó ˆHð %-Õ$7Ð!ô Ð.Ó/ˆØ Ò,à" 2Õ&ˆFØŸ™‰JˆA�!Ø�%ˆKØ2°1°l°{°lÀAÐ3EÕFˆNØ+×3Ñ3°A¸!Ó?ˆNØ .ˆM˜"Ñð ×(Ñ(¨Ó7ˆð ×1Ñ1°+Ó>ˆð ×,Ñ,¨[Ó9ˆØ#×)Ñ)‰
ˆˆaØ&×.Ñ.¨q°aµ%¸Ó;ˆÜ—Y’YØ˜]×4Ñ4°Q¸¸1Ó=ó
ˆ
ð  ×'Ñ'¨¨2¨qÓ4ˆ
ð ×/Ñ/°Ó<ˆØ#×-Ñ-¨a°°A°qÓ9ˆð ˜*Ø˜Lð
ð 	
r   )rq   rj   ri   rl   ro   rp   )NNNra   rM   s   @@r   rc   rc   W   s&   ù‡ € Ù8÷Bó B÷@
÷ @
ò @
r   rc   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	# )ÚTextScoringMLPz82-layer MLP for text scoring (residual done externally).c                ó    <€ V ^8„  d   QhRS[ /# rQ   r   )r   r   s   "€r   r   ÚTextScoringMLP.__annotate__­   s   ø€ ÷ >ñ >¡Cñ >r   c                ó®   <€ \         SV `  4        \        P                  ! W^,          4      V n        \        P                  ! V^,          V4      V n        R# )é   N)r   r   r   rU   Úlayer1Úlayer2rW   s   &&€r   r   ÚTextScoringMLP.__init__­   s8   ø€ Ü‰ÑÔÜ—i’i ¸1­_Ó=ˆŒÜ—i’i ¨a¥°Ó=ˆŽr   c                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# rZ   r[   )r   r   s   "€r   r   r—   ²   s#   ø€ ÷ 4ñ 4™"Ÿ(™(ð 4¡r§x¡xñ 4r   c                ój   € V P                  \        P                  ! V P                  V4      4      4      # rT   )r›   r   r1   rš   )r"   r2   s   &&r   r7   ÚTextScoringMLP.__call__²   s"   € Ø�{‰{œ2Ÿ7š7 4§;¡;¨q£>Ó2Ó3Ð3r   )rš   r›   ra   rM   s   @@r   r•   r•   ª   s!   ù‡ € ÙB÷>ó >÷
4÷ 4ð 4r   r•   c                   óX   a a€ ] tR t^¶t oRtV3R lV 3R lltRV3R lR lltRtVtV ;t	# )ÚDotProductScoringz9Dot-product classifier matching HF Sam3DotProductScoring.c                ó    <€ V ^8„  d   QhRS[ /# rQ   r   )r   r   s   "€r   r   ÚDotProductScoring.__annotate__¹   s   ø€ ÷ "ñ "¡Cñ "r   c                ó  <€ \         SV `  4        \        P                  ! W4      V n        \        P                  ! W4      V n        \        V4      V n        \        P                  ! V4      V n	        R VR,          ,          V n
        RV n        R# )ç      ð?g      à?g      (@N)r   r   r   rU   Ú
query_projÚ	text_projr•   Útext_mlprm   Útext_mlp_out_normÚscaleÚclamp_max_valrW   s   &&€r   r   ÚDotProductScoring.__init__¹   sd   ø€ Ü‰ÑÔÜŸ)š) KÓ=ˆŒÜŸš ;Ó<ˆŒÜ& {Ó3ˆŒÜ!#§¢¨kÓ!:ˆÔØ˜K¨Õ,Õ-ˆŒ
Ø!ˆÖr   c                ó’   <€ V ^8„  d   QhRS[ P                  RS[ P                  RS[S[ P                  ,          RS[ P                  /# )r   ÚhsÚinputs_embedsÚ	text_maskr(   )r)   r*   r   )r   r   s   "€r   r   r£   Â   sH   ø€ ÷  ñ  á�H‰Hð ñ —x‘xð ñ ™BŸH™HÕ%ð	 ñ
 
�‰ñ r   c                ó\  € TpV P                  V4      V,           pV P                  V4      pVen   VR,          P                  \        P                  4      p\        P
                  ! VP                  ^R7      R4      pWV,          P                  ^R7      V,          pMVP                  ^R7      pV P                  V4      p	V P                  V4      p
\        P                  ! W©R,          4      pW°P                  ,          p\        P                  ! W°P                  ) V P                  4      pV# )z²
Args:
    hs: (L, B, Q, D) intermediate hidden states from decoder
    inputs_embeds: (B, T, D)
    text_mask: (B, T) where 1=valid, 0=padding
Returns:
    scores: (L, B, Q, 1)
)Úaxisr¥   ).N)Nr|   r|   N)r¨   r©   r€   r)   r�   ÚmaximumÚsumÚmeanr§   r¦   r„   rª   Úclipr«   )r"   r®   r¯   r°   Ú	orig_textÚtext_processedÚis_validÚ	num_validÚpooled_textÚ	proj_textÚproj_queriesÚscoress   &&&&        r   r7   ÚDotProductScoring.__call__Â   sô   € ð "ˆ	ØŸ™ }Ó5¸	ÕAˆØ×/Ñ/°Ó?ˆàÒ Ø  Õ+×2Ñ2´2·:±:Ó>ˆHÜŸ
š
 8§<¡<°Q <Ó#7¸Ó=ˆIØ)Õ4×9Ñ9¸qÐ9ÓAÀIÕM‰Kà(×-Ñ-°1Ð-Ó5ˆKà—N‘N ;Ó/ˆ	Ø—‘ rÓ*ˆä—’˜<Ð3CÕ)DÓEˆØŸ*™*Õ$ˆÜ—’˜×"4Ñ"4Ð!4°d×6HÑ6HÓIˆàˆr   )r«   r¦   rª   r¨   r©   r§   rT   ra   rM   s   @@r   r¡   r¡   ¶   s!   ù‡ € ÙC÷"ó "÷ ÷  ò  r   r¡   )rI   Útypingr   r   r   Úmlx.coreÚcorer)   Úmlx.nnr   re   r   Úencoderr   ÚModuler	   rO   rc   r•   r¡   © r   r   Ú<module>rÇ      sr   ðñ÷ (Ñ 'å Ý å -Ý 'ô0�2—9‘9ô 0ôf�2—9‘9ô ô&P
�"—)‘)ô P
ôf	4�R—Y‘Yô 	4ô,˜Ÿ	™	ö ,r   