+
    UV-j•  ã                   ó~   € R t ^ RIt^ RIt^ RIt^ RIHtHt R R ltR R ltR R lt	 ! R	 R
4      t
 ! R R4      tR# )a]  Live unmasking visualization for masked-diffusion language models.

Single source of truth for the terminal rendering shared by the diffusion
models: display-width-exact word wrapping, a flash-free in-place canvas
redrawer with redraw throttling and alternate-screen escalation, and a
token-canvas visualizer used by the nemotron_labs_diffusion and llada2_moe
models. The diffusion_gemma package builds its text-stream visualizer on
the same ``_CanvasRedrawer``.

Rendering lives with the models; the shared generation engine in
``mlx_vlm.generate.diffusion`` keeps its own draft-text redrawer untouched.
N)ÚAnyÚOptionalc                ó0   € V ^8„  d   QhR\         R\        /# )é   ÚtextÚreturn©ÚstrÚint)Úformats   "Út/Volumes/fast/ai/experiments/ui-tars-smoke/.venv/lib/python3.14/site-packages/mlx_vlm/models/diffusion_visualizer.pyÚ__annotate__r      s   € ÷ ñ œð ¤ñ ó    c                 ó¤   € ^ pV  FG  p\         P                  ! V4      '       d   K!  T\         P                  ! V4      R9   d   ^M^,          pKI  	  V# )é    )ÚFÚW)ÚunicodedataÚ	combiningÚeast_asian_width)r   ÚwidthÚchars   &  r   Ú_display_widthr      sJ   € Ø€EÛˆÜ× Ò  ×&Ò&ÙØ”k×2Ò2°4Ó8¸JÔF‘ÈAÕMŠñ ð €Lr   c                ó<   € V ^8„  d   QhR\         R\        R\         /# ©r   r   r   r   r   )r   s   "r   r   r      s!   € ÷ 	ñ 	œcð 	¬#ð 	´#ñ 	r   c                 ó–   € R p^ pV  F-  p\        V4      pW5,           V8”  d    MW$,          pW5,          pK/  	  T;'       g
    V R,          # )Ú :Né   N)r   )r   r   ÚtakenÚtaken_widthr   Ú
char_widths   &&    r   Ú_take_display_widthr!      sQ   € Ø€EØ€KÛˆÜ# DÓ)ˆ
ØÕ# eÔ+ÙØ�ˆØÕ!Šñ ð ×Ð�D˜•HÐr   c                ó<   € V ^8„  d   QhR\         R\        R\         /# r   r   )r   s   "r   r   r   )   s!   € ÷ $ñ $”Sð $¤ð $¬ñ $r   c                ó  € . pV P                  R4       Fß  pRp^ pVP                  R4       F²  p\        V4      pV'       d   ^M^ pWX,           V,           V8:  d+   YH'       d   RMRV,           ,          pWXV,           ,          pKX  V'       d   VP                  V4       Wq8”  d8   \        Wa4      p	VP                  V	4       V\	        V	4      R p\        V4      pK=  TpTpK´  	  VP                  V4       Ká  	  RP                  V4      # )zøWord-wrap ``text`` so every line fits in ``width`` display columns.

Wrapping must be display-width exact: the redrawer counts one terminal row
per line, so a line that overflows would desynchronize the cursor-up
redraws and corrupt the animation.
Ú
r   Ú N)Úsplitr   Úappendr!   ÚlenÚjoin)
r   r   Úwrapped_linesÚraw_lineÚlineÚ
line_widthÚwordÚ
word_widthÚ	separatorÚheads
   &&        r   Ú
