+
    UV-jª  ã                   ój   € ^ RI t ^ RIHt ^ RIHt  ! R R4      t ! R R4      tR R lt/ t	R	 R
 lt
R# )é    N)ÚAnyc                   ó¨   a € ] tR t^t o RtV 3R lR ltV 3R lR ltR tV 3R lR ltV 3R	 lR
 lt	V 3R lR lt
V 3R lR ltV 3R lR ltRtV tR# )ÚLLGuidanceLogitsProcessorzÊMLX logits processor backed by llguidance.

Accepts a single sequence or a batch. Expected shapes are input_ids as
(seq_len,) or (batch, seq_len), and logits as (vocab,), (1, vocab), or
(batch, vocab).
c                ó$   <€ V ^8„  d   QhRS[ RR/# )é   ÚgrammarÚreturnN)Ústr)ÚformatÚ__classdict__s   "€Úc/Volumes/fast/ai/experiments/ui-tars-smoke/.venv/lib/python3.14/site-packages/mlx_vlm/structured.pyÚ__annotate__Ú&LLGuidanceLogitsProcessor.__annotate__   s   ø€ ÷ #ñ #¡ð #°tñ #ó    c                ó,   € Wn         W n        R V n        R# ©TN)r   Úllg_tokenizerÚis_first_token)Úselfr   r   s   &&&r   Ú__init__Ú"LLGuidanceLogitsProcessor.__init__   s   € ØŒØ*ÔØ"ˆÖr   c                ó   <€ V ^8„  d   QhRR/# )r   r	   r   © )r   r   s   "€r   r   r      s   ø€ ÷ Kñ KÐ2ñ Kr   c                óB   € \        V P                  V P                  4      # ©N)r   r   r   ©r   s   &r   ÚcloneÚLLGuidanceLogitsProcessor.clone   s   € Ü(¨¯©°t×7IÑ7IÓJÐJr   c                ó0   € R V n         RV n        RV n        R# r   )r   Úll_matchersÚbitmaskr   s   &r   ÚresetÚLLGuidanceLogitsProcessor.reset   s   € Ø"ˆÔØˆÔØˆŽr   c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   Ú
batch_sizer	   N)Úint)r   r   s   "€r   r   r      s   ø€ ÷ 

ñ 

¡ð 

¨ñ 

r   c                ó  € ^ RI p^ RIp^ RI Hp \        V4       Uu. uF  qC! V P                  V P
                  4      NK!  	  upV n        VP                  P                  WP                  P                  4      V n
        R# u upi )r   N)Ú	LLMatcher)Ú
