ó
    �®žjûc  ã                   óŒ  • S SK r S SKrS SKrS SKrS SKJrJr  S SKJrJ	r	  S SK
JrJrJrJrJr  S SKJrJr  S SKJr  S SKJr  S SKJr  \R4                  " \5      r " S	 S
\5      r\ " S S5      5       r\R>                  \R@                  \RB                  1r"S\S\#4S jr$S\\   S\\   4S jr%S\S\S\&4S jr' " S S5      r(g)é    N)Ú	dataclassÚfield)ÚisliceÚ	takewhile)ÚDictÚIterableÚListÚSetÚTuple)ÚBoundingBoxÚSize)ÚRefItem)ÚDocItemLabel)Úindexc                   óŠ   • \ rS rSr% Sr\\S'   \\S'   \" SS9r	\\S'   Sr
\\S	'   \\S
'   \\S'   \\S'   S rS rS\4S jrSrg)ÚPageElementé   gü©ñÒMbP?ÚepsÚcidÚ#)ÚcrefÚrefÚ ÚtextÚpage_noÚ	page_sizeÚlabelc                 ó®   • U R                   S SU R                  <S SU R                  S SU R                  S SU R                  S SU R
                  S 3$ )Nz6.2fÚ	z<10z, )r   r   ÚlÚbÚrÚt©Úselfs    Úk/home/mande/repo/quber/.venv/lib/python3.13/site-packages/docling/models/postprocessing/reading_order_rb.pyÚ__str__ÚPageElement.__str__!   s_   € Ø—(‘(˜4�  4§:¡:Ð"4°Ð"4°B°t·v±v¸d°mÀ2ÀdÇfÁfÈTÀ]ÐRTÐUY×U[ÑU[Ð\`ÐTaÐacÐdh×djÑdjÐkoÐcpÐqÐqó    c                 óø   • U R                   UR                   :X  aH  U R                  U5      (       a  U R                  UR                  :„  $ U R                  UR                  :  $ U R                   UR                   :  $ ©N)r   Úoverlaps_horizontallyr!   r    )r%   Úothers     r&   Ú__lt__ÚPageElement.__lt__$   s\   € Ø�<‰<˜5Ÿ=™=Ó(Ø×)Ñ)¨%×0Ñ0Ø—v‘v §¡Ñ'Ð'à—v‘v §¡Ñ'Ð'à—<‘< %§-¡-Ñ/Ð/r)   Úreturnc                 ó:   • U R                   S-   UR                   :H  $ ©Né   )r   )r%   Úrhss     r&   Úfollows_maintext_orderÚ"PageElement.follows_maintext_order-   s   € Ø�x‰x˜!‰|˜sŸw™wÑ&Ð&r)   © N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   ÚfloatÚ__annotations__Úintr   r   r   Ústrr   r   r'   r.   Úboolr5   Ú__static_attributes__r7   r)   r&   r   r      sP   ‡ Ø€CˆÓà	ƒHÙ Ñ$€CˆÓ$à€Dˆ#ƒNàƒLØƒOàÓòrò0ð'¨T÷ 'r)   r   c                   ó  • \ rS rSr% Sr\" \S9r\\	\	4   \
S'   \" \S9r\\	\	4   \
S'   \" \S9r\\	\	4   \
S'   \" \S9r\\	\	4   \
S'   \" \S9r\\	\\	   4   \
S'   \" \S9r\\	\\	   4   \
S	'   \" \S9r\\	   \
S
'   Srg)Ú_ReadingOrderPredictorStateé1   z7
State container of the reading order of a single page
)Údefault_factoryÚh2i_mapÚi2h_mapÚl2r_mapÚr2l_mapÚup_mapÚdn_mapÚheadsr7   N)r8   r9   r:   r;   Ú__doc__r   ÚdictrF   r   r>   r=   rG   rH   rI   rJ   r	   rK   ÚlistrL   rA   r7   r)   r&   rC   rC   1   s°   ‡ ññ $°DÑ9€GˆT�#�s�(‰^Ó9Ù#°DÑ9€GˆT�#�s�(‰^Ó9Ù#°DÑ9€GˆT�#�s�(‰^Ó9Ù#°DÑ9€GˆT�#�s�(‰^Ó9Ù#(¸Ñ#>€FˆD��d˜3‘i�Ñ Ó>Ù#(¸Ñ#>€FˆD��d˜3‘i�Ñ Ó>Ù¨TÑ2€Eˆ4�‰9Ö2r)   rC   Úelementr0   c                 ó(   • U R                   [        ;   $ r+   )r   ÚGRAPHIC_LABELS)rP   s    r&   Ú_is_graphicrS   C   s   € Ø�=‰=œNÑ*Ð*r)   Úelementsc                 ó4   • [        [        [        U 5      5      $ )z3The unbroken run of graphics `elements` opens with.)rO   r   rS   )rT   s    r&   Ú_graphic_runrV   G   s   € ä”	œ+ xÓ0Ó1Ð1r)   Úlhsr4   c                 ó  • [        SU R                  U5      U R                  -
  UR                  -
  5      n[        SU R                  U5      U R                  -
  UR                  -
  5      n[
        R                  " X#5      $ )a  
Shortest distance between two boxes, 0 once they touch or overlap.

Along either axis the boxes span their union, so whatever the union has
left over once both are laid down is the gap between them. The union
helpers keep that right for either coordinate origin.
ç        )ÚmaxÚx_union_withÚwidthÚy_union_withÚheightÚmathÚhypot)rW   r4   ÚdxÚdys       r&   Ú_shortest_box_gaprc   L   se   € ô 
ˆS�#×"Ñ" 3Ó'¨#¯)©)Ñ3°c·i±iÑ?Ó	@€BÜ	ˆS�#×"Ñ" 3Ó'¨#¯*©*Ñ4°s·z±zÑAÓ	B€BÜ�:Š:�bÓÐr)   c                   ó
  • \ rS rSrSrS rS\\   S\\   4S jrS\\   S\	\
\\
   4   4S jrS\\   S\	\
\\
   4   4S	 jrS\\   S\	\
\\
   4   4S
 jrS\\   S\\   4S jrS\\   S\SS4S jrS\\   S\SS4S jrS\\   S\SS4S jrS\R(                  S\\   S\
S\
S\S\S\4S jrS\\   S\\   S\S\\   4S jrS\\   S\SS4S jrS\\   S\SS4S jrS\\   S\S\\
   4S jrS\
S\\   S\S\
4S jrS\
S \\
   S\\   S\SS4
S! jr\S\\   S\	\
\\
   4   4S" j5       r\S#\
S$\	\
\\
   4   S%\	\
\
4   S&\\
   S\	\
\
4   4
S' j5       r S\\   S\	\
\\
   4   4S( jr!S\\   S\	\
\\
   4   4S) jr"S*r#g)+ÚReadingOrderPredictoréY   z.
Rule based reading order for DoclingDocument
c                 ó    • SU l         SU l        g )NTg333333Ã?)Údilated_page_elementÚ#_horizontal_dilation_threshold_normr$   s    r&   Ú__init__ÚReadingOrderPredictor.__init__^   s   € Ø$(ˆÔ!ð 48ˆÕ0r)   Úpage_elementsr0   c                 ó¦  • [        5       n[        U5       H   u  p4UR                  UR                  5        M"     0 n0 n0 nU H  n/ XX'   / Xx'   / Xh'   M     [        U5       Hœ  u  p4UR                  [
        R                  :X  a  XdR                     R                  U5        MB  UR                  [
        R                  :X  a  XtR                     R                  U5        M  XTR                     R                  U5        Mž     UR                  5        H  u  p‰U R                  U	5      Xh'   M     UR                  5        H  u  p‰U R                  U	5      XX'   M     UR                  5        H  u  p‰U R                  U	5      Xx'   M     / n
[        U5       H<  nU
R                  Xh   5        U
R                  XX   5        U
R                  Xx   5        M>     U
$ r+   )ÚsetÚ	enumerateÚaddr   r   r   ÚPAGE_HEADERÚappendÚPAGE_FOOTERÚitemsÚ_predict_pageÚsortedÚextend)r%   rl   Úpage_nosÚiÚelemÚpage_to_elemsÚpage_to_headersÚpage_to_footersr   ÚelemsÚsorted_elementss              r&   Úpredict_reading_orderÚ+ReadingOrderPredictor.predict_reading_orderd   s¤  € ô !›Uˆä  Ö/‰GˆAØ�L‰L˜Ÿ™Ö&ñ 0ð 79ˆØ8:ˆØ8:ˆãˆGØ%'ˆMÑ"Ø')ˆOÑ$Ø')ˆOÓ$ñ  ô
 ! Ö/‰GˆAØ�z‰zœ\×5Ñ5Ó5Ø§¡Ñ-×4Ñ4°TÖ:Ø—‘œ|×7Ñ7Ó7Ø§¡Ñ-×4Ñ4°TÖ:àŸl™lÑ+×2Ñ2°4Ö8ñ 0ð .×3Ñ3Ö5‰NˆGØ'+×'9Ñ'9¸%Ó'@ˆOÓ$ñ 6ð ,×1Ñ1Ö3‰NˆGØ%)×%7Ñ%7¸Ó%>ˆMÓ"ñ 4ð .×3Ñ3Ö5‰NˆGØ'+×'9Ñ'9¸%Ó'@ˆOÓ$ñ 6ð ˆÜ˜hÖ'ˆGØ×"Ñ" ?Ñ#;Ô<Ø×"Ñ" =Ñ#9Ô:Ø×"Ñ" ?Ñ#;Ö<ñ (ð
 Ðr)   r   c                 óŠ  • 0 n[        5       n[        U5       H   u  pEUR                  UR                  5        M"     0 nU H  n/ Xg'   M	     [        U5       H"  u  pEXeR                     R	                  U5        M$     UR                  5        H3  u  pxU R                  Xg   S9n	U	R                  5        H	  u  p«X²U
'   M     M5     U$ ©N)rl   )rn   ro   rp   r   rr   rt   Ú_find_to_captions)r%   r   Úto_captionsrx   ry   rz   r{   r   r~   Úpage_to_captionsÚkeyÚvals               r&   Úpredict_to_captionsÚ)ReadingOrderPredictor.predict_to_captions’   sÌ   € ð -/ˆä ›UˆÜ  Ö1‰GˆAØ�L‰L˜Ÿ™Ö&ñ 2ð 79ˆÛˆGØ%'ˆMÓ"ñ  ô ! Ö1‰GˆAØŸ,™,Ñ'×.Ñ.¨tÖ4ñ 2ð ,×1Ñ1Ö3‰NˆGØ#×5Ñ5Ø+Ñ4ð  6ð  Ðð -×2Ñ2Ö4‘�Ø#&˜CÓ ó 5ñ	 4ð Ðr)   c                 óŠ  • 0 n[        5       n[        U5       H   u  pEUR                  UR                  5        M"     0 nU H  n/ Xg'   M	     [        U5       H"  u  pEXeR                     R	                  U5        M$     UR                  5        H3  u  pxU R                  Xg   S9n	U	R                  5        H	  u  p«X²U
'   M     M5     U$ rƒ   )rn   ro   rp   r   rr   rt   Ú_find_to_footnotes)r%   r   Úto_footnotesrx   ry   rz   r{   r   r~   Úpage_to_footnotesr‡   rˆ   s               r&   Úpredict_to_footnotesÚ*ReadingOrderPredictor.predict_to_footnotes¬   sÌ   € ð .0ˆä ›UˆÜ  Ö1‰GˆAØ�L‰L˜Ÿ™Ö&ñ 2ð 79ˆÛˆGØ%'ˆMÓ"ñ  ô ! Ö1‰GˆAØŸ,™,Ñ'×.Ñ.¨tÖ4ñ 2ð ,×1Ñ1Ö3‰NˆGØ $× 7Ñ 7Ø+Ñ4ð !8ð !Ðð .×3Ñ3Ö5‘�Ø$'˜SÓ!ó 6ñ	 4ð Ðr)   c                 óÌ  • 0 n[         R                  [         R                  [         R                  [         R                  [         R
                  [         R                  /nSn[        U5       GHs  u  pVXT::  a  M  UR                  [         R                  4;   d  M.  / nUn US-   n	U	[        U5      :  a:  X   R                  U;   a(  U	S-  n	U	[        U5      :  a  X   R                  U;   a  M(  U	[        U5      :  aÇ  X   R                  UR                  :X  a«  UR                  X   R                  :w  d  UR                  X   5      (       aw  [        R                  " SX   R                  5      n
[        R                  " SX   R                  5      nU
(       a)  U(       a"  UR!                  X   R"                  5        U	nU	nOOOGM(  U(       d  GMe  XrUR"                  '   GMv     U$ )Néÿÿÿÿr3   z.+([a-z,\-\u00AD])(\s*)z(\s*[a-zA-Z\u00C0-\u024F])(.+))r   rq   rs   ÚTABLEÚPICTUREÚCAPTIONÚFOOTNOTEro   r   ÚTEXTÚlenr   Úis_strictly_left_ofÚreÚ	fullmatchr   rr   r   )r%   r   ÚmergesÚskip_labelsÚcurr_indÚindrz   Ú
merge_listÚ	check_indÚind_p1Úm1Úm2s               r&   Úpredict_mergesÚ$ReadingOrderPredictor.predict_mergesÆ   s´  € ð (*ˆô ×$Ñ$Ü×$Ñ$Ü×ÑÜ× Ñ Ü× Ñ Ü×!Ñ!ð
ˆð ˆÜ" ?×3‰IˆCØ‹Ùà�z‰zœl×/Ñ/Ð0Õ0Ø(*�
Ø�	àØ&¨™]�Fà¤ _Ó!5Ó5Ø+Ñ3×9Ñ9¸[ÓHà !™˜ð ¤ _Ó!5Ó5Ø+Ñ3×9Ñ9¸[ÕHð
 ¤ _Ó!5Ó5Ø+Ñ3×9Ñ9¸T¿Z¹ZÓGà ŸL™L¨OÑ,C×,KÑ,KÓKØ#×7Ñ7¸Ñ8O×PÑPô  Ÿ\š\Ø6¸Ñ8R×8WÑ8Wó˜ô  Ÿ\š\Ø=Ø+Ñ3×8Ñ8ó˜ö
 ¦"Ø&×-Ñ-¨oÑ.E×.IÑ.IÔJØ'-˜HØ(.™Ià!àò? ÷B ‘:Ø'1˜4Ÿ8™8Ô$ñU 4ðX ˆr)   c                 ó2  • [        5       n [        U5       H,  u  p4UR                  X   R                  R                  S9X'   M.     U R                  X5        U R                  X5        U R                  X5        U R                  (       a9  [        R                  " U5      nU R                  XU5      nU R                  XR5        U R                  X5        U R                  X5         U R                  X5      n/ nU H  nUR                  X   5        M      U$ )zK
Reorder the output of the page elements into a single-page reading order.
)Úpage_height)rC   ro   Úto_bottom_left_originr   r^   Ú_init_h2i_mapÚ_init_l2r_mapÚ_init_ud_mapsrh   ÚcopyÚdeepcopyÚ_do_horizontal_dilationÚ_find_headsÚ_sort_ud_mapsÚ_find_orderrr   )	r%   rl   Ústatery   rz   Údilated_page_elementsÚorderr   rŸ   s	            r&   ru   Ú#ReadingOrderPredictor._predict_page  s   € ô
 ,Ó-ˆð	ô
 ! Ö/‰GˆAØ#×9Ñ9Ø)Ñ,×6Ñ6×=Ñ=ð  :ð  ˆMÓñ 0ð 	×Ñ˜=Ô0à×Ñ˜=Ô0à×Ñ˜=Ô0à×$×$Ü7;·}²}Øó8Ð!ð %)×$@Ñ$@Ø°eó%Ð!ð
 ×ÑÐ4Ô<à×Ñ˜Ô.à×Ñ˜=Ô0ð	ð(  ×+Ñ+¨MÓAˆð .0ˆÛˆCØ×"Ñ" =Ñ#5Ö6ñ ð	ð
 Ðr)   Ú
page_elemsr³   Nc                 óª   • 0 Ul         0 Ul        [        U5       H6  u  p4X2R                   UR                  '   UR                  UR                  U'   M8     g r+   )rF   rG   ro   r   )r%   r·   r³   ry   Úpelems        r&   rª   Ú#ReadingOrderPredictor._init_h2i_mapL  sE   € ð ˆŒØˆŒä! *Ö-‰HˆAØ'(�M‰M˜%Ÿ)™)Ñ$Ø$Ÿy™yˆE�M‰M˜!Óò .r)   c                 ó:  • 0 Ul         0 Ul        [        U5       H~  u  p4[        U5       Hj  u  pVUR                  U5      (       d  M  UR	                  U5      (       d  M5  UR                  US5      (       d  MN  XRR                   U'   X2R                  U'   Ml     M€     g )Ngš™™™™™é?)rH   rI   ro   r5   r™   Úoverlaps_vertically_with_iou)r%   r·   r³   ry   Úpelem_iÚjÚpelem_js          r&   r«   Ú#ReadingOrderPredictor._init_l2r_mapV  s�   € ð ˆŒØˆŒä# JÖ/‰JˆAÜ'¨
Ö3‘
�à×2Ñ2°7×;Ó;Ø×3Ñ3°G×<Ó<Ø×<Ñ<¸WÀc×JÓJà'(—M‘M !Ñ$Ø'(—M‘M !Ó$ó 4ò 0r)   c           
      ó   • 0 Ul         0 Ul        [        U5       H#  u  p4/ UR                   U'   / UR                  U'   M%     [        R                  " 5       n[        U5       HB  u  p6UR                  X6R                  UR                  UR                  UR                  45        MD     [        U5       GH˜  u  pxXrR                  ;   ao  UR                  U   n	XrR                  U	   ;  a  UR                  U	   R                  U5        X’R                   U   ;  a  UR                   U   R                  U	5        UR                  S-
  UR                  UR                  S-   [        S5      4n
[        UR                  U
5      5      nU HÁ  nX7:X  a  M
  X   nUR                  U5      (       a  UR!                  U5      (       d  M<  U R#                  XQX7XH5      (       a  MV  X2R$                  ;   a   UR$                  U   nX2R$                  ;   a  M   UR                  U   R                  U5        UR                   U   R                  U5        MÃ     GM›     g)zÃ
Initialize up/down maps for reading order prediction using R-tree spatial indexing.

Uses R-tree for spatial queries.
Determines linear reading sequence by finding preceding/following elements.
gš™™™™™¹?ÚinfN)rJ   rK   ro   Úrtree_indexÚIndexÚinsertr    r!   r"   r#   rI   rr   r<   rO   ÚintersectionÚis_strictly_abover,   Ú_has_sequence_interruptionrH   )r%   r·   r³   ry   r½   Úspatial_idxr¹   r¾   r¿   Úleft_partnerÚ
query_bboxÚ
candidatess               r&   r¬   Ú#ReadingOrderPredictor._init_ud_mapsf  så  € ð ˆŒØˆŒä# JÖ/‰JˆAØ ˆE�L‰L˜‰OØ ˆE�L‰L˜‹Oñ 0ô
 "×'Ò'Ó)ˆÜ! *Ö-‰HˆAØ×Ñ˜q§7¡7¨E¯G©G°U·W±W¸e¿g¹gÐ"FÖGñ .ô $ J×/‰JˆAØ—M‘MÓ!Ø$Ÿ}™}¨QÑ/�àŸL™L¨Ñ6Ó6Ø—L‘L Ñ.×5Ñ5°aÔ8Ø§|¡|°A¡Ó6Ø—L‘L ‘O×*Ñ*¨<Ô8à!Ÿ)™) c™/¨7¯9©9°g·i±iÀ#±oÄuÈUÃ|ÐTˆJÜ˜k×6Ñ6°zÓBÓCˆJã�Ø“6Ùà$™-�ð ×-Ñ-¨g×6Ñ6Ø×5Ñ5°g×>Ñ>áð ×6Ñ6Ø¨Q°7÷ó ð Ÿ}™}Ó,Ø!ŸM™M¨!Ñ,˜ð Ÿ}™}Õ,ð —L‘L ‘O×*Ñ*¨1Ô-Ø—L‘L ‘O×*Ñ*¨1Ö-ô-  ò 0r)   rÉ   ry   r¾   r½   r¿   c                 ó4  • [        UR                  UR                  5      S-
  n[        UR                  UR                  5      S-   nUR                  n	UR
                  n
[        Xš5      [        Xš5      p©[        Xx5      [        Xx5      p‡[        UR                  XyXŠ45      5      nU Hn  nXÃU4;   a  M  X,   nUR                  U5      (       d  UR                  U5      (       d  M>  UR                  U5      (       d  MV  UR                  U5      (       d  Mn    g   g)zACheck if elements interrupt the reading sequence between i and j.g      ð?TF)
Úminr    rZ   r"   r#   r!   rO   rÆ   r,   rÇ   )r%   rÉ   r·   ry   r¾   r½   r¿   Úx_minÚx_maxÚy_minÚy_maxrÌ   ÚwÚpelem_ws                 r&   rÈ   Ú0ReadingOrderPredictor._has_sequence_interruptionŸ  sñ   € ô �G—I‘I˜wŸy™yÓ)¨CÑ/ˆÜ�G—I‘I˜wŸy™yÓ)¨CÑ/ˆØ—	‘	ˆØ—	‘	ˆô ˜5Ó(¬#¨eÓ*;ˆuÜ˜5Ó(¬#¨eÓ*;ˆuä˜+×2Ñ2°EÀ%Ð3OÓPÓQˆ
ãˆAØ˜�F‹{Ùà ‘mˆGð
 ×1Ñ1°'×:Ñ:Ø×4Ñ4°W×=Ó=à×-Ñ-¨g×6Ó6Ø×-Ñ-¨g×6Ó6áñ ð" r)   Údilated_page_elemsc                 óØ  • SnU(       a(  US   R                   nU R                  UR                  -  n[        U5       GH¨  u  pgUR                  nUR
                  n	UR                  n
UR                  nXcR                  ;   ap  [        UR                  U   5      S:”  aT  XR                  U   S      n[        XŒR                  5      n[        X¬R                  5      nX�-
  U:”  d  Xê-
  U:”  a  M±  UnUn
XcR                  ;   aq  [        UR                  U   5      S:”  aU  XR                  U   S      n[        X�R                  5      n[        X¯R                  5      nX�-
  U:”  d  Xê-
  U:”  a  GM1  UnUn
X‡l        X§l        Sn[        U5       H(  u  nnUU:X  a  M  U(       a  M  UR                  U5      nM*     U(       a  GM„  X‚U   l        X’U   l        X¢U   l        X²U   l        GM«     U$ )NrY   r   F)r   ri   r\   ro   r    r!   r"   r#   rJ   r˜   rÏ   rZ   rK   Úoverlaps)r%   r·   r×   r³   Úthr   ry   r½   Úx0Úy0Úx1Úy1Úpelem_upÚx0_dilÚx1_dilÚpelem_dnÚoverlaps_with_restr¾   r¿   s                      r&   r¯   Ú-ReadingOrderPredictor._do_horizontal_dilationË  sÉ  € ð ˆÞØ" 1™×/Ñ/ˆIØ×9Ñ9¸I¿O¹OÑKˆBä#Ð$6×7‰JˆAØ—‘ˆBØ—‘ˆBà—‘ˆBØ—‘ˆBà—L‘LÓ ¤S¨¯©°a©Ó%9¸AÓ%=Ø%§l¡l°1¡o°aÑ&8Ñ9�ô ˜R§¡Ó,�Ü˜R§¡Ó,�Ø‘K 2Ó%¨&©+¸Ó);ÙØ�Ø�à—L‘LÓ ¤S¨¯©°a©Ó%9¸AÓ%=Ø%§l¡l°1¡o°aÑ&8Ñ9�ô ˜R§¡Ó,�Ü˜R§¡Ó,�Ø‘K 2Ó%¨&©+¸Ó);ÚØ�Ø�àŒIØŒIà',ÐÜ'¨
Ö3‘
��7Ø˜“6Ùç)Ð)Ø)0×)9Ñ)9¸'Ó)BÒ&ñ 4÷ &Ñ%Ø*, 1Ñ%Ô'Ø*, 1Ñ%Ô'Ø*, 1Ñ%Ô'Ø*, 1Ñ%×'ñ[ 8ð^ "Ð!r)   c                 ó4  • / nUR                   R                  5        H)  u  pE[        U5      S:X  d  M  UR                  X   5        M+      [	        U5      n / Ul        U H5  nUR
                  R                  UR                  UR                     5        M7     g )Nr   )rJ   rt   r˜   rr   rv   rL   rF   r   )r%   r·   r³   Úhead_page_elemsr‡   ÚvalsÚitems          r&   r°   Ú!ReadingOrderPredictor._find_heads  s…   € ð ˆØŸ™×+Ñ+Ö-‰IˆCÜ�4‹y˜A�~Ø×&Ñ& z¡Ö7ñ .ð	ô ! Ó1ˆð	ð ˆŒÛ#ˆDØ�K‰K×Ñ˜uŸ}™}¨T¯X©XÑ6Ö7ò $r)   Úprovsc                 ó6  • UR                   R                  5        H{  u  p4/ nU H  nUR                  X   5        M     [        U5      n/ UR                   U'   U H8  nUR                   U   R                  UR                  UR
                     5        M:     M}     g r+   )rK   rt   rr   rv   rF   r   )r%   rê   r³   Úind_irç   Úchild_provsÚind_jÚchilds           r&   r±   Ú#ReadingOrderPredictor._sort_ud_maps#  s„   € ð !Ÿ<™<×-Ñ-Ö/‰KˆEØ-/ˆKÛ�Ø×"Ñ" 5¡<Ö0ñ ô ! Ó-ˆKà"$ˆE�L‰L˜ÑÛ$�Ø—‘˜UÑ#×*Ñ*¨5¯=©=¸¿¹Ñ+CÖDó %ò 0r)   c                 ó  • / nU Vs/ s H  nSPM     nnUR                    H5  nXV   (       a  M  UR                  U5        SXV'   U R                  XcXR5        M7     [        U5      [        U5      :w  a  [        R                  S5        U$ s  snf )NFTzsomething went wrong)rL   rr   Ú_depth_first_search_downwardsr˜   Ú_logÚerror)r%   rê   r³   rµ   Ú_Úvisitedr¾   s          r&   r²   Ú!ReadingOrderPredictor._find_order2  s}   € ð ˆá.3Ó4ªe¨›u©eˆÐ4à—”ˆAØ—:‘:Ø—‘˜Q”Ø!�‘
Ø×2Ñ2°1¸WÖLñ	 ô ˆu‹:œ˜U›Ó#Ü�J‰JÐ-Ô.àˆùò 5s   ‡B	rö   c                 óp   • Un UR                   U   nSnU H  nX'   (       a  M  UnSn  O   U(       d  U$ M4  )z,depth_first_search_upwards without recursionTF)rJ   )r%   r¾   rö   r³   ÚkÚindsÚfound_not_visitedrŸ   s           r&   Ú_depth_first_search_upwardsÚ1ReadingOrderPredictor._depth_first_search_upwardsD  sM   € ð ˆØØ#Ÿl™l¨1™oˆDØ %ÐÛ�Ø—|‘|Ø�AØ(,Ð%Ùñ	 ö %Ø�ñ r)   rµ   c                 óŽ  • UR                   U   S4/nU(       a¬  US   u  pgSnU[        U5      :  as  [        XgS 5       Hb  u  pšU R                  X£U5      nX;   (       a  M"  UR	                  U5        SX;'   XiS-   4US'   UR	                  UR                   U   S45        Sn  O   U(       d  UR                  5         U(       a  M«  gg)z.depth_first_search_downwards without recursionr   r’   FNTr3   )rK   r˜   ro   rü   rr   Úpop)r%   r¾   rµ   rö   r³   Ústackrú   ÚoffsetÚfound_non_visitedÚ
new_offsetry   rù   s               r&   rò   Ú3ReadingOrderPredictor._depth_first_search_downwardsV  sÀ   € ð 05¯|©|¸A©ÀÐ.BÐ-CˆæØ  ™9‰LˆDà %ÐØœ˜D›	Ó!Ü%.¨t°G¨}Ö%=‘M�JØ!×=Ñ=¸aÈ%ÓP�Aà"Ÿ:™:ØŸ™ QœØ%)˜™
Ø%)¸©>Ð$:˜˜b™	ØŸ™ e§l¡l°1¡o°qÐ%9Ô:Ø,0Ð)Ùñ &>ö %Ø—	‘	”÷# Šer)   c                 óº  ^• U SSS2   n[        U 5      n0 n[        U 5       H®  u  pEUR                  [        R                  :w  a  M%  [        [        XU-
  S5      5      n[        [        XS-   S5      5      nSU4SU44 VV	V
s0 s H'  u  p‰U	  H  n
U
R                  [        XZ5      U4_M     M)     sn
n	nm[        TU4S jS9X5R                  '   M°     U$ s  sn
n	nf )aI  
Map each caption cid to the cids of the graphics it could belong to,
nearest first.

A caption only reaches the graphics in an unbroken run on either side
of it, ranked by the gap each leaves on the page rather than by
position in the run: the nearer graphic is not always the one above.
Equal gaps go to the preceding graphic.
Nr’   r3   r   c                 ó   >• TU    $ r+   r7   )r   Úrankeds    €r&   Ú<lambda>Ú@ReadingOrderPredictor._rank_caption_candidates.<locals>.<lambda>”  s	   ø€ ÀFÈ3ÂKr)   )r‡   )
r˜   ro   r   r   r•   rV   r   r   rc   rv   )rl   Ú	backwardsÚsizeÚ	preferredrŸ   ÚcaptionÚ	precedingÚ	followingÚsideÚrunÚgraphicr  s              @r&   Ú_rank_caption_candidatesÚ.ReadingOrderPredictor._rank_caption_candidatesu  sä   ø€ ð "¡$ B $Ñ'ˆ	Ü�=Ó!ˆà*,ˆ	Ü% mÖ4‰LˆCØ�}‰}¤× 4Ñ 4Ó4ÙÜ$¤V¨I¸c±zÀ4Ó%HÓIˆIÜ$¤V¨MÀ¹7ÀDÓ%IÓJˆIð
 $% i .°1°i°.Ñ!Aõâ!A‘I�DÜ"�Gð —‘Ô/°ÓAÀ4ÐHÒHá"ñ Ù!AóˆFô
 &,¨FÔ8OÑ%PˆI—k‘kÓ"ñ 5ð Ðùôs   Â.C
Úcaption_cidr  ÚmatchedÚseenc                 ó¤  ^• U [        X   5      4/n/ nU(       aµ  US   u  pg[        U4S jU 5       S5      nUc)  UR                  5         U(       a  UR                  5         MP  TR                  U5        UR	                  X†45        UR                  U5      n	U	c  U[        U5      -  $ UR	                  U	[        X   5      45        U(       a  Mµ  0 $ )a,  
Given the current matching `matched` (graphic cid -> caption cid),
return a new matching in which the caption owns one of its graphics,
displacing an earlier caption when that one can rehouse itself. Empty
if no graphic can be freed up.

The displacement chain is walked on an explicit stack, since it can
grow as long as the page. Each frame is a caption and the graphics it
has left to try, and the moves in `chain` take effect only once the
chain reaches a graphic nobody holds. `seen` keeps it from revisiting
a graphic; pass a fresh set per caption.
r’   c              3   ó6   >#   • U  H  oT;  d  M
  Uv •  M     g 7fr+   r7   )Ú.0r   r  s     €r&   Ú	<genexpr>Ú7ReadingOrderPredictor._match_caption.<locals>.<genexpr>®  s   øé € ÐMªz¨È¹_§¡ªzùs   ƒ	�	N)ÚiterÚnextrÿ   rp   rr   ÚgetrN   )
r  r  r  r  r   ÚchainÚclaimantrÌ   Úgraphic_cidÚheld_bys
      `      r&   Ú_match_captionÚ$ReadingOrderPredictor._match_caption—  sÄ   ø€ ð& œt IÑ$:Ó;Ð<Ð=ˆØ')ˆÞØ#(¨¡9Ñ ˆHÜÔM©zÓMÈtÓTˆKØÑ"ð —	‘	”ÞØ—I‘I”KÙØ�H‰H�[Ô!Ø�L‰L˜+Ð0Ô1Ø—k‘k +Ó.ˆGØ‰Ø¤ e£Ñ,Ð,à�L‰L˜'¤4¨	Ñ(:Ó#;Ð<Ô=÷! ˆeð" ˆ	r)   c                 óÚ   • U R                  U5      n0 nU H'  nU R                  XBU[        5       5      =(       d    UnM)     UR                  5        VVs0 s H  u  pVXV/_M
     snn$ s  snnf r+   )r  r$  rn   rt   )r%   rl   r  r  r   r  r  s          r&   r„   Ú'ReadingOrderPredictor._find_to_captions¿  si   € ð ×1Ñ1°-Ó@ˆ	ð #%ˆÛˆCØ×)Ñ)¨#¸'Ä3Ã5ÓI×TÈWŠGñ ð <C¿=¹=¼?ÔKº?Ñ'7 w�˜Ò"¹?ÒKÐKùÓKs   ÁA'c                 ó  • 0 n[        U5       Hú  u  p4UR                  [        R                  [        R                  4;   d  M5  US-   nU[        U5      :  d  MK  X   R                  [        R                  :X  d  Mm  UR                  U;   a*  X$R                     R                  X   R                  5        OX   R                  /X$R                  '   US-  nU[        U5      :  d  MØ  X   R                  [        R                  :X  a  M�  Mü     U$ r2   )	ro   r   r   r“   r”   r˜   r–   r   rr   )r%   rl   r�   rŸ   Úpage_elementr¢   s         r&   rŒ   Ú(ReadingOrderPredictor._find_to_footnotesÏ  sè   € ð .0ˆô "+¨=Ö!9ÑˆCØ×!Ñ!¤l×&8Ñ&8¼,×:NÑ:NÐ%OÕOØ˜q™�àœS Ó/Õ/Ø%Ñ-×3Ñ3´|×7LÑ7LÕLà#×'Ñ'¨<Ó7Ø$×%5Ñ%5Ñ6×=Ñ=¸mÑ>S×>WÑ>WÕXà:GÑ:O×:SÑ:SÐ9T˜×%5Ñ%5Ñ6à˜a‘K�Fð œS Ó/Õ/Ø%Ñ-×3Ñ3´|×7LÑ7L×Lñ ":ð Ðr)   )ri   rh   )$r8   r9   r:   r;   rM   rj   r	   r   r€   r   r>   r‰   r�   r¥   ru   rC   rª   r«   r¬   rÃ   rÄ   r@   rÈ   r¯   r°   r±   r²   rü   rò   Ústaticmethodr  r
   r$  r„   rŒ   rA   r7   r)   r&   re   re   Y   sz  † ñò8ð,Ø! +Ñ.ð,à	ˆkÑ	ô,ð\Ø# KÑ0ðà	ˆc�4˜‘9ˆnÑ	ôð4Ø# KÑ0ðà	ˆc�4˜‘9ˆnÑ	ôð4<Ø# KÑ0ð<à	ˆc�4˜‘9ˆnÑ	ô<ð|F¨4°Ñ+<ð FÀÀkÑARô FðP)Ø˜{Ñ+ð)Ø4Oð)à	ô)ð)Ø˜{Ñ+ð)Ø4Oð)à	ô)ð 7.Ø˜{Ñ+ð7.Ø4Oð7.à	ô7.ðr*à ×&Ñ&ð*ð ˜Ñ%ð*ð ð	*ð
 ð*ð ð*ð ð*ð 
ô*ðX;"à˜Ñ%ð;"ð ! Ñ-ð;"ð +ð	;"ð
 
ˆkÑ	ô;"ðz8Ø˜{Ñ+ð8Ø4Oð8à	ô8ð6EØ˜+Ñ&ðEØ/JðEà	ôEðØ˜+Ñ&ðØ/Jðà	ˆc‰ôð$ØðØ# D™zðØ2Mðà	ôð$àðð �C‰yðð �d‘ð	ð
 +ðð 
ôð> ðØ˜KÑ(ðà	ˆc�4˜‘9ˆnÑ	óó ððB ð%Øð%à˜˜T #™Y˜Ñ'ð%ð �c˜3�h‘ð%ð �#‰hð	%ð
 
ˆc�3ˆh‰ó%ó ð%ðNLØ! +Ñ.ðLà	ˆc�4˜‘9ˆnÑ	ôLð Ø! +Ñ.ðà	ˆc�4˜‘9ˆnÑ	÷r)   re   ))r­   Úloggingr_   rš   Údataclassesr   r   Ú	itertoolsr   r   Útypingr   r   r	   r
   r   Údocling_core.types.doc.baser   r   Údocling_core.types.doc.documentr   Údocling_core.types.doc.labelsr   Úrtreer   rÃ   Ú	getLoggerr8   ró   r   rC   r“   r”   ÚCODErR   r@   rS   rV   r<   rc   re   r7   r)   r&   Ú<module>r6     sÖ   ðó Û Û Û 	ß (ß 'ß 3Õ 3ç 9Ý 3Ý 6Ý &à×Ò˜Ó"€ô'�+ô 'ð: ÷3ð 3ó ð3ð ×$Ñ$ l×&:Ñ&:¸L×<MÑ<MÐN€ð+˜ð +¨ô +ð2˜8 KÑ0ð 2°T¸+Ñ5Fô 2ð

˜;ð 
¨[ð 
¸Uô 
÷K
ò K
r)   