_wrap_textr2   )   só   € ð €MØ—J‘J˜tÖ$ˆØˆØˆ
Ø—N‘N 3Ö'ˆDÜ'¨Ó-ˆJß!™ qˆIØÕ%¨
Õ2°eÔ;Ø¦	™¨r°TÕ9Õ9�Ø¨*Õ4Õ4�
ÙßØ×$Ñ$ TÔ*ØÔ$Ü*¨4Ó7�Ø×$Ñ$ TÔ*ØœC ›I˜KÐ(�Ü+¨DÓ1’
ØˆDØ#ŠJñ (ð  	×Ñ˜TÖ"ñ' %ð( �9‰9�]Ó#Ð#r   c                   ó    a € ] tR t^Ht o RtRV 3R lR lltV 3R lR ltV 3R lR ltV 3R lR	 ltR
RRR/V 3R lR llt	V 3R lR lt
RtV tR# )Ú_CanvasRedrawerae  In-place canvas redrawer with alternate-screen support.

Overwrites the previous frame line by line in a single buffered write, so
frames update without a clear-then-reprint flash. When the canvas grows
taller than the terminal, switches to the alternate screen buffer (hiding
the cursor) and shows the tail of the canvas; ``finish()`` restores the
screen.
c                ó    <€ V ^8„  d   QhRS[ /# )r   Úmin_interval)Úfloat)r   Ú__classdict__s   "€r   r   Ú_CanvasRedrawer.__annotate__R   s   ø€ ÷ !ñ !¡Uñ !r   c                óJ   € ^ V n         RV n        Wn        RV n        RV n        R# )r   Fg        N)ÚrowsÚalternate_screenr6   Ú
_last_drawÚ_last_canvas)Úselfr6   s   &&r   Ú__init__Ú_CanvasRedrawer.__init__R   s&   € ØˆŒ	Ø %ˆÔØ(ÔØˆŒØ ˆÖr   c                ó    <€ V ^8„  d   QhRS[ /# ©r   r   )Úbool)r   r8   s   "€r   r   r9   Y   s   ø€ ÷ Iñ I™4ñ Ir   c                óh   € \         P                  ! 4       V P                  ,
          V P                  8  # ©N)ÚtimeÚperf_counterr=   r6   ©r?   s   &r   Ú	throttledÚ_CanvasRedrawer.throttledY   s%   € Ü× Ò Ó" T§_¡_Õ4°t×7HÑ7HÑHÐHr   c                ó    <€ V ^8„  d   QhRS[ /# rC   )r	   )r   r8   s   "€r   r   r9   \   s   ø€ ÷ 2ñ 2™cñ 2r   c                ó’   € V P                   '       d   R # V P                  ^ 8:  d   R# RRV P                  ^,
          ,          ,           # )z[HÚz[1A)r<   r;   rI   s   &r   Ú_frame_startÚ_CanvasRedrawer._frame_start\   s7   € Ø× × Ð ÙØ�9‰9˜Œ>ÙØ�i 4§9¡9¨q¥=Õ1Õ1Ð1r   c                ó   <€ V ^8„  d   QhRR/# ©r   r   N© )r   r8   s   "€r   r   r9   c   s   ø€ ÷ ñ �tñ r   c                ó¤   € V P                   ^ 8:  d   V P                  '       g   R# \        V P                  4       R,           RRR7       ^ V n         R# )r   Nú[0Jr   T©ÚendÚflush)r;   r<   ÚprintrO   rI   s   &r   ÚclearÚ_CanvasRedrawer.clearc   s<   € Ø�9‰9˜Œ> $×"7×"7Ð"7ÙÜˆd×ÑÓ! IÕ-°2¸TÕBØˆŽ	r   Ú
wrap_widthNÚforceFc                ó@   <€ V ^8„  d   QhRS[ RS[S[,          RS[RR/# )r   r   r\   r]   r   N)r	   r   r
   rD   )r   r8   s   "€r   r   r9   i   s1   ø€ ÷  #ñ  #Ùð #Ù(0±­ð #ÙEIð #à	ñ #r   c               óŽ  € \         P                  ! 4       pV'       g$   W@P                  ,
          V P                  8  d   R # \        P
                  ! R4      p\        ^VP                  ^,
          4      pVe   V^ 8”  d   \        Wb4      p\        W4      pV'       g   WpP                  8X  d   R # VP                  R4      p\        ^VP                  ^,
          4      p	. p
\        V4      V	8¼  d2   V P                  '       g    V
P                  R4       RV n        ^ V n        V P                  '       d   \        V4      V	8”  d   W‰) R  pV
P                  V P#                  4       4       RP%                  R V 4       4      R,           p\'        RP%                  V
4      V,           RRR7       \        V4      V n        W@n        Wpn
        R # )	Nr$   z[?1049h[?25l[H[2JTc              3   ó,   "  € T F
  pR V 2x € K  	  R# 5i)z[2KNrS   )Ú.0r,   s   & r   Ú	<genexpr>Ú'_CanvasRedrawer.draw.<locals>.<genexpr>…   s   é € Ð=±u¨t˜G D 6Õ*³uùs   ‚rU   r   rV   )éx   é   )rG   rH   r=   r6   ÚshutilÚget_terminal_sizeÚmaxÚcolumnsÚminr2   r>   r&   Úlinesr(   r<   r'   r;   rO   r)   rY   )r?   r   r\   r]   ÚnowÚterminal_sizer   Úcanvasrk   Úmax_rowsÚcontrolsÚframes   &&$$        r   ÚdrawÚ_CanvasRedrawer.drawi   sd  € ô ×ÒÓ!ˆß˜Ÿ™Õ.°×1BÑ1BÔBÙÜ×0Ò0°Ó;ˆÜ�B˜×-Ñ-°Õ1Ó2ˆØÒ! j°1¤nÜ˜Ó*ˆEÜ˜DÓ(ˆß˜×#4Ñ#4Ô4Ùà—‘˜TÓ"ˆÜ�q˜-×-Ñ-°Õ1Ó2ˆØˆÜˆu‹:˜Ô!¨$×*?×*?Ð*?Ø�O‰OÐ?Ô@Ø$(ˆDÔ!ØˆDŒIØ× × Ð ¤S¨£Z°(Ô%:Ø˜)˜*Ð%ˆEð
 	�‰˜×)Ñ)Ó+Ô,Ø—	‘	Ñ=±uÓ=Ó=À	ÕIˆÜˆb�g‰g�hÓ %Õ'¨R°tÕ<Ü˜“JˆŒ	ØŒØ"Ör   c                ó   <€ V ^8„  d   QhRR/# rR   rS   )r   r8   s   "€r   r   r9   ‹   s   ø€ ÷ !ñ !˜ñ !r   c                ó’   € V P                   '       d   \        R RRR7       RV n         ^ V n        MV P                  4        RV n        R# )z[?25h[?1049lr   TrV   FN)r<   rY   r;   rZ   r>   rI   s   &r   ÚfinishÚ_CanvasRedrawer.finish‹   s;   € Ø× × Ð ÜÐ(¨b¸Õ=Ø$)ˆDÔ!ØˆD�Ià�J‰JŒLØ ˆÖr   )r>   r=   r<   r6   r;   )gš™™™™™©?)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r@   rJ   rO   rZ   rr   rv   Ú__static_attributes__Ú__classdictcell__©r8   s   @r   r4   r4   H   sY   ø‡ € ñ÷!ò !÷Ið I÷2ð 2÷ð ð #Ø8<ð #ØLQ÷ #ò  #÷D!ö !r   r4   c                   ó€   a € ] tR t^•t o RtRRRRRR/V 3R lR	 lltV 3R
 lR ltV 3R lR ltRV 3R lR lltRt	V t
R# )ÚDiffusionUnmaskingVisualizeraŸ  Throttled in-place terminal view of a diffusion canvas being unmasked.

``visualize`` takes the ``(1, length)`` token canvas of the sequence
generated so far. Only tokens that changed since the previous frame are
re-decoded; everything after the first end-of-sequence token renders as
``[MASK]``. All printing is skipped when ``active`` is false, so callers
only need to guard work done to build the canvas itself.
Ú	tokenizerNÚskip_special_tokensFr6   gš™™™™™¹?c          
      óH   <€ V ^8„  d   QhRS[ RS[RS[S[,          RS[ RS[/# )r   ÚactiveÚmask_idr‚   rƒ   r6   )rD   r
   r   r   r7   )r   r8   s   "€r   r   Ú)DiffusionUnmaskingVisualizer.__annotate__Ÿ   sC   ø€ ÷ ñ ñ ðñ ð	ñ ™C•=ðñ "ðñ ñr   c               ó€   € Wn         W n        W0n        W@n        WPn        \        VR 7      V n        RV n        RV n        R# ))r6   N)	r…   r†   Úeos_token_idsr‚   rƒ   r4   ÚredrawerÚ	token_idsÚpieces)r?   r…   r†   r‰   r‚   rƒ   r6   s   &$$$$$$r   r@   Ú%DiffusionUnmaskingVisualizer.__init__Ÿ   s9   € ð ŒØŒØ*ÔØ"ŒØ#6Ô Ü'°\ÔBˆŒØˆŒØˆŽr   c                ó   <€ V ^8„  d   QhRR/# rR   rS   )r   r8   s   "€r   r   r‡   ²   s   ø€ ÷ ñ ˜ñ r   c                ób   € V P                   '       g   R # V P                  P                  4        R # rF   )r…   rŠ   rv   rI   s   &r   rv   Ú#DiffusionUnmaskingVisualizer.finish²   s   € Ø�{�{ˆ{ÙØ�‰×ÑÖr   c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r   Útoken_idr   )r
   r	   )r   r8   s   "€r   r   r‡   ·   s   ø€ ÷ 1ñ 1¡cð 1©cñ 1r   c                ó¼   € V P                   f   \        V4      # V P                   P                  V.V P                  R7      pVP	                  RR4      ;'       g    R# )N)rƒ   r$   z\nr%   )r‚   r	   Údecoderƒ   Úreplace)r?   r’   Úpieces   && r   Ú_decode_tokenÚ*DiffusionUnmaskingVisualizer._decode_token·   sW   € Ø�>‰>Ò!Ü�x“=Ð Ø—‘×%Ñ%ØˆJ¨D×,DÑ,Dð &ó 
ˆð �}‰}˜T 5Ó)×0Ð0¨SÐ0r   c                ó*   <€ V ^8„  d   QhRS[ RS[RR/# )r   Útokensr]   r   N)r   rD   )r   r8   s   "€r   r   r‡   ¿   s"   ø€ ÷ $9ñ $9¡ð $9©Dð $9¸Tñ $9r   c                ó^  € V P                   '       g   R # V'       g#   V P                  P                  4       '       d   R # V^ ,          P                  4       pV P                  pV P
                  pVe   Ve   \        V4      \        V4      8w  d1   R.\        V4      ,          pV P                  .\        V4      ,          pRp\        V4       F¥  w  rxWW,          p	V'       d   W�P                  8w  d   RWG&   K+  W€P                  8X  d   W�P                  8w  d   RWG&   KQ  KS  W€P                  9   d(   W˜8w  d   V P                  V4      ;'       g    RWG&   RpKŠ  W˜8w  g   K’  V P                  V4      WG&   K§  	  W@n        W0n        V P                  P                  RP                  V4      VR7       R # )Nz[MASK]Fz<eos>Tr   )r]   )r…   rŠ   rJ   ÚtolistrŒ   r‹   r(   r†   Ú	enumerater‰   r—   rr   r)   )
r?   rš   r]   r‹   rŒ   Úprevious_token_idsÚ	found_eosÚir’   Úprevious_token_ids
   &&&       r   Ú	visualizeÚ&DiffusionUnmaskingVisualizer.visualize¿   sW  € Ø�{�{ˆ{Ùß˜Ÿ™×0Ñ0×2Ò2Ùà˜1•I×$Ñ$Ó&ˆ	Ø—‘ˆØ!Ÿ^™^ÐàŠNØ!Ò)ÜÐ%Ó&¬#¨i«.Ô8à�Z¤# i£.Õ0ˆFØ"&§,¡, ´#°i³.Õ!@Ðàˆ	Ü$ YÖ/‰KˆAØ 2Õ 5ÐßØ$¯©Ô4Ø (�F‘IÙØŸ<™<Ô'Ø$¯©Ô4Ø (�F“Iñ 5à×/Ñ/Ô/Ø$Ô0Ø $× 2Ñ 2°8Ó <× GÐ GÀ�F‘IØ ’	Ø"Ö.Ø ×.Ñ.¨xÓ8�“	ñ 0ð  ŒØ"ŒØ�‰×Ñ˜2Ÿ7™7 6›?°%ÐÖ8r   )r…   r‰   r†   rŒ   rŠ   rƒ   r‹   r‚   )F)rx   ry   rz   r{   r|   r@   rv   r—   r¢   r}   r~   r   s   @r   r�   r�   •   sU   ø‡ € ñðð $(ðð %*ðð "÷ò ÷&ð ÷
1ð 1÷$9÷ $9ð $9r   r�   )r|   rf   rG   r   Útypingr   r   r   r!   r2   r4   r�   rS   r   r   Ú<module>r¥      s@   ðñó Û Û ß  õõ	õ$÷>J!ñ J!÷ZN9ó N9r   