+
    UV-j:  ã                   ó  € R t ^ RIHtHtHtHt ^ RIHt ^ RI	H
t
 ^RIHt ^RIHt ^RIHt ^RIHt ^RIHt ^RIHt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# )zàSAM3 Main Model: Combines detector (DETR-based) + tracker (SAM2-based).

Weight keys:
    detector_model.*  -> self.detector_model.*
    tracker_model.*   -> self.tracker_model.*
    tracker_neck.*    -> self.tracker_neck.*
)ÚDictÚListÚOptionalÚTupleN©ÚModelConfig)ÚDETRDecoder)ÚDETREncoder)ÚGeometryEncoder)ÚPositionEmbeddingSine)ÚDotProductScoringÚMaskDecoder)ÚTextEncoder)ÚTrackerModel)ÚFPNNeckÚVisionEncoderc                   ón   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
V3R lR lltRtVt	V ;t
# )ÚDetectorModelzUSAM3 detection model: vision + text -> DETR -> masks.

Weight keys: detector_model.*
c                ó    <€ V ^8„  d   QhRS[ /# ©é   Úconfigr   )ÚformatÚ__classdict__s   "€Úi/Volumes/fast/ai/experiments/ui-tars-smoke/.venv/lib/python3.14/site-packages/mlx_vlm/models/sam3/sam3.pyÚ__annotate__ÚDetectorModel.__annotate__#   s   ø€ ÷ $
ñ $
™{ñ $
ó    c                óÆ  <€ \         SV `  4        VP                  p\        VP                  4      V n        \        VP                  VP                  P                  R 7      V n
        \        P                  ! VP                  P                  VP                  P                  4      V n        \        VP                  4      V n        \!        VP"                  4      V n        \'        VP(                  4      V n        \-        VP.                  4      V n        \3        VP                  P                  4      V n        \7        VP                  P                  ^,          4      V n        R# ))Úd_modelN)ÚsuperÚ__init__Údetector_configr   Úvision_configÚvision_encoderr   Útext_configÚdetr_encoder_configÚhidden_sizeÚtext_encoderÚnnÚLinearÚtext_projectionr	   Údetr_encoderr   Údetr_decoder_configÚdetr_decoderr
   Úgeometry_encoder_configÚgeometry_encoderr   Úmask_decoder_configÚmask_decoderr   Údot_product_scoringr   Ú_pos_enc)Úselfr   Údet_cfgÚ	__class__s   && €r   r!   ÚDetectorModel.__init__#   s  ø€ Ü‰ÑÔØ×(Ñ(ˆô ,¨G×,AÑ,AÓBˆÔô (Ø×Ñ¨×)DÑ)D×)PÑ)Pô
ˆÔô
  "ŸyšyØ×Ñ×+Ñ+Ø×'Ñ'×3Ñ3ó 
ˆÔô (¨×(CÑ(CÓDˆÔÜ'¨×(CÑ(CÓDˆÔô !0°×0OÑ0OÓ PˆÔô (¨×(CÑ(CÓDˆÔô $5Ø×'Ñ'×3Ñ3ó$
ˆÔ ô
 .Ø×'Ñ'×3Ñ3°qÕ8ó
ˆŽr   c                óx   <€ V ^8„  d   QhRS[ P                  RS[S[ P                  ,          RS[ P                  /# ©r   Ú	input_idsÚattention_maskÚreturn)ÚmxÚarrayr   )r   r   s   "€r   r   r   I   s:   ø€ ÷ 1ñ 1á—8‘8ð1ñ !¡§¡Õ*ð1ñ 
�‰ñ	1r   c                óF   € V P                  W4      pV P                  V4      # )zqEncode text separately (cacheable across frames).

Returns:
    inputs_embeds: (B, T, D) projected text features
)r(   r+   )r5   r;   r<   Útext_hiddens   &&& r   Úget_input_embeddingsÚ"DetectorModel.get_input_embeddingsI   s%   € ð ×'Ñ'¨	ÓBˆØ×#Ñ# KÓ0Ð0r   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   Úpixel_valuesr;   r<   ÚboxesÚinputs_embedsr=   ©r>   r?   r   r   Ústr)r   r   s   "€r   r   r   V   s„   ø€ ÷ [
ñ [
á—h‘hð[
ñ ™BŸH™HÕ%ð[
ñ !¡§¡Õ*ð	[
ñ
 ™Ÿ™Õ!ð[
ñ  ¡§¡Õ)ð[
ñ 
‰c‘2—8‘8ˆmÕ	ñ[
r   c                óî  € VP                   ^ ,          pV P                  V4      pV Uu. uF  q€P                  V4      NK  	  p	pVRR p
V	RR pVf   V P                  W#4      pTpTpV
R,          pVR,          pVP                   w  ppppVP	                  VVV,          V4      pVP	                  VVV,          V4      pV P                  VVWÍ4      pV P                  VVVVVV3R7      w  pppVR,          pVR,          VR,          VR,          VR,          3w  pppp\        P                  ! VV^,          ,
          VV^,          ,
          VV^,          ,           VV^,          ,           .RR7      pV P                  VWÍ4      pVR,          p VR,          p!VR,          p"V P                  V"\        V
4      VVVR7      p#RV P                  R4      RVRV#R,          RV!R	V#P                  R	4      R
VRV/# u upi )z�Matching HF Sam3Model.forward.

Either pass (input_ids, attention_mask) to encode text on the fly,
or pass pre-computed inputs_embeds to skip text encoding.
N)Úvision_featuresrH   Úvision_pos_encodingÚ	text_maskÚspatial_shape)Úaxis)Úencoder_hidden_statesÚprompt_featuresÚprompt_maskÚpred_logitsÚ
pred_boxesÚ
pred_masksÚpresence_logitsÚsemantic_segÚintermediate_hidden_statesrQ   éÿÿÿÿ).é    ).é   ).r   ).é   )Úshaper$   r4   rB   Úreshaper,   r.   r>   Ústackr3   r2   ÚlistÚsqueezeÚget)$r5   rF   r;   r<   rG   rH   ÚBÚfpn_featuresÚfeatÚfpn_posÚfpn_features_trimmedÚfpn_pos_trimmedÚpromptrS   Úencoder_featÚencoder_posÚHÚWÚDÚsrcÚpos_flatÚencodedÚhsÚ	ref_boxesrW   Úpred_boxes_cxcywhÚcxÚcyÚwÚhÚpred_boxes_xyxyÚall_pred_logitsrT   ÚpresenceÚlast_hsÚseg_outs$   &&&&&&                              r   Ú__call__ÚDetectorModel.__call__V   sE  € ð ×Ñ˜qÕ!ˆð ×*Ñ*¨<Ó8ˆñ 4@Ó@±<¨4—=‘= Ö&±<ˆÐ@ð  ,¨C¨RÐ0ÐØ! # 2˜,ˆð Ò Ø ×5Ñ5°iÓPˆMð ˆØ$ˆð ,¨BÕ/ˆØ% bÕ)ˆà!×'Ñ'‰
ˆˆ1ˆa�à×"Ñ" 1 a¨!¥e¨QÓ/ˆØ×&Ñ& q¨!¨a­%°Ó3ˆà×#Ñ# C¨°6ÓGˆð *.×):Ñ):Ø#Ø Ø (Ø!Ø˜a˜&ð *;ó *
Ñ&ˆˆI�ð & b�MÐà˜fÕ%Ø˜fÕ%Ø˜fÕ%Ø˜fÕ%ð	
‰ˆˆB��1ô Ÿ(š(Ø�!�a•%�Z˜˜a !�e� R¨!¨a­%¥Z°°a¸!µeµÐ<À2ô
ˆð
 ×2Ñ2°2°vÓKˆà% bÕ)ˆØ" 2Õ&ˆð �R•&ˆØ×#Ñ#ØÜÐ%Ó&Ø")Ø"Ø#ð $ó 
ˆð ˜;×.Ñ.¨rÓ2Ø˜/Ø˜' ,Õ/Ø˜xØ˜GŸK™K¨Ó7Ø(¨"Ø# Wð
ð 	
ùòA As   ©G2)	r4   r.   r,   r3   r0   r2   r(   r+   r$   ©N©NNNN)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r!   rB   r   Ú__static_attributes__Ú__classdictcell__Ú__classcell__©r7   r   s   @@r   r   r      s1   ù‡ € ñ÷
$
ó $
÷L1ò 1÷[
÷ [
ò [
r   r   c                   óä   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4       tRV3R lR lltRV3R lR	 llt	V3R
 lR lt
RV3R lR lltRV3R lR llt]V3R lR l4       tRtVtV ;t# )ÚModelz½SAM3 full model: detector + tracker.

Weight keys:
    detector_model.*  -> self.detector_model.*
    tracker_model.*   -> self.tracker_model.*
    tracker_neck.*    -> self.tracker_neck.*
c                ó    <€ V ^8„  d   QhRS[ /# r   r   )r   r   s   "€r   r   ÚModel.__annotate__Â   s   ø€ ÷ Iñ I™{ñ Ir   c                óî   <€ \         SV `  4        Wn        VP                  V n        \	        V4      V n        \        VP                  4      V n        \        VP                  P                  4      V n        R # r�   )r    r!   r   Ú
model_typer   Údetector_modelr   Útracker_configÚtracker_modelr   r#   Útracker_neck)r5   r   r7   s   &&€r   r!   ÚModel.__init__Â   s_   ø€ Ü‰ÑÔØŒØ ×+Ñ+ˆŒô ,¨FÓ3ˆÔô *¨&×*?Ñ*?Ó@ˆÔô $ F×$9Ñ$9×$GÑ$GÓHˆÖr   c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r   Úpathr=   )rJ   Úbool)r   r   s   "€r   r   r�   Ñ   s   ø€ ÷ 6ñ 6™cð 6©dñ 6r   c                óØ  a € \         ;QJ d    V 3R lR 4       F  '       g   K   RM	  RM! V 3R lR 4       4      '       d   R# \         ;QJ d    V 3R lR 4       F  '       g   K   RM	  RM! V 3R lR 4       4      '       d   R# \        VR4      '       dS   VP                  P                  p\         ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d   R# R# )	a  Control which layers get quantized.

Skip:
- Vision encoder (keep full precision for accuracy)
- Small embeddings (query_embed, reference_points, presence_token, etc.)
- Conv layers (not supported by quantization)
- Layers with dimensions not divisible by 64
c              3   ó.   <"  € T F
  pVS9   x € K  	  R # 5ir�   © ©Ú.0Úkr˜   s   & €r   Ú	<genexpr>Ú(Model.quant_predicate.<locals>.<genexpr>Û   s    øé € ð 
ñ	�ð �ŽIó	ùó   ƒTFc              3   ó.   <"  € T F
  pVS9   x € K  	  R # 5ir�   rœ   r�   s   & €r   r    r¡   ê   s    øé € ð 
ñ�ð �ŽIóùr¢   Úweightc              3   ó8   "  € T F  q^@,          ^ 8g  x € K  	  R# 5i)é@   Nrœ   )rž   Úds   & r   r    r¡     s   é € Ð.© 1�r•6˜Q–;«ùs   ‚)ÚconvÚ	depthwiseÚmask_downsampleÚpixel_decoderÚinstance_projectionÚsemantic_projectionÚ
fpn_layersÚpatch_embeddings)Úquery_embedÚreference_pointsÚpresence_tokenÚlabel_embedÚ	cls_embedÚpoint_embedÚnot_a_pointÚno_mask_embedÚ	no_memoryÚ	no_objectÚ	iou_tokenÚmask_tokensÚobj_score_tokenÚshared_embeddingÚshared_image_embeddingÚocclusion_spatialÚmemory_temporalÚposition_embedding)ÚanyÚhasattrr¤   r^   )r˜   Úmoduler^   s   f& r   Úquant_predicateÚModel.quant_predicateÐ   s¸   ø€ ÷ ‹3ô 
ñ	ó
�3�3Š3ô 
ñ	ó
÷ 
ò 
ñ ç‹3ô 
ñó
�3�3Š3ô 
ñó
÷ 
ò 
ñ. ä�6˜8×$Ò$Ø—M‘M×'Ñ'ˆEß‹sÑ.©Ó.�s�sŠsÑ.©Ó.×.Ò.ÙÙ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,          /# rE   rI   )r   r   s   "€r   r   r�   	  s|   ø€ ÷ 
ñ 
á—h‘hð
ñ ™BŸH™HÕ%ð
ñ !¡§¡Õ*ð	
ñ
 ™Ÿ™Õ!ð
