ó
    �®žj´  ã                   óF  • S SK r S SKrS SKrS SKrS SKJr  S SKJr  S SKJ	r	J
r
Jr  \	(       a  S SKJr  \R                  " \5      r " S S5      rSSSSSSSS.S	S
S\\\
4   S-  S\S-  S\S-  S\S-  S\S-  S\\\   -  S-  S\\\   -  S-  SS4S jjr " S S\5      rg)é    N)Úabstractmethod)Údeepcopy)ÚTYPE_CHECKINGÚAnyÚList©ÚGenerationConfigc                   óB   • \ rS rSrSr\S\S\4S j5       rS\	4S jr
Srg)	ÚGenerationStopperé   z¼
Base interface for stopping logic.
- should_stop(s): True to stop given the current decoded text window.
- lookback_tokens(): how many tokens should be considered (default: sys.maxsize).
ÚsÚreturnc                 ó   • g ©N© )Úselfr   s     Úb/home/mande/repo/quber/.venv/lib/python3.13/site-packages/docling/models/utils/generation_utils.pyÚshould_stopÚGenerationStopper.should_stop   s   € àó    c                 ó"   • [         R                  $ r   )ÚsysÚmaxsize)r   s    r   Úlookback_tokensÚ!GenerationStopper.lookback_tokens   s   € Ü�{‰{Ðr   r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   ÚstrÚboolr   Úintr   Ú__static_attributes__r   r   r   r   r      s5   † ñð ð˜Sð  Tó ó ðð ÷ r   r   )Ú	overridesÚmax_new_tokensÚ	use_cacheÚ	do_sampleÚtemperatureÚpad_token_idÚeos_token_idÚbase_configzGenerationConfig | Noner%   r&   r'   r(   r)   r*   r+   r   r	   c                óú   • SSK Jn  U b  [        U 5      OU" 5       n	Ub  X)l        Ub  X9l        Ub  Xil        OU	R
                  c	  Ub  Xyl        U(       a  U	R                  " SSS0UD6  Ub  XIl        Ub  XYl        U	$ )Nr   r   Úallow_custom_entriesTr   )	Útransformersr	   r   r&   r'   r*   Úupdater(   r)   )
r,   r%   r&   r'   r(   r)   r*   r+   r	   Úconfigs
             r   Úbuild_generation_configr2   !   s“   € õ .à&1Ñ&=ŒX�kÔ"ÑCSÓCU€Fð
 Ñ!Ø .ÔØÑØ$Ôð
 ÑØ*ÕØ	×	Ñ	Ñ	$¨Ñ)AØ*Ôö
 Ø�ŠÑ=¨4Ð=°9Ò=ð ÑØ$ÔØÑØ(Ôà€Mr   c                   ó^   • \ rS rSrSrSSS.S\S\4S jjrS	\\   S
\4S jr	S\
S
\4S jrSrg)ÚDocTagsRepetitionStopperéP   a&  
Detects repetitive <tag>...<loc_x><loc_y><loc_w><loc_h>text</tag> blocks,
but only when repeats are **consecutive** and both tag & inner text are identical.