llguidanceÚllguidance.numpyr(   Úranger   r   r    ÚnumpyÚallocate_token_bitmaskÚ
vocab_sizer!   )r   r%   r)   r(   Ú_s   &&   r   Ú_setupÚ LLGuidanceLogitsProcessor._setup   sp   € ÛÛÝ(ô BGÀzÔARó
ÙAR¸AˆI�d×(Ñ(¨$¯,©,Ö7ÑARñ
ˆÔð "×'Ñ'×>Ñ>Ø×*Ñ*×5Ñ5ó
ˆŽùò
s   œ%A?c                ó4   <€ V ^8„  d   QhRS[ S[,          RR/# )r   Úlast_tokensr	   N)Úlistr&   )r   r   s   "€r   r   r   (   s#   ø€ ÷ Gñ G©4±­9ð G¸ñ Gr   c                óà   € \        V4       F^  w  r#V P                  V,          P                  V4       V P                  V,          P                  4       pV'       g   KR  \	        R V 24      h	  R# )zLLGuidance matcher error: N)Ú	enumerater    Úconsume_tokenÚ	get_errorÚ
ValueError)r   r3   ÚiÚ
last_tokenÚerrors   &&   r   Ú_consume_tokensÚ)LLGuidanceLogitsProcessor._consume_tokens(   s]   € Ü& {Ö3‰MˆAØ×Ñ˜QÕ×-Ñ-¨jÔ9Ø×$Ñ$ QÕ'×1Ñ1Ó3ˆEß‰uÜ Ð#=¸e¸WÐ!EÓFÐFó	 4r   c                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# )r   Úlogitsr	   ©ÚmxÚarray)r   r   s   "€r   r   r   /   s#   ø€ ÷ 
ñ 
¡R§X¡Xð 
±"·(±(ñ 
r   c                óp  € ^ RI p^ RIp. p\        VP                  ^ ,          4       FÅ  pVP                  P                  V P                  V,          V P                  V4       \        P                  ! VP                  P                  W,          V P                  V,          4      4      pVP                  ^8X  d"   VP                  ^ ,          ^8X  d
   V^ ,          pVP                  V4       KÇ  	  \        P                  ! V Uu. uF   p\        P                  ! V4      R,          NK"  	  up^ R7      # u upi )r   N)Úaxis)NºNNN)Úllguidance.mlxr*   r+   Úshaper,   Úfill_next_token_bitmaskr    r!   rB   rC   ÚmlxÚapply_token_bitmaskÚndimÚappendÚconcatenate)r   r@   r)   Úbiased_logitsr:   ÚrowÚlogits   &&     r   Ú_apply_bitmaskÚ(LLGuidanceLogitsProcessor._apply_bitmask/   sé   € ÛÛàˆÜ�v—|‘| A•Ö'ˆAØ×Ñ×4Ñ4Ø× Ñ  Õ# T§\¡\°1ôô —(’(Ø—‘×2Ñ2°6µ9¸d¿l¹lÈ1½oÓNóˆCð �x‰x˜1Œ} §¡¨1¥°Ô!2Ø˜!•f�Ø× Ñ  Ö%ñ (ô �~Š~Ù3@ÓA±=¨%ŒR�XŠX�e‹_˜W×%Ð%±=ÑAÈô
ð 	
ùÚAs   Ä&D3c                óT   <€ V ^8„  d   QhRS[ RS[P                  RS[P                  /# ©r   r;   r@   r	   ©r&   rB   rC   )r   r   s   "€r   r   r   B   s*   ø€ ÷ 
+ñ 
+©Sð 
+¹"¿(¹(ð 
+ÁrÇxÁxñ 
+r   c                ó>  € VP                   ^8X  d/   V P                  V\        P                  ! V^ 4      4      ^ ,          # V P                  '       d+   V P                  VP                  ^ ,          4       RV n        MV P                  V.4       V P                  V4      # )é   F)	rL   Úprocess_last_tokenrB   Úexpand_dimsr   r0   rH   r=   rR   ©r   r;   r@   s   &&&r   rY   Ú,LLGuidanceLogitsProcessor.process_last_tokenB   s{   € Ø�;‰;˜!ÔØ×*Ñ*¨:´r·~²~ÀfÈaÓ7PÓQÐRSÕTÐTà××ÐØ�K‰K˜Ÿ™ Q�Ô(Ø"'ˆDÕà× Ñ  * Ô.à×"Ñ" 6Ó*Ð*r   c                óh   <€ V ^8„  d   QhRS[ P                  RS[ P                  RS[ P                  /# ©r   Ú	input_idsr@   r	   rA   )r   r   s   "€r   r   r   N   s.   ø€ ÷ +ñ +¡"§(¡(ð +±B·H±Hð +ÁÇÁñ +r   c                ó&  € VP                   ^8X  dB   VP                   ^8X  d1   VP                  ^ ,          ^8X  d   \        P                  ! V^ 4      pMKVP                   ^8X  d;   V ! \        P                  ! V^ 4      \        P                  ! V^ 4      4      ^ ,          # VP                  ^ ,          pV P                  '       d   V P                  V4       RV n        M&V P                  VR,          P                  4       4       V P                  V4      # )rX   F)rF   éÿÿÿÿ)	rL   rH   rB   rZ   r   r0   r=   ÚtolistrR   )r   r_   r@   r%   s   &&& r   Ú__call__Ú"LLGuidanceLogitsProcessor.__call__N   sÈ   € Ø�>‰>˜QÔ 6§;¡;°!Ô#3¸¿¹ÀQ½È1Ô8LÜŸš y°!Ó4‰IØ�[‰[˜AÔÙœŸš y°!Ó4´b·n²nÀVÈQÓ6OÓPÐQRÕSÐSà—_‘_ QÕ'ˆ
Ø××ÐØ�K‰K˜
Ô#Ø"'ˆDÕà× Ñ  ¨5Õ!1×!8Ñ!8Ó!:Ô;à×"Ñ" 6Ó*Ð*r   )r!   r   r   r    r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r   r"   r0   r=   rR   rY   rc   Ú__static_attributes__Ú__classdictcell__©r   s   @r   r   r      sY   ø‡ € ñ÷#ð #÷
Kð Kò÷


ð 

÷Gð G÷
ð 
÷&
+ð 
+÷+ö +r   r   c                   ó¬   a € ] tR t^^t o RtRV 3R lR lltV 3R lR ltR tV 3R lR ltV 3R	 lR
 lt	V 3R lR lt
V 3R lR ltV 3R lR ltRtV tR# )ÚThinkingAwareLogitsProcessora[  Delay a logits processor until model thinking has ended.

Structured grammars constrain the final answer, not the private thinking
tokens. This wrapper keeps the wrapped processor inactive until it observes
the configured thinking end token, then lets the wrapped processor constrain
the next sampled token as the first token of the final answer.
c                ó0   <€ V ^8„  d   QhRS[ RS[ RS[RR/# )r   Úthinking_start_tokenÚthinking_end_tokenÚenable_thinkingr	   N)r
   Úbool)r   r   s   "€r   r   Ú)ThinkingAwareLogitsProcessor.__annotate__g   s5   ø€ ÷ ñ ñ "ð	ñ
  ðñ ðð 
ñr   c                óä   € Wn         W n        W0n        W@n        WPn        V'       * V n        . V n        VP                  VR R7      R,          V n        VP                  VR R7      R,          V n	        R# )F)Úadd_special_tokensNra   )
Ú	processorÚ	tokenizerrp   rq   rr   Ú_activeÚ_active_contextÚencodeÚthinking_start_token_idÚthinking_end_token_id)r   rw   rx   rp   rq   rr   s   &&&&&&r   r   Ú%ThinkingAwareLogitsProcessor.__init__g   s~   € ð #ŒØ"ŒØ$8Ô!Ø"4ÔØ.ÔØ*Ô*ˆŒØ*,ˆÔà'0×'7Ñ'7Ø °Uð (8ó (
à
õ(ˆÔ$ð &/×%5Ñ%5Ø°5ð &6ó &
à
õ&ˆÖ"r   c                ó   <€ V ^8„  d   QhRR/# )r   r	   rn   r   )r   r   s   "€r   r   rt   ~   s   ø€ ÷ 
ñ 
Ð5ñ 
r   c                óö   € \        V P                  R 4      '       d   V P                  P                  4       MV P                  p\        VV P                  V P
                  V P                  V P                  R7      # )r   )rw   rx   rp   rq   rr   )Úhasattrrw   r   rn   rx   rp   rq   rr   )r   rw   s   & r   r   Ú"ThinkingAwareLogitsProcessor.clone~   sg   € ô �t—~‘~ w×/Ò/ð �N‰N× Ñ Ô"à—‘ð 	ô
 ,ØØ—n‘nØ!%×!:Ñ!:Ø#×6Ñ6Ø ×0Ñ0ô
ð 	
r   c                ó°   € V P                   '       * V n        . V n        \        V P                  R 4      '       d   V P                  P                  4        R# R# )r"   N)rr   ry   rz   r�   rw   r"   r   s   &r   r"   Ú"ThinkingAwareLogitsProcessor.resetŒ   s@   € Ø×/Ñ/Ô/ˆŒØ!ˆÔÜ�4—>‘> 7×+Ò+Ø�N‰N× Ñ Ö"ñ ,r   c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r   Útoken_idr	   )r&   rs   )r   r   s   "€r   r   rt   ’   s   ø€ ÷ ñ ±3ð ¹4ñ r   c                ón   € V P                   '       d   R # WP                  8X  d   RV n         . V n        R# R # )FT)ry   r}   rz   )r   r†   s   &&r   Ú_activate_if_thinking_doneÚ7ThinkingAwareLogitsProcessor._activate_if_thinking_done’   s/   € Ø�<�<ˆ<ÙØ×1Ñ1Ô1ØˆDŒLØ#%ˆDÔ ÙÙr   c                óT   <€ V ^8„  d   QhRS[ RS[P                  RS[P                  /# rU   rV   )r   r   s   "€r   r   rt   ›   s2   ø€ ÷ Fñ FÙðFÙ')§x¡xðFá	�‰ñFr   c                ó  € \        V P                  R 4      '       d   V P                  P                  W4      # V P                  P	                  V4       V P                  \
        P                  ! V P                  4      V4      # )rY   )r�   rw   rY   rz   rM   rB   rC   r[   s   &&&r   Ú_delegate_process_last_tokenÚ9ThinkingAwareLogitsProcessor._delegate_process_last_token›   s_   € ô �4—>‘>Ð#7×8Ò8Ø—>‘>×4Ñ4°ZÓHÐHà×Ñ×#Ñ# JÔ/Ø�~‰~œbŸhšh t×';Ñ';Ó<¸fÓEÐEr   c                óT   <€ V ^8„  d   QhRS[ RS[P                  RS[P                  /# rU   rV   )r   r   s   "€r   r   rt   ¤   s/   ø€ ÷ Eñ E©Sð E¹"¿(¹(ð EÁrÇxÁxñ Er   c                ó    € V P                   '       g-   V P                  V4      pV'       g   V# V P                  W4      # V P                  W4      # r   )ry   rˆ   rŒ   )r   r;   r@   Ú	activateds   &&& r   rY   Ú/ThinkingAwareLogitsProcessor.process_last_token¤   sE   € Ø�|�|ˆ|Ø×7Ñ7¸
ÓCˆIßØ�Ø×4Ñ4°ZÓHÐHà×0Ñ0°ÓDÐDr   c                óH   <€ V ^8„  d   QhRS[ P                  RS[R,          /# )r   r_   r	   N)rB   rC   r&   )r   r   s   "€r   r   rt   ­   s'   ø€ ÷ 	Mñ 	M±B·H±Hð 	MÁÀtÅñ 	Mr   c                ó¢  € VP                   ^ 8X  d   \        VP                  4       4      # VP                   ^8X  d;   VP                  ^ ,          ^ 8X  d   R# \        VR,          P                  4       4      # VP                  R,          ^ 8X  d   R# \        VP	                  RVP                  R,          4      R,          P                  4       4      # )r   Nra   )r   ra   )rL   r&   ÚitemrH   Úreshape)r   r_   s   &&r   Ú_last_token_from_input_idsÚ7ThinkingAwareLogitsProcessor._last_token_from_input_ids­   s›   € Ø�>‰>˜QÔÜ�y—~‘~Ó'Ó(Ð(Ø�>‰>˜QÔØ�‰˜qÕ! QÔ&ÙÜ�y •}×)Ñ)Ó+Ó,Ð,Ø�?‰?˜2Õ !Ô#ÙÜ�9×$Ñ$ R¨¯©¸Õ)<Ó=¸eÕD×IÑIÓKÓLÐLr   c                óh   <€ V ^8„  d   QhRS[ P                  RS[ P                  RS[ P                  /# r^   rA   )r   r   s   "€r   r   rt   ¸   s.   ø€ ÷ ñ ¡"§(¡(ð ±B·H±Hð ÁÇÁñ r   c                óÆ   € V P                   '       d   V P                  W4      # V P                  V4      pVe)   V P                  V4      '       d   V P                  W4      # V# r   )ry   rw   r–   rˆ   )r   r_   r@   r†   s   &&& r   rc   Ú%ThinkingAwareLogitsProcessor.__call__¸   sT   € Ø�<�<ˆ<Ø—>‘> )Ó4Ð4à×2Ñ2°9Ó=ˆØÒ D×$CÑ$CÀH×$MÒ$MØ—>‘> )Ó4Ð4àˆr   )	ry   rz   rr   rw   rq   r}   rp   r|   rx   N)z<think>z</think>F)re   rf   rg   rh   ri   r   r   r"   rˆ   rŒ   rY   r–   rc   rj   rk   rl   s   @r   rn   rn   ^   s[   ø‡ € ñ÷ò ÷.
ð 
ò#÷ð ÷Fð F÷Eð E÷	Mð 	M÷ö r   rn   c                óh   € V ^8„  d   QhR\         \        \         \        3,          ,          R\         /# )r   Úschemar	   ©r
   Údictr   )r   s   "r   r   r   Ã   s'   € ÷ ñ œc¤D¬¬c¨¥NÕ2ð ´sñ r   c                 ó^   € \        V \        4      '       d   V # \        P                  ! V 4      # r   )Ú
isinstancer
   ÚjsonÚdumps)rœ   s   &r   Ú_serialize_schemar£   Ã   s#   € Ü�&œ#×ÒØˆÜ�:Š:�fÓÐr   c                ó\   € V ^8„  d   QhR\         \        \         \        3,          ,          /# )r   rœ   r�   )r   s   "r   r   r   Î   s    € ÷ =ñ =¼#ÄÄSÌ#ÀXÅÕ:Nñ =r   c                 óª  €  ^ RI p^ RIp\        P	                  \        T 4      4      pTf.   TP                  P                  T 4      pT\        \        T 4      &   \        T4      p\        TR4      '       d$   TP                  RRR7      P                  T4      pMTP                  RT4      p\        Yu4      #   \         d   p\        R4      ThRp?ii ; i)r   Nzlllguidance is required for structured response_format generation. Install mlx-vlm with llguidance available.ÚJsonCompilerÚ )Ú
separatorsÚwhitespace_patternÚjson_schema)z, z: )r)   Úllguidance.hfÚImportErrorÚ_llg_tokenizer_cacheÚgetÚidÚhfÚfrom_tokenizerr£   r�   r¦   ÚcompileÚgrammar_fromr   )rx   rœ   Úllgr)   Úexcr   Úschema_textr   s   &&      r   Ú"build_json_schema_logits_processorr·   Î   sÕ   € ðÛ Ûô )×,Ñ,¬R°	«]Ó;€MØÒØ"Ÿ™×4Ñ4°YÓ?ˆØ.;ÔœR 	›]Ñ+ä# FÓ+€KÜˆs�N×#Ò#Ø×"Ñ"Ø#Ø!ð #ó 
÷ ‰'�+Ó
ñ 	ð
 ×"Ñ" =°+Ó>ˆÜ$ WÓ<Ð<øô' ô Üð9ó
ð ð	ûðús   ‚B6 Â6CÃCÃC)r¡   Útypingr   Úmlx.coreÚcorerB   r   rn   r£   r­   r·   r   r   r   Ú<module>r»      s:   ðÛ Ý å ÷T+ñ T+÷nbñ bõJð Ð ÷=r   