ñ  ¡§¡Õ)ð
ñ 
‰c‘2—8‘8ˆmÕ	ñ
r   c                ó.   € V P                  VVVVVR7      # )zhRun detection on a single image.

Pass inputs_embeds (from get_input_embeddings) to skip text encoding.
)rH   )r’   )r5   rF   r;   r<   rG   rH   s   &&&&&&r   ÚdetectÚModel.detect	  s+   € ð ×"Ñ"ØØØØØ'ð #ó 
ð 	
r   c                ó¢   <€ V ^8„  d   QhRS[ P                  RS[S[ P                  ,          RS[S[ P                  S[ P                  3,          /# r:   )r>   r?   r   r   )r   r   s   "€r   r   r�     sH   ø€ ÷ -ñ -á—8‘8ð-ñ !¡§¡Õ*ð-ñ 
‰r�x‰x™Ÿ™Ð!Õ	"ñ	-r   c                ój   € V P                   P                  W4      p\        P                  ! V4       W23# )ztEncode text once, reuse across frames.

Returns:
    (inputs_embeds, attention_mask) tuple for passing to detect().
)r’   rB   r>   Úeval)r5   r;   r<   rH   s   &&& r   rB   ÚModel.get_input_embeddings  s4   € ð ×+Ñ+×@Ñ@Øó
ˆô 	�Š�ÔØÐ,Ð,r   c                ó~   <€ V ^8„  d   QhRS[ P                  RS[ P                  RS[S[S[ P                  3,          /# )r   Úbackbone_featuresÚdetection_masksr=   )r>   r?   r   rJ   )r   r   s   "€r   r   r�   -  s>   ø€ ÷ 
ñ 
áŸ8™8ð
ñ Ÿ™ð
ñ 
‰c‘2—8‘8ˆmÕ	ñ	
r   c                ó  € V P                  V4      pV^,          pVP                  w  rVrxVR,          P                  ^ ^^^4      p	V P                  P	                  WI4      p
RV
P                  VRV
P                  R,          4      RV/# )z*Initialize tracker with detection results.ÚmemoryÚfeatures):NNN:Nr\   NrZ   )r•   r^   Ú	transposer”   Úmemory_encoderr_   )r5   rÐ   rÑ   Útracker_fpnrÔ   rd   rm   rn   ro   Ú
mask_inputrÓ   s   &&&        r   Ú
track_initÚModel.track_init-  sŠ   € ð ×'Ñ'Ð(9Ó:ˆØ˜q•>ˆØ—^‘^‰
ˆˆað % UÕ+×5Ñ5°a¸¸A¸qÓAˆ
Ø×#Ñ#×2Ñ2°8ÓHˆð �f—n‘n Q¨¨F¯L©L¸Õ,<Ó=Ø˜ð
ð 	
r   c                ó<  <€ V ^8„  d   QhRS[ P                  RS[S[ P                  ,          RS[S[S[ P                  S[ P                  3,          ,          RS[S[ P                  ,          RS[S[ P                  ,          RS[RS[S[S[ P                  3,          /# )r   rÐ   Úmemory_bankÚprompt_pointsÚprompt_boxesÚprompt_masksÚmultimask_outputr=   )r>   r?   r   r   r   r™   r   rJ   )r   r   s   "€r   r   r�   @  s“   ø€ ÷ 
ñ 
áŸ8™8ð
ñ ™"Ÿ(™(•^ð
ñ  ¡¡b§h¡h±·±Ð&8Õ 9Õ:ð	
ñ
 ™rŸx™xÕ(ð
ñ ™rŸx™xÕ(ð
ñ ð
ñ 
‰c‘2—8‘8ˆmÕ	ñ
r   c           
     óÂ   € V P                  V4      pV^,          p\        V4      ^8”  d   V^ ,          V^,          .MRp	V P                  P                  VVVVVVV	R7      # )zRun one tracking step.N)Úcurrent_featuresrÜ   rÝ   rÞ   rß   rà   Úhigh_res_features)r•   Úlenr”   Ú
track_step)
r5   rÐ   rÜ   rÝ   rÞ   rß   rà   r×   rÔ   Úhigh_ress
   &&&&&&&   r   rå   ÚModel.track_step@  st   € ð ×'Ñ'Ð(9Ó:ˆØ˜q•>ˆô 8;¸;Ó7GÈ!Ô7K�K •N K°¥NÑ3ÐQUˆà×!Ñ!×,Ñ,Ø%Ø#Ø'Ø%Ø%Ø-Ø&ð -ó 
ð 	
r   c          
      ó¸   <€ V ^8„  d   QhRS[ P                  RS[S[ P                  ,          RS[S[ P                  ,          RS[S[S[ P                  3,          /# )r   rF   r;   r<   r=   rI   )r   r   s   "€r   r   r�   Z  s\   ø€ ÷ Nñ Ná—h‘hðNñ ™BŸH™HÕ%ðNñ !¡§¡Õ*ð	Nñ 
‰c‘2—8‘8ˆmÕ	ñNr   c                ó†   € Ve"   V P                  WW4P                  R4      4      # RV P                  P                  V4      /# )zDefault forward: run detection.rG   rÔ   )rÉ   rc   r’   r$   )r5   rF   r;   r<   Úkwargss   &&&&,r   r   ÚModel.__call__Z  sG   € ð Ò Ø—;‘;Ø¨¿¹ÀGÓ9Lóð ð ˜D×/Ñ/×>Ñ>¸|ÓLÐMÐMr   c                óz   <€ V ^8„  d   QhRS[ S[S[P                  3,          RS[ S[S[P                  3,          /# )r   Úweightsr=   )r   rJ   r>   r?   )r   r   s   "€r   r   r�   j  s5   ø€ ÷ ?ñ ?™$™s¡B§H¡H˜}Õ-ð ?±$±s¹B¿H¹H°}Õ2Eñ ?r   c                óâ  a€ / pRR.p. ROpR.pV P                  4        FÌ  w  opVP                  ^8X  d²   \        ;QJ d    V3R lV 4       F  '       g   K   RM	  RM! V3R lV 4       4      '       d   WQS&   K]  \        ;QJ d    V3R lV 4       F  '       g   K   RM	  RM! V3R lV 4       4      pV'       d   VP                  ^^^^ 4      pMVP                  ^ ^^^4      pWQS&   KÎ  	  V# )	zÃConvert HuggingFace PyTorch weights to MLX format.

Main conversions:
1. Conv2d: PyTorch [out, in, H, W] -> MLX [out, H, W, in]
2. ConvTranspose2d: PyTorch [in, out, H, W] -> MLX [out, H, W, in]
zscale_layers.Úupscale_convÚ#memory_temporal_positional_encodingc              3   ó,   <"  € T F	  qS9   x € K  	  R # 5ir�   rœ   ©rž   ÚpÚkeys   & €r   r    Ú!Model.sanitize.<locals>.<genexpr>—  s   øé € ÐAÑ)@ A˜C–xÓ)@ùó   ƒTFc              3   ó,   <"  € T F	  qS9   x € K  	  R # 5ir�   rœ   rò   s   & €r   r    rõ   œ  s   øé € Ð'RÑ:Q°Q¨S®Ó:Qùrö   )zprojection.weightzproj1.weightzproj2.weightz.conv.zconv_layers.zinstance_projection.zsemantic_projection.zfeature_projection.zfinal_conv.zconv_s0.zconv_s1.zdepthwise_conv.zmask_downsample.zconv1.zconv2.zconv3.zboxes_pool_project.)ÚitemsÚndimrÂ   rÕ   )rí   Ú	sanitizedÚconv_transpose_patternsÚconv2d_patternsÚskip_transpose_patternsÚvalueÚis_conv_transposerô   s   &      @r   ÚsanitizeÚModel.sanitizei  sß   ø€ ð ˆ	ð Øð#
Ðò
ˆð, 2ð#
Ðð "Ÿ-™-ž/‰JˆC�Ø�z‰z˜QŒç“3ÔAÑ)@ÓA—3—3’3ÔAÑ)@ÓA×AÒAØ%*˜c‘NÙ÷ %(£CÔ'RÑ:QÓ'R§C§C¢CÔ'RÑ:QÓ'RÓ$RÐ!ç$ð "ŸO™O¨A¨q°!°QÓ7‘Eð "ŸO™O¨A¨q°!°QÓ7�Eà"�c‹Nñ' *ð* Ðr   )r   r’   r‘   r”   r•   r‚   r�   )NNNF)NN)rƒ   r„   r…   r†   r‡   r!   ÚstaticmethodrÅ   rÉ   rB   rÙ   rå   r   r   rˆ   r‰   rŠ   r‹   s   @@r   r�   r�   ¹   sx   ù‡ € ñ÷Ió Ið ÷6ó ð6÷p
ò 
÷(-ò -÷ 
ð 
÷&
ò 
÷4Nò Nð ÷?ó ÷?ð ?r   r�   )"r‡   Útypingr   r   r   r   Úmlx.coreÚcorer>   Úmlx.nnr)   r   r   Údecoderr   Úencoderr	   Úgeometryr
   Úpositionr   Úsegmentationr   r   r(   r   Útrackerr   Úvisionr   r   ÚModuler   r�   rœ   r   r   Ú<module>r     sX   ðñ÷ /Ó .å Ý å Ý  Ý  Ý %Ý +ß 8Ý %Ý !ß *ôT
�B—I‘Iô T
ôxpˆB�I‰Iö pr   