Performance:
- Heavy check runs every N calls (default 32).
- Only decodes the last LOOKBACK_TOKENS tokens per sequence (default 200).
é    éÈ   )ÚNr   r8   r   c                óð   • [        S[        U5      5      U l        [        S[        U5      5      U l        SU l        [
        R                  " S[
        R                  [
        R                  -  5      U l	        g )Né   r   zÑ
            <(?P<tag>[a-zA-Z0-9_]+)>\s*
            (?P<prefix>.*?)?
            <loc_(?P<x>\d+)><loc_(?P<y>\d+)><loc_(?P<w>\d+)><loc_(?P<h>\d+)>
            (?P<text>.*?)
            </(?P=tag)>
            )
Úmaxr#   r8   Ú_lookback_tokensÚ_call_countÚreÚcompileÚDOTALLÚVERBOSEÚ_PATTERN)r   r8   r   s      r   Ú__init__Ú!DocTagsRepetitionStopper.__init__Z   sX   € Ü�Qœ˜A›“ˆŒÜ # A¤s¨?Ó';Ó <ˆÔØˆÔô Ÿ
š
ðô �I‰IœŸ
™
Ñ"ó	
ˆ�r   Úvalsr   c                 ó  ^^• [        U5      S:  a  g[        R                  " U5       VVs/ s H	  u  p#X2-
  PM     nnn[        S U 5       5      (       a  g[	        U5      [        U5      -  mST-  m[        UU4S jU 5       5      $ s  snnf )u<   3+ strictly increasing values with ~regular spacing (Â±20%).é   Fc              3   ó*   #   • U  H	  oS :*  v •  M     g7f©r   Nr   )Ú.0Úds     r   Ú	<genexpr>Ú4DocTagsRepetitionStopper._regular.<locals>.<genexpr>q   s   é € Ð%šu˜!�AŽvšuùs   ‚gš™™™™™É?c              3   óF   >#   • U  H  n[        UT-
  5      T:*  v •  M     g 7fr   )Úabs)rJ   rK   ÚmeanÚtols     €€r   rL   rM   u   s   øé € Ð7²¨A”3�q˜4‘x“= CÖ'²ùs   ƒ!)ÚlenÚ	itertoolsÚpairwiseÚanyÚsumÚall)r   rE   ÚaÚbÚdiffsrP   rQ   s        @@r   Ú_regularÚ!DocTagsRepetitionStopper._regularl   s{   ù€ äˆt‹9�q‹=ØÜ#,×#5Ò#5°dÔ#;Ô<Ò#;™4˜1�”Ñ#;ˆÑ<ÜÑ%™uÓ%×%Ñ%ØÜ�5‹zœC ›JÑ&ˆØ�D‰jˆÜÕ7±Ó7Ó7Ð7ùó =s   ¬B	r   c           	      ó  ^ • S=p#/ nS[         [           S[        4U 4S jjnT R                  R	                  U5       H»  nUR                  S5      UR                  S5      p‡[        UR                  S5      5      [        UR                  S5      5      [        UR                  S	5      5      [        UR                  S
5      5      4n	X':X  a  X8:X  a  UR                  U	5        M§  U" U5      (       a    gXxp2U	/nM½     U" U5      $ )u  
Trip only on **consecutive** runs (no other matched blocks between) of â‰¥3 items
with the same <tag> and identical inner text, where within that run we see:
  - any exact duplicate (x,y,w,h), or
  - stable X/W with regular Y progression, or
  - stable Y/H with regular X progression.
NÚboxesr   c                 óì  >^^^^• [        U 5      S:  a  g[        [        U 5      5      [        U 5      :  a  g[        U 6 u  mmmm[        U4S jT 5       5      n[        U4S jT 5       5      n[        U4S jT 5       5      n[        U4S jT 5       5      nU(       d  U(       a   T	R	                  [        T5      5      (       a  gU(       d  U(       a   T	R	                  [        T5      5      (       a  gg)NrG   FTc              3   ó2   >#   • U  H  oTS    :H  v •  M     g7frI   r   )rJ   ÚxÚxss     €r   rL   ÚODocTagsRepetitionStopper.should_stop.<locals>.run_repetitive.<locals>.<genexpr>Š   ó   øé € Ð2ªr¨!  1¡ž:ªrùó   ƒc              3   ó2   >#   • U  H  oTS    :H  v •  M     g7frI   r   )rJ   ÚyÚyss     €r   rL   rc   ‹   rd   re   c              3   ó2   >#   • U  H  oTS    :H  v •  M     g7frI   r   )rJ   ÚwÚwss     €r   rL   rc   Œ   rd   re   c              3   ó2   >#   • U  H  oTS    :H  v •  M     g7frI   r   )rJ   ÚhÚhss     €r   rL   rc   �   rd   re   )rR   ÚsetÚziprW   r[   Úlist)
r^   Úx_stableÚy_stableÚw_stableÚh_stablern   rk   rb   rh   r   s
        @@@@€r   Úrun_repetitiveÚ<DocTagsRepetitionStopper.should_stop.<locals>.run_repetitiveƒ   s°   ü€ Ü�5‹z˜A‹~Øä”3�u“:‹¤ U£Ó+ØÜ  %˜[‰NˆB��B˜ÜÔ2©rÓ2Ó2ˆHÜÔ2©rÓ2Ó2ˆHÜÔ2©rÓ2Ó2ˆHÜÔ2©rÓ2Ó2ˆHæžH¨$¯-©-¼¸R»×*AÑ*AØæžH¨$¯-©-¼¸R»×*AÑ*AØØr   ÚtagÚtextra   rg   rj   rm   T)r   Útupler"   rB   ÚfinditerÚgroupr#   Úappend)
r   r   Úprev_tagÚ	prev_textÚrunrv   Úmrx   ry   Úboxs
   `         r   r   Ú$DocTagsRepetitionStopper.should_stopw   sâ   ø€ ð  $Ð#ˆØˆð	¤$¤u¡+ð 	´$÷ 	ð& —‘×'Ñ'¨Ö*ˆAØŸ™ ›¨¯©°«�ä�A—G‘G˜C“LÓ!Ü�A—G‘G˜C“LÓ!Ü�A—G‘G˜C“LÓ!Ü�A—G‘G˜C“LÓ!ð	ˆCð ‹ 9Ó#4Ø—
‘
˜3–ñ " #×&Ñ&ÙØ&)˜)Ø�e’ñ! +ñ& ˜cÓ"Ð"r   )r8   rB   r=   r<   N)r   r   r   r   r    r#   rC   r   r"   r[   r!   r   r$   r   r   r   r4   r4   P   sK   † ñð $&¸cò 
˜Sð 
¸õ 
ð$	8˜T #™Yð 	8¨4ô 	8ð2#˜Sð 2# T÷ 2#r   r4   )rS   Úloggingr>   r   Úabcr   Úcopyr   Útypingr   r   r   r/   r	   Ú	getLoggerr   Ú_logr   Údictr!   r#   r"   Úfloatrq   r2   r4   r   r   r   Ú<module>rŒ      sú   ðó Û Û 	Û 
Ý Ý ß +Ñ +æÝ-à×Ò˜Ó"€÷ñ ð$ (,Ø!%Ø!Ø!Ø $Ø+/Ø+/ò,Ø*ð,ð �C˜�H‰~ Ñ$ð,ð ˜$‘Jð	,ð
 �d‰{ð,ð �d‰{ð,ð ˜‘ð,ð ˜˜S™	‘/ DÑ(ð,ð ˜˜S™	‘/ DÑ(ð,ð õ,ô^Y#Ð0õ Y